OOAD - Estrategias de implementación
La implementación de un diseño orientado a objetos generalmente implica el uso de un lenguaje de programación orientado a objetos estándar (OOPL) o la asignación de diseños de objetos a bases de datos. En la mayoría de los casos, involucra a ambos.
Implementación mediante lenguajes de programación
Por lo general, la tarea de transformar el diseño de un objeto en código es un proceso sencillo. Cualquier lenguaje de programación orientado a objetos como C ++, Java, Smalltalk, C # y Python, incluye provisión para representar clases. En este capítulo, ejemplificamos el concepto usando C ++.
La siguiente figura muestra la representación de la clase Circle usando C ++.
Implementación de asociaciones
La mayoría de los lenguajes de programación no proporcionan construcciones para implementar asociaciones directamente. Por tanto, la tarea de implementar asociaciones requiere una reflexión considerable.
Las asociaciones pueden ser unidireccionales o bidireccionales. Además, cada asociación puede ser de uno a uno, de uno a muchos o de muchos a muchos.
Asociaciones unidireccionales
Para implementar asociaciones unidireccionales, se debe tener cuidado de que se mantenga la unidireccionalidad. Las implementaciones para diferentes multiplicidades son las siguientes:
Optional Associations- Aquí, un vínculo puede existir o no entre los objetos participantes. Por ejemplo, en la asociación entre Cliente y Cuenta corriente en la figura siguiente, un cliente puede tener o no una cuenta corriente.
Para la implementación, un objeto de Cuenta Corriente se incluye como un atributo en Cliente que puede ser NULO. Implementación usando C ++ -
class Customer {
private:
// attributes
Current_Account c; //an object of Current_Account as attribute
public:
Customer() {
c = NULL;
} // assign c as NULL
Current_Account getCurrAc() {
return c;
}
void setCurrAc( Current_Account myacc) {
c = myacc;
}
void removeAcc() {
c = NULL;
}
};
One–to–one Associations- Aquí, una instancia de una clase está relacionada exactamente con una instancia de la clase asociada. Por ejemplo, el Departamento y el Gerente tienen una asociación uno a uno, como se muestra en la figura siguiente.
Esto se implementa al incluir en Departamento, un objeto de Administrador que no debe ser NULO. Implementación usando C ++ -
class Department {
private:
// attributes
Manager mgr; //an object of Manager as attribute
public:
Department (/*parameters*/, Manager m) { //m is not NULL
// assign parameters to variables
mgr = m;
}
Manager getMgr() {
return mgr;
}
};
One–to–many Associations- Aquí, una instancia de una clase está relacionada con más de una instancia de la clase asociada. Por ejemplo, considere la asociación entre Empleado y Dependiente en la siguiente figura.
Esto se implementa al incluir una lista de dependientes en la clase Empleado. Implementación usando el contenedor de listas C ++ STL -
class Employee {
private:
char * deptName;
list <Dependent> dep; //a list of Dependents as attribute
public:
void addDependent ( Dependent d) {
dep.push_back(d);
} // adds an employee to the department
void removeDeoendent( Dependent d) {
int index = find ( d, dep );
// find() function returns the index of d in list dep
dep.erase(index);
}
};
Asociaciones bidireccionales
Para implementar la asociación bidireccional, es necesario mantener los enlaces en ambas direcciones.
Optional or one–to–one Associations - Considere la relación entre el Proyecto y el Gerente de Proyecto teniendo una asociación bidireccional uno a uno como se muestra en la figura siguiente.
Implementación usando C ++ -
Class Project {
private:
// attributes
Project_Manager pmgr;
public:
void setManager ( Project_Manager pm);
Project_Manager changeManager();
};
class Project_Manager {
private:
// attributes
Project pj;
public:
void setProject(Project p);
Project removeProject();
};
One–to–many Associations - Considere la relación entre el Departamento y el Empleado que tiene una asociación de uno a varios, como se muestra en la figura siguiente.
Implementación usando el contenedor de listas STL de C ++
class Department {
private:
char * deptName;
list <Employee> emp; //a list of Employees as attribute
public:
void addEmployee ( Employee e) {
emp.push_back(e);
} // adds an employee to the department
void removeEmployee( Employee e) {
int index = find ( e, emp );
// find function returns the index of e in list emp
emp.erase(index);
}
};
class Employee {
private:
//attributes
Department d;
public:
void addDept();
void removeDept();
};
Implementar asociaciones como clases
Si una asociación tiene algunos atributos asociados, debe implementarse usando una clase separada. Por ejemplo, considere la asociación uno a uno entre Empleado y Proyecto como se muestra en la figura siguiente.
Implementación de WorksOn usando C ++
class WorksOn {
private:
Employee e;
Project p;
Hours h;
char * date;
public:
// class methods
};
Implementación de restricciones
Las restricciones en las clases restringen el rango y el tipo de valores que pueden tomar los atributos. Para implementar restricciones, se asigna un valor predeterminado válido al atributo cuando se crea una instancia de un objeto desde la clase. Siempre que se cambia el valor en tiempo de ejecución, se comprueba si el valor es válido o no. Un valor no válido puede ser manejado por una rutina de manejo de excepciones u otros métodos.
Example
Considere una clase de Empleado donde la edad es un atributo que puede tener valores en el rango de 18 a 60. El siguiente código C ++ lo incorpora:
class Employee {
private: char * name;
int age;
// other attributes
public:
Employee() { // default constructor
strcpy(name, "");
age = 18; // default value
}
class AgeError {}; // Exception class
void changeAge( int a) { // method that changes age
if ( a < 18 || a > 60 ) // check for invalid condition
throw AgeError(); // throw exception
age = a;
}
};
Implementación de gráficos de estado
Hay dos estrategias de implementación alternativas para implementar estados en diagramas de gráficos de estados.
Enumeraciones dentro de la clase
En este enfoque, los estados están representados por diferentes valores de un miembro de datos (o conjunto de miembros de datos). Los valores se definen explícitamente mediante una enumeración dentro de la clase. Las transiciones están representadas por funciones miembro que cambian el valor del miembro de datos en cuestión.
Disposición de clases en una jerarquía de generalización
En este enfoque, los estados se organizan en una jerarquía de generalización de manera que puedan ser referidos por una variable de puntero común. La siguiente figura muestra una transformación de un diagrama de diagrama de estado a una jerarquía de generalización.
Asignación de objetos al sistema de base de datos
Persistencia de los objetos
Un aspecto importante del desarrollo de sistemas orientados a objetos es la persistencia de los datos. A través de la persistencia, los objetos tienen una vida útil más larga que el programa que los creó. Los datos persistentes se guardan en un medio de almacenamiento secundario desde donde se pueden recargar cuando sea necesario.
Descripción general de RDBMS
Una base de datos es una colección ordenada de datos relacionados.
Un sistema de administración de bases de datos (DBMS) es una colección de software que facilita los procesos de definir, crear, almacenar, manipular, recuperar, compartir y eliminar datos en bases de datos.
En los sistemas de administración de bases de datos relacionales (RDBMS), los datos se almacenan como relaciones o tablas, donde cada columna o campo representa un atributo y cada fila o tupla representa un registro de una instancia.
Cada fila se identifica de forma única por un conjunto elegido de atributos mínimos llamados primary key.
UN foreign key es un atributo que es la clave principal de una tabla relacionada.
Representar clases como tablas en RDBMS
Para asignar una clase a una tabla de base de datos, cada atributo se representa como un campo en la tabla. Se asigna un atributo existente como clave principal o se agrega un campo de ID separado como clave principal. La clase puede dividirse horizontal o verticalmente según los requisitos.
Por ejemplo, la clase Circle se puede convertir en una tabla como se muestra en la siguiente figura.
Schema for Circle Table: CIRCLE(CID, X_COORD, Y_COORD, RADIUS, COLOR)
Creating a Table Circle using SQL command:
CREATE TABLE CIRCLE (
CID VARCHAR2(4) PRIMARY KEY,
X_COORD INTEGER NOT NULL,
Y_COORD INTEGER NOT NULL,
Z_COORD INTEGER NOT NULL,
COLOR
);
Asignación de asociaciones a tablas de bases de datos
Asociaciones uno a uno
Para implementar asociaciones 1: 1, la clave principal de cualquier tabla se asigna como clave externa de la otra tabla. Por ejemplo, considere la asociación entre Departamento y Gerente:
Comandos SQL para crear las tablas
CREATE TABLE DEPARTMENT (
DEPT_ID INTEGER PRIMARY KEY,
DNAME VARCHAR2(30) NOT NULL,
LOCATION VARCHAR2(20),
EMPID INTEGER REFERENCES MANAGER
);
CREATE TABLE MANAGER (
EMPID INTEGER PRIMARY KEY,
ENAME VARCHAR2(50) NOT NULL,
ADDRESS VARCHAR2(70),
);
Asociaciones de uno a varios
Para implementar asociaciones 1: N, la clave principal de la tabla en el lado 1 de la asociación se asigna como la clave externa de la tabla en el lado N de la asociación. Por ejemplo, considere la asociación entre Departamento y Empleado:
Comandos SQL para crear las tablas
CREATE TABLE DEPARTMENT (
DEPT_ID INTEGER PRIMARY KEY,
DNAME VARCHAR2(30) NOT NULL,
LOCATION VARCHAR2(20),
);
CREATE TABLE EMPLOYEE (
EMPID INTEGER PRIMARY KEY,
ENAME VARCHAR2(50) NOT NULL,
ADDRESS VARCHAR2(70),
D_ID INTEGER REFERENCES DEPARTMENT
);
Asociaciones de muchas a muchas
Para implementar asociaciones M: N, se crea una nueva relación que representa la asociación. Por ejemplo, considere la siguiente asociación entre Empleado y Proyecto:
Schema for Works_On Table - WORKS_ON (EMPID, PID, HOURS, START_DATE)
SQL command to create Works_On association - CREAR TABLA WORKS_ON
(
EMPID INTEGER,
PID INTEGER,
HOURS INTEGER,
START_DATE DATE,
PRIMARY KEY (EMPID, PID),
FOREIGN KEY (EMPID) REFERENCES EMPLOYEE,
FOREIGN KEY (PID) REFERENCES PROJECT
);
Asignación de herencia a tablas
Para mapear la herencia, la clave principal de las tablas base se asigna como clave principal, así como la clave externa en las tablas derivadas.
Example