OOAD - Strategie wdrożeniowe
Wdrażanie projektu zorientowanego obiektowo zazwyczaj wymaga użycia standardowego języka programowania obiektowego (OOPL) lub odwzorowania projektów obiektowych na bazy danych. W większości przypadków dotyczy obu.
Wdrażanie z wykorzystaniem języków programowania
Zwykle zadanie przekształcenia projektu obiektu w kod jest prostym procesem. Dowolny obiektowy język programowania, taki jak C ++, Java, Smalltalk, C # i Python, obejmuje możliwość reprezentowania klas. W tym rozdziale zilustrujemy tę koncepcję w C ++.
Poniższy rysunek przedstawia reprezentację klasy Circle w języku C ++.
Wdrażanie skojarzeń
Większość języków programowania nie udostępnia konstrukcji do bezpośredniej implementacji asocjacji. Dlatego zadanie tworzenia stowarzyszeń wymaga poważnego przemyślenia.
Skojarzenia mogą być jednokierunkowe lub dwukierunkowe. Poza tym każda asocjacja może mieć charakter jeden do jednego, jeden do wielu lub wiele do wielu.
Skojarzenia jednokierunkowe
Przy wdrażaniu skojarzeń jednokierunkowych należy zachować ostrożność, aby zachować jednokierunkowość. Implementacje dla różnych liczebności są następujące -
Optional Associations- Tutaj może istnieć łącze między uczestniczącymi obiektami. Na przykład w powiązaniu między klientem a rachunkiem bieżącym na poniższym rysunku klient może mieć lub nie mieć rachunku bieżącego.
W celu wdrożenia obiekt rachunku bieżącego jest dołączany jako atrybut w kliencie, który może mieć wartość NULL. Implementacja w 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- W tym przypadku jedno wystąpienie klasy jest powiązane z dokładnie jednym wystąpieniem skojarzonej klasy. Na przykład dział i menedżer mają powiązania jeden do jednego, jak pokazano na poniższym rysunku.
Jest to realizowane przez włączenie do działu obiektu menedżera, który nie powinien mieć wartości NULL. Implementacja w 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- W tym przypadku jedno wystąpienie klasy jest powiązane z więcej niż jednym wystąpieniem skojarzonej klasy. Na przykład rozważmy powiązanie między pracownikiem a zależnym na poniższym rysunku.
Jest to realizowane poprzez dołączenie listy osób na utrzymaniu do klasy Pracownik. Implementacja za pomocą kontenera listy 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);
}
};
Stowarzyszenia dwukierunkowe
Aby zaimplementować asocjację dwukierunkową, należy zachować połączenia w obu kierunkach.
Optional or one–to–one Associations - Rozważ relację między Projektem i Kierownikiem Projektu, która ma dwukierunkowe powiązanie jeden do jednego, jak pokazano na poniższym rysunku.
Implementacja w 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 - Rozważ relację między działem a pracownikiem mającą związek jeden do wielu, jak pokazano na poniższym rysunku.
Implementacja z wykorzystaniem kontenera listy C ++ STL
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();
};
Wdrażanie asocjacji jako klas
Jeśli asocjacja ma powiązane atrybuty, powinna zostać zaimplementowana przy użyciu oddzielnej klasy. Na przykład rozważmy powiązanie jeden do jednego między pracownikiem a projektem, jak pokazano na poniższym rysunku.
Implementacja WorksOn w C ++
class WorksOn {
private:
Employee e;
Project p;
Hours h;
char * date;
public:
// class methods
};
Wdrażanie ograniczeń
Ograniczenia w klasach ograniczają zakres i typ wartości, które mogą przyjmować atrybuty. Aby zaimplementować ograniczenia, do atrybutu przypisywana jest prawidłowa wartość domyślna, gdy obiekt jest tworzony z klasy. Za każdym razem, gdy wartość jest zmieniana w czasie wykonywania, sprawdzane jest, czy wartość jest prawidłowa, czy nie. Nieprawidłowa wartość może być obsługiwana przez procedurę obsługi wyjątków lub inne metody.
Example
Rozważmy klasę Employee, w której wiek jest atrybutem, który może mieć wartości z zakresu od 18 do 60. Poniższy kod C ++ zawiera go -
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;
}
};
Implementowanie wykresów stanu
Istnieją dwie alternatywne strategie implementacji stanów na diagramach wykresów stanów.
Wyliczenia w ramach klasy
W tym podejściu stany są reprezentowane przez różne wartości członka danych (lub zestawu członków danych). Wartości są jawnie definiowane przez wyliczenie w klasie. Przejścia są reprezentowane przez funkcje składowe, które zmieniają wartość danego elementu członkowskiego danych.
Układ klas w hierarchii uogólnień
W tym podejściu stany są uporządkowane w hierarchii uogólnień w sposób umożliwiający odniesienie do wspólnej zmiennej wskaźnikowej. Poniższy rysunek przedstawia transformację z diagramu wykresu stanu do hierarchii uogólnień.
Mapowanie obiektów do systemu baz danych
Trwałość obiektów
Ważnym aspektem tworzenia systemów obiektowych jest trwałość danych. Dzięki trwałości obiekty mają dłuższą żywotność niż program, który je utworzył. Trwałe dane są zapisywane na dodatkowym nośniku pamięci, skąd można je ponownie załadować w razie potrzeby.
Przegląd RDBMS
Baza danych to uporządkowany zbiór powiązanych danych.
System zarządzania bazą danych (DBMS) to zbiór oprogramowania, który ułatwia procesy definiowania, tworzenia, przechowywania, manipulowania, pobierania, udostępniania i usuwania danych w bazach danych.
W systemach zarządzania relacyjnymi bazami danych (RDBMS) dane są przechowywane jako relacje lub tabele, w których każda kolumna lub pole reprezentuje atrybut, a każdy wiersz lub krotka reprezentuje rekord instancji.
Każdy wiersz jest jednoznacznie identyfikowany przez wybrany zestaw minimalnych atrybutów o nazwie primary key.
ZA foreign key to atrybut będący kluczem podstawowym powiązanej tabeli.
Reprezentowanie klas jako tabel w RDBMS
Aby odwzorować klasę na tabelę bazy danych, każdy atrybut jest reprezentowany jako pole w tabeli. Istniejące atrybuty są przypisywane jako klucz podstawowy lub oddzielne pole identyfikatora jest dodawane jako klucz podstawowy. Klasa może być podzielona poziomo lub pionowo, zgodnie z wymaganiami.
Na przykład klasę Circle można przekonwertować na tabelę, jak pokazano na poniższym rysunku.
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
);
Mapowanie skojarzeń do tabel bazy danych
Powiązania jeden do jednego
Aby zaimplementować asocjacje 1: 1, klucz podstawowy dowolnej tabeli jest przypisywany jako klucz obcy drugiej tabeli. Na przykład rozważ powiązanie między działem a kierownikiem -
Polecenia SQL do tworzenia tabel
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),
);
Skojarzenia typu jeden do wielu
Aby zaimplementować asocjacje 1: N, klucz podstawowy tabeli po stronie 1 asocjacji jest przypisywany jako klucz obcy tabeli po stronie N asocjacji. Weźmy na przykład pod uwagę związek między działem a pracownikiem -
Polecenia SQL do tworzenia tabel
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
);
Stowarzyszenia wiele do wielu
Aby zaimplementować skojarzenia M: N, tworzona jest nowa relacja reprezentująca skojarzenie. Weźmy na przykład pod uwagę następujące powiązanie między pracownikiem a projektem -
Schema for Works_On Table - WORKS_ON (EMPID, PID, HOURS, START_DATE)
SQL command to create Works_On association - UTWÓRZ TABELĘ 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
);
Odwzorowanie dziedziczenia na tabele
Aby odwzorować dziedziczenie, klucz podstawowy tabel podstawowych jest przypisywany jako klucz podstawowy, a także klucz obcy w tabelach pochodnych.
Example