OOAD - Chiến lược thực hiện

Thực hiện một thiết kế hướng đối tượng thường liên quan đến việc sử dụng một ngôn ngữ lập trình hướng đối tượng tiêu chuẩn (OOPL) hoặc ánh xạ các thiết kế đối tượng với cơ sở dữ liệu. Trong hầu hết các trường hợp, nó liên quan đến cả hai.

Triển khai bằng ngôn ngữ lập trình

Thông thường, nhiệm vụ chuyển đổi một thiết kế đối tượng thành mã là một quá trình đơn giản. Bất kỳ ngôn ngữ lập trình hướng đối tượng nào như C ++, Java, Smalltalk, C # và Python, đều bao gồm cung cấp cho các lớp đại diện. Trong chương này, chúng tôi minh họa khái niệm sử dụng C ++.

Hình dưới đây cho thấy biểu diễn của lớp Circle sử dụng C ++.

Hiệp hội thực hiện

Hầu hết các ngôn ngữ lập trình không cung cấp các cấu trúc để thực hiện các liên kết trực tiếp. Vì vậy nhiệm vụ triển khai các hiệp hội cần được suy nghĩ đáng kể.

Các liên kết có thể là một chiều hoặc hai chiều. Bên cạnh đó, mỗi liên kết có thể là một - một, một - nhiều, hoặc nhiều - nhiều.

Hiệp hội đơn hướng

Đối với việc triển khai các liên kết đơn hướng, cần cẩn thận để duy trì tính đơn hướng. Cách triển khai cho các tính đa dạng khác nhau như sau:

  • Optional Associations- Ở đây, một liên kết có thể tồn tại hoặc không giữa các đối tượng tham gia. Ví dụ, trong sự liên kết giữa Khách hàng và Tài khoản Hiện tại trong hình bên dưới, khách hàng có thể có hoặc không có tài khoản vãng lai.

Để triển khai, một đối tượng của Tài khoản Hiện tại được bao gồm dưới dạng một thuộc tính trong Khách hàng có thể là NULL. Thực hiện bằng 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- Ở đây, một thể hiện của một lớp có liên quan đến chính xác một thể hiện của lớp được liên kết. Ví dụ: Bộ phận và Người quản lý có liên kết 1-1 như thể hiện trong hình bên dưới.

Điều này được thực hiện bằng cách bao gồm trong Bộ phận, một đối tượng của Người quản lý không được NULL. Thực hiện bằng 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- Ở đây, một thể hiện của một lớp có liên quan đến nhiều hơn một thể hiện của lớp được liên kết. Ví dụ, hãy xem xét mối quan hệ giữa Nhân viên và Người phụ thuộc trong hình sau.

Điều này được thực hiện bằng cách bao gồm một danh sách Người phụ thuộc trong lớp Nhân viên. Triển khai sử dụng vùng chứa danh sách STL C ++ -

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);
   }               
};

Hiệp hội hai hướng

Để thực hiện liên kết hai hướng, các liên kết theo cả hai hướng cần được duy trì.

  • Optional or one–to–one Associations - Xem xét mối quan hệ giữa Dự án và Quản lý dự án có mối liên kết hai chiều một đối một như thể hiện trong hình bên dưới.

Thực hiện bằng 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 - Xem xét mối quan hệ giữa Bộ phận và Nhân viên có sự liên kết từ một đến nhiều như thể hiện trong hình bên dưới.

Triển khai sử dụng vùng chứa danh sách STL 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();
};

Triển khai liên kết dưới dạng lớp học

Nếu một liên kết có một số thuộc tính được liên kết, nó nên được triển khai bằng một lớp riêng biệt. Ví dụ, hãy xem xét mối quan hệ 1-1 giữa Nhân viên và Dự án như thể hiện trong hình bên dưới.

Triển khai WorksOn bằng C ++

class WorksOn {
   private:
   Employee e; 
   Project p;
   Hours h;
   char * date;

   public:
   // class methods
};

Các ràng buộc thực hiện

Các ràng buộc trong các lớp hạn chế phạm vi và loại giá trị mà các thuộc tính có thể nhận. Để thực hiện các ràng buộc, một giá trị mặc định hợp lệ được gán cho thuộc tính khi một đối tượng được khởi tạo từ lớp. Bất cứ khi nào giá trị được thay đổi trong thời gian chạy, nó sẽ được kiểm tra xem giá trị đó có hợp lệ hay không. Giá trị không hợp lệ có thể được xử lý bằng quy trình xử lý ngoại lệ hoặc các phương pháp khác.

Example

Hãy xem xét một lớp Nhân viên trong đó tuổi là một thuộc tính có thể có các giá trị trong phạm vi từ 18 đến 60. Đoạn mã C ++ sau kết hợp nó:

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;			
   }
};

Thực hiện Biểu đồ Tiểu bang

Có hai chiến lược thực hiện thay thế để thực hiện các trạng thái trong sơ đồ biểu đồ trạng thái.

Danh sách trong lớp

Trong cách tiếp cận này, các trạng thái được biểu diễn bằng các giá trị khác nhau của một thành viên dữ liệu (hoặc tập hợp các thành viên dữ liệu). Các giá trị được xác định rõ ràng bởi một kiểu liệt kê trong lớp. Các chuyển đổi được biểu diễn bằng các hàm thành viên thay đổi giá trị của thành viên dữ liệu liên quan.

Sắp xếp các lớp trong một hệ thống phân cấp tổng quát

Trong cách tiếp cận này, các trạng thái được sắp xếp theo hệ thống phân cấp tổng quát hóa theo cách mà chúng có thể được tham chiếu bởi một biến con trỏ chung. Hình dưới đây cho thấy một sự chuyển đổi từ biểu đồ trạng thái sang biểu đồ phân cấp tổng quát.

Ánh xạ đối tượng tới hệ thống cơ sở dữ liệu

Tính bền của đối tượng

Một khía cạnh quan trọng của việc phát triển hệ thống hướng đối tượng là tính bền bỉ của dữ liệu. Thông qua sự bền bỉ, các đối tượng có tuổi thọ dài hơn chương trình đã tạo ra nó. Dữ liệu liên tục được lưu trên phương tiện lưu trữ thứ cấp, từ đó nó có thể được tải lại khi cần thiết.

Tổng quan về RDBMS

Cơ sở dữ liệu là một tập hợp dữ liệu liên quan có thứ tự.

Hệ quản trị cơ sở dữ liệu (DBMS) là một tập hợp các phần mềm hỗ trợ quá trình xác định, tạo, lưu trữ, thao tác, truy xuất, chia sẻ và loại bỏ dữ liệu trong cơ sở dữ liệu.

Trong hệ quản trị cơ sở dữ liệu quan hệ (RDBMS), dữ liệu được lưu trữ dưới dạng quan hệ hoặc bảng, trong đó mỗi cột hoặc trường đại diện cho một thuộc tính và mỗi hàng hoặc bộ đại diện cho một bản ghi của một cá thể.

Mỗi hàng được xác định duy nhất bởi một tập hợp các thuộc tính tối thiểu đã chọn được gọi là primary key.

A foreign key là một thuộc tính là khóa chính của một bảng có liên quan.

Biểu diễn các lớp dưới dạng bảng trong RDBMS

Để ánh xạ một lớp vào một bảng cơ sở dữ liệu, mỗi thuộc tính được biểu diễn dưới dạng một trường trong bảng. Một (các) thuộc tính hiện có được chỉ định làm khóa chính hoặc một trường ID riêng biệt được thêm làm khóa chính. Lớp có thể được phân vùng theo chiều ngang hoặc chiều dọc theo yêu cầu.

Ví dụ, lớp Circle có thể được chuyển đổi thành bảng như trong hình bên dưới.

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 
);

Ánh xạ các liên kết đến các bảng cơ sở dữ liệu

Hiệp hội một-một

Để triển khai liên kết 1: 1, khóa chính của bất kỳ bảng nào được gán làm khóa ngoại của bảng khác. Ví dụ: hãy xem xét mối quan hệ giữa Bộ phận và Người quản lý -

Các lệnh SQL để tạo bảng

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),
);

Một đến nhiều Hiệp hội

Để thực hiện liên kết 1: N, khóa chính của bảng trong 1 phía của liên kết được gán làm khóa ngoại của bảng ở phía N của liên kết. Ví dụ, hãy xem xét mối quan hệ giữa Bộ phận và Nhân viên -

Các lệnh SQL để tạo bảng

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
);

Nhiều-đến-Nhiều Hiệp hội

Để thực hiện các liên kết M: N, một quan hệ mới được tạo ra đại diện cho liên kết. Ví dụ, hãy xem xét mối liên hệ sau giữa Nhân viên và Dự án -

Schema for Works_On Table - WORKS_ON (EMPID, PID, HOURS, START_DATE)

SQL command to create Works_On association - TẠO BẢNG 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 
);

Ánh xạ kế thừa cho bảng

Để ánh xạ kế thừa, khóa chính của (các) bảng cơ sở được chỉ định làm khóa chính cũng như khóa ngoại trong (các) bảng dẫn xuất.

Example