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