OOAD - Uygulama Stratejileri
Nesneye yönelik bir tasarımın uygulanması genellikle standart bir nesne yönelimli programlama dili (OOPL) kullanmayı veya nesne tasarımlarını veritabanlarına eşlemeyi içerir. Çoğu durumda her ikisini de içerir.
Programlama Dillerini Kullanarak Uygulama
Genellikle, bir nesne tasarımını koda dönüştürme görevi basit bir süreçtir. C ++, Java, Smalltalk, C # ve Python gibi herhangi bir nesne yönelimli programlama dili, sınıfları temsil etmek için hüküm içerir. Bu bölümde, C ++ kullanan kavramı örnekleyeceğiz.
Aşağıdaki şekil Circle sınıfının C ++ kullanılarak temsilini göstermektedir.
Uygulama Birlikleri
Çoğu programlama dili, ilişkilendirmeleri doğrudan uygulamak için yapılar sağlamaz. Bu nedenle, dernekleri uygulama görevi önemli ölçüde düşünülmelidir.
Dernekler tek yönlü veya çift yönlü olabilir. Ayrıca, her ilişki bire bir, bire çok veya çoktan çoğa olabilir.
Tek Yönlü Dernekler
Tek yönlü ilişkilerin uygulanması için, tek yönlülüğün muhafaza edilmesi için özen gösterilmelidir. Farklı çokluk için uygulamalar aşağıdaki gibidir -
Optional Associations- Burada, katılan nesneler arasında bir bağlantı olabilir veya olmayabilir. Örneğin aşağıdaki şekilde Müşteri ile Cari Hesap arasındaki ilişkide bir müşterinin cari hesabı olabilir veya olmayabilir.
Uygulama için, Müşteri'ye NULL olabilecek bir öznitelik olarak Cari Hesap nesnesi eklenir. C ++ kullanarak uygulama -
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- Burada, bir sınıfın bir örneği, ilişkili sınıfın tam olarak bir örneği ile ilgilidir. Örneğin, Departman ve Müdür aşağıdaki şekilde gösterildiği gibi bire bir ilişkiye sahiptir.
Bu, NULL olmaması gereken bir Yönetici nesnesi olan Departmana dahil edilerek uygulanır. C ++ kullanarak uygulama -
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- Burada, bir sınıfın bir örneği, ilişkili sınıfın birden fazla örneğiyle ilişkilidir. Örneğin, aşağıdaki şekilde Çalışan ve Bağımlı arasındaki ilişkiyi düşünün.
Bu, Çalışan sınıfına Bağımlıların bir listesi eklenerek uygulanır. C ++ STL liste kapsayıcısı kullanarak uygulama -
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);
}
};
Çift Yönlü Dernekler
İki yönlü ilişkilendirmeyi uygulamak için, her iki yöndeki bağlantıların sürdürülmesi gerekir.
Optional or one–to–one Associations - Aşağıdaki şekilde gösterildiği gibi, Proje ile bire bir çift yönlü ilişkiye sahip Proje Yöneticisi arasındaki ilişkiyi düşünün.
C ++ kullanarak uygulama -
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 - Aşağıdaki şekilde gösterildiği gibi, Departman ve Çalışan arasındaki bire çok ilişkisi olan ilişkiyi düşünün.
C ++ STL liste kapsayıcısı kullanarak uygulama
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();
};
İlişkilendirmeleri Sınıflar Olarak Uygulama
Bir ilişkinin ilişkili bazı öznitelikleri varsa, ayrı bir sınıf kullanılarak uygulanmalıdır. Örneğin, aşağıdaki şekilde gösterildiği gibi Çalışan ve Proje arasındaki bire bir ilişkiyi düşünün.
WorksOn'un C ++ kullanarak uygulanması
class WorksOn {
private:
Employee e;
Project p;
Hours h;
char * date;
public:
// class methods
};
Kısıtlamaları Uygulama
Sınıflardaki kısıtlamalar, özniteliklerin alabileceği değerlerin aralığını ve türünü kısıtlar. Kısıtlamaları uygulamak için, sınıftan bir nesne başlatıldığında özniteliğe geçerli bir varsayılan değer atanır. Çalışma zamanında değer değiştirildiğinde, değerin geçerli olup olmadığı kontrol edilir. Geçersiz bir değer, bir istisna işleme rutini veya diğer yöntemlerle işlenebilir.
Example
Yaşın 18 ila 60 aralığında değerlere sahip olabilen bir öznitelik olduğu bir Çalışan sınıfını düşünün. Aşağıdaki C ++ kodu bunu içerir -
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;
}
};
Durum Grafiklerinin Uygulanması
Durum grafiği diyagramlarında durumları uygulamak için iki alternatif uygulama stratejisi vardır.
Sınıf içi numaralandırmalar
Bu yaklaşımda, durumlar bir veri üyesinin (veya veri üyeleri kümesinin) farklı değerleri ile temsil edilir. Değerler, sınıf içindeki bir numaralandırma ile açıkça tanımlanır. Geçişler, ilgili veri üyesinin değerini değiştiren üye işlevlerle temsil edilir.
Bir Genelleme Hiyerarşisinde Sınıfların Düzenlenmesi
Bu yaklaşımda durumlar, ortak bir işaretçi değişkeni ile başvurulabilecek şekilde bir genelleme hiyerarşisi içinde düzenlenir. Aşağıdaki şekil, durum tablosu diyagramından genelleme hiyerarşisine bir dönüşümü göstermektedir.
Veritabanı Sistemine Nesne Eşleştirme
Nesnelerin Kalıcılığı
Nesneye yönelik sistemler geliştirmenin önemli bir yönü, verilerin kalıcılığıdır. Kalıcılık sayesinde nesnelerin, onu oluşturan programdan daha uzun ömrü vardır. Kalıcı veriler, gerektiğinde yeniden yüklenebilecekleri ikincil depolama ortamına kaydedilir.
RDBMS'ye Genel Bakış
Veritabanı, ilgili verilerin sıralı bir koleksiyonudur.
Veritabanı yönetim sistemi (DBMS), veritabanlarındaki verileri tanımlama, oluşturma, depolama, kullanma, geri alma, paylaşma ve kaldırma süreçlerini kolaylaştıran bir yazılım koleksiyonudur.
İlişkisel veritabanı yönetim sistemlerinde (RDBMS) veriler, her sütun veya alanın bir özniteliği ve her satır veya demet bir örneğin kaydını temsil ettiği ilişkiler veya tablolar olarak depolanır.
Her satır, adı verilen seçilmiş bir minimum öznitelik kümesiyle benzersiz bir şekilde tanımlanır primary key.
Bir foreign key ilgili tablonun birincil anahtarı olan bir özelliktir.
Sınıfları RDBMS'de Tablolar Olarak Gösterme
Bir sınıfı bir veritabanı tablosuna eşlemek için, her özellik tabloda bir alan olarak temsil edilir. Mevcut öznitelik (ler) birincil anahtar olarak atanır veya ayrı bir kimlik alanı birincil anahtar olarak eklenir. Sınıf, ihtiyaca göre yatay veya dikey olarak bölünebilir.
Örneğin, Circle sınıfı aşağıdaki şekilde gösterildiği gibi tabloya dönüştürülebilir.
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
);
İlişkilendirmeleri Veritabanı Tablolarıyla Eşleme
Bire Bir Dernekler
1: 1 ilişkileri uygulamak için, herhangi bir tablonun birincil anahtarı diğer tablonun yabancı anahtarı olarak atanır. Örneğin, Departman ve Müdür arasındaki ilişkiyi düşünün -
Tabloları oluşturmak için SQL komutları
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),
);
Bire Çok Dernek
1: N ilişkilendirmelerini uygulamak için, ilişkilendirmenin 1 tarafındaki tablonun birincil anahtarı, ilişkilendirmenin N tarafındaki tablonun yabancı anahtarı olarak atanır. Örneğin, Departman ve Çalışan arasındaki ilişkiyi düşünün -
Tabloları oluşturmak için SQL komutları
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
);
Çoktan Çoğa Dernekler
M: N ilişkilerini uygulamak için, ilişkiyi temsil eden yeni bir ilişki oluşturulur. Örneğin, Çalışan ve Proje arasındaki şu ilişkiyi düşünün:
Schema for Works_On Table - WORKS_ON (EMPID, PID, HOURS, START_DATE)
SQL command to create Works_On association - TABLO İŞLERİ OLUŞTUR_ON
(
EMPID INTEGER,
PID INTEGER,
HOURS INTEGER,
START_DATE DATE,
PRIMARY KEY (EMPID, PID),
FOREIGN KEY (EMPID) REFERENCES EMPLOYEE,
FOREIGN KEY (PID) REFERENCES PROJECT
);
Devralmayı Tablolarla Eşleme
Kalıtımı eşlemek için, temel tabloların birincil anahtarı, türetilmiş tablo (lar) da birincil anahtar ve yabancı anahtar olarak atanır.
Example