24/05/2018, 17:11

Các mối quan hệ giữa các lớp

Một liên kết là một sự kết nối vật lý hoặc logic giữa các đối tượng với nhau. Phần lớn các liên kết là sự kết nối giữa hai đối tượng với nhau. Tuy nhiên cũng có những liên kết giữa ba hoặc nhiều hơn ba đối tượng. Nhưng các ngôn ngữ lập trình ...

Một liên kết là một sự kết nối vật lý hoặc logic giữa các đối tượng với nhau. Phần lớn các liên kết là sự kết nối giữa hai đối tượng với nhau. Tuy nhiên cũng có những liên kết giữa ba hoặc nhiều hơn ba đối tượng. Nhưng các ngôn ngữ lập trình hiện nay hầu như chỉ cài đặt những liên kết (phép toán) nhiều nhất là ba ngôi.

Một sự kết hợp là một mô tả về một nhóm các liên kết có chung cấu trúc và ngữ nghĩa như nhau. Vậy, liên kết là một thể hiện của lớp. Liên kết và kết hợp thường xuất hiện ở dạng các động từ trong các tài liệu mô tả bài toán ứng dụng.

Hình 1 mô tả các ký hiệu cho quan hệ liên kết và kết hợp

Liên kết giữa các đối tượng

Hai đối tượng thuộc lớp SanBay: Nội BàiGia Lâm cùng liên kết với đối tượng Hà Nội của lớp TinhThanh theo quan hệ phục vụ. Quan hệ liên kết giữa hai đối tượng được biểu diễn bằng đoạn thẳng nối chúng với nhau và có tên gọi nhãn của quan hệ). Nhãn của các quan hệ thường là các động từ. Khi muốn biểu diễn cho quan hệ một chiều thì sử dụng mũi tên để chỉ rõ hướng của quan hệ.

Quan hệ kết hợp giữa các lớp

Khi mô hình không có sự nhập nhằng thì tên của quan hệ kết hợp là tuỳ chọn. Sự nhập nhằng sẽ xuất hiện khi giữa hai lớp có nhiều quan hệ kết hợp,

Giữa lớp NhanVien và lớp CongTy có hai quan hệ làm việc ở và có cổ phần trong. Khi có nhiều quan hệ như thế thì nên gán tên vào mỗi đường nối hoặc tên của vai trò ở mỗi đầu của quan hệ để tránh sự nhập nhằng.

Quan hệ kết hợp giữa các lớp

Không nên nhầm lẫn liên kết với giá trị. Giá trị là dữ liệu nguyên thuỷ như là dữ liệu số hoặc xâu ký tự. Liên kết là mối liên quan giữa hai đối tượng. Trong giai đoạn phân tích ta phải mô hình (xác định) tất cả các tham chiếu tới các đối tượng thông qua các liên kết và nhận dạng được các nhóm liên kết tương tự thông qua các quan hệ kết hợp. Đến giai đoạn thiết kế ta có thể chọn cấu trúc con trỏ, khoá ngoại, hoặc một số cách khác để cài đặt những quan hệ đó.

Mô hình phân tích ở hình 4 được phát triển sang giai đoạn thiết kế như sau:

Mô hình thiết kế các lớp

Trong đó, lớp TinhThanh có thêm thuộc tính cacSanBay có thể là danh sách hoặc là cấu trúc mảng, hay con trỏ, v.v. Ta cũng có thể thiết kế theo cách khác, thay vì bổ sung thuộc tính cacSanBay vào lớp TinhThanh thì bổ sung oTinhThanh vào lớp SanBay.

Quan hệ kết hợp thường là quan hệ hai chiều: một đối tượng kết hợp với một số đối tượng của lớp khác và ngược lại. Để xác định số các đối tượng có thể tham gia vào mỗi đầu của mối quan hệ ta có thể sử dụng khái niệm bội số. Bội số xác định số lượng các thể hiện (đối tượng) của một lớp trong quan hệ kết hợp với lớp khác. Cũng cần phân biệt bội số (hay bản số) với lực lượng. Bội số là ràng buộc về kích cỡ của một tuyển tập, còn lực lượng là đếm số phần tử của tuyển tập đó. Do đó, bội số là sự ràng buộc về lực lượng của các phần tử trong một lớp tham gia vào quan hệ xác định trước.

Trong UML các bội số được biểu diễn như sau:

Để phân biệt chiều của quan hệ kết hợp ta có thể sử dụng mũi tên chỉ chiều kết hợp.

Quan hệ kết hợp hai chiều giữa hai lớp

Hình 5 mô tả như sau: mỗi người trong lớp Nguoi có thể không có hoặc có nhiều ô tô (thuộc lớp Oto) và ngược lại một ô tô phải là sở hữu của ít nhất một người nào đó thuộc lớp Nguoi.

Vai trò là tên gọi một nhiệm vụ thường là một danh từ, được gán cho một đầu của quan hệ kết hợp. Hình 6 mô tả hai lớp SanBay và lớp CacChuyenBay có quan hệ kết hợp với nhau. Một sân bay có thể là điểm đến của chuyến bay này và lại có thể là điểm xuất phát của chuyến bay khác. Ngược lại một chuyến bay bao giờ cũng phải bay từ một sân bay này tới một sân bay khác

Vai trò trong các quan hệ kết hợp

Khi mô hình không có sự nhập nhằng thì tên của vai trò là tuỳ chọn. Sự nhập nhằng sẽ xuất hiện khi giữa hai lớp có nhiều quan hệ như hình 6, hoặc khi một lớp lại có quan hệ với chính nó (quan hệ đệ qui).

Một người có thể là con của hai người (cha-mẹ) và hai cha -mẹ lại có thể có nhiều con. Quan hệ này có thể mô tả như trong hình 7.

Vai trò trong các qua hệ kết hợp

Kết nhập là một loại của quan hệ kết hợp, tập trung thể hiện quan hệ giữa tổng thể và bộ phận. Kết nhập thường biểu diễn cho quan hệ “có một”, “là bộ phận của” , hoặc “bao gồm”, v.v. thể hiện mối quan hệ một lớp tổng thể có, gồm, chứa hay liên kết với một hoặc nhiều lớp thành phần. Người ta chia quan hệ kết nhập thành ba loại:

  • Kết nhập thông thường
  • Kết nhập chia sẻ và
  • Kết nhập hợp thành hay quan hệ hợp thành.

1. Kết nhập thông thường

Quan hệ kết nhập thông thường, gọi tắt là kết nhập thể hiện mối liên kết giữa hai lớp, trong đó đối tượng của lớp này bao gồm một số đối tượng của lớp kia, song không tồn tại trong nội tại của lớp đó. Lớp phía bộ phận cũng chỉ là một bộ phận logic của phía tổng thể và chúng không được chia sẻ với các lớp khác.

Quan hệ kết nhập thông thường

Trong quan hệ này, việc quản lý các đối tượng của các lớp liên quan là khác nhau. Ta có thể loại bỏ một số tàu chiến của một hạm đội sao cho số còn lại ít nhất là 3, tương tự có thể bổ sung vào một số tàu chiến sao cho không quá 10. Nhưng khi đã loại bỏ một hạm đội thì phải loại bỏ tất cả các tàu chiến của hạm đội đó vì mỗi tàu chiến chỉ thuộc một hạm đội.

2. Kết nhập chia sẻ

Quan hệ kết nhập chia sẻ là loại kết nhập, trong đó phía bộ phận có thể tham gia vào nhiều phía tổng thể.

Quan hệ kết nhập thông thường

Mỗi dự án có thể có nhiều người tham gia và mỗi người lại có thể tham gia nhiều nhất là hai dự án. Trong quan hệ này, ta có thể loại bỏ, hay thành lập một dự án (phía tổng thể) nhưng không nhất thiết phải loại bỏ, hay phải tuyển thêm những người tham gia (phía bộ phận) vào dự án như kiểu kết nhập ở trên. Tuy nhiên khi xử lý các mối quan hệ đó thì phải cập nhật lại các mối liên kết của các nhân viên tham gia vào các dự án tương ứng.

3. Kết nhập hợp thành

Quan hệ chỉ ra một vật có chứa một số bộ phận và các bộ phận đó tồn tại vật lý bên trong vật tổng thể. Do vậy khi thực hiện huỷ bỏ, hay thiết lập mới bên tổng thể thì các bộ phận bên thành phần cũng sẽ bị huỷ bỏ hoặc phải được bổ sung.

Lớp Window chứa các lớp Text, Menu DialogBox. Trong UML có hai cách biểu diễn quan hệ hợp thành như sau:

Quan hệ kết nhập hợp thành

Tổng quát hoá và chuyên biệt hoá là hai cách nhìn dưới/lên và trên/xuống về sự phân cấp các lớp, mô tả khả năng quản lý cấp độ phức tạp của hệ thống bằng cách trừu tượng hoá các lớp.

Tổng quát hoá là đi từ các lớp dưới lên sau đó hình thành lớp tổng quát (lớp trên, lớp cha), tức là cây cấu trúc các lớp từ lá đến gốc.

Chuyên biệt hoá là quá trình ngược lại của tổng quát hoá, nó cho phép tạo ra các lớp dưới (lớp con) khác nhau của lớp cha.

Trong UML, tổng quát hoá chính là quan hệ kế thừa giữa hai lớp. Nó cho phép lớp con (lớp dưới, lớp kế thừa, hay lớp dẫn xuất) kế thừa trực tiếp các thuộc tính và các hàm thuộc loại công khai, hay được bảo vệ (protected) của lớp cha (lớp cơ sở, lớp trên). Trong quan hệ tổng quát hoá có hai loại lớp: lớp cụ thể và lớp trừu tượng.

Lớp cụ thể là lớp có các đại diện, các thể hiện cụ thể. Ngược lại, lớp trừu tượng là lớp không có thể hiện (đối tượng) cụ thể trong hệ thống thực. Các lớp con cháu của lớp trừu tượng có thể là lớp trừu tượng, tuy nhiên trong cấu trúc phân cấp theo quan hệ tổng quát hoá thì mọi nhánh phải kết thúc bằng các lớp cụ thể (lá của cây các lớp). Ta có thể định nghĩa các hàm trừu tượng cho các lớp trừu tượng, đó là những hàm chưa được cài đặt nội dung thực hiện trong lớp chúng được khai báo. Những hàm trừu tượng này sẽ được cài đặt trong các lớp con cháu sau đó ở những lớp cụ thể.

Lớp NhanVien có ký hiệu {abstract} sau hoặc dưới tên lớp là lớp trừu tượng, và do vậy nó không có đối tượng cụ thể. Hai lớp con: lớp NguoiBanHang và lớp CongNhan là hai lớp cụ thể. Hai lớp này có những thuộc tính, thao tác giống lớp NhanVien như có các thuộc tính: hoTen, diaChi và có các hàm tinhLuong(), hienThi(), ngoài ra mỗi lớp còn có thể bổ sung thêm một số thuộc tính, thao tác để đặc tả cho từng nhóm đối tượng cụ thể. Lớp NguoiBanHang được bổ sung thêm thuộc tính soluongBanDuoc còn lớp CongNhan được bổ sung thuộc tính soLuongSanPham sản xuất được. Cấu trúc phân cấp của lớp NhanVien được xác định như hình 11.

Lớp trừu tượng và cụ thể trong quan hệ tổng quát hóa

  • Quan hệ tổng quát và kết hợp là hai quan hệ liên quan đến hai lớp, nhưng chúng có những điểm khác nhau. Quan hệ kết hợp mô tả mối liên kết giữa hai hoặc nhiều hơn đối tượng còn quan hệ khái quát mô tả các phương diện khác nhau của cùng một thể hiện.
  • Trong giai đoạn phân tích, các quan hệ kết hợp là quan trọng hơn quan hệ tổng quát hoá. Kết hợp bổ sung thêm các thông tin cho các lớp. Ngược lại, tổng quát hoá là loại bỏ những thông tin bị chia sẻ ở các lớp con cháu vì chúng được kế thừa từ lớp cha.
  • Trong giai đoạn thiết kế thì tổng quát hoá lại quan trọng hơn. Người phát triển hệ thống quan tâm để phát hiện ra những cấu trúc dữ liệu ở khâu phân tích và phát hiện ra các hành vi ở khâu thiết kế. Tổng quát hoá cung cấp cơ chế sử dụng lại để thể hiện chính xác các hành vi và mã hoá của các thư viện của các lớp.
  • Quan hệ kết nhập và tổng quát cũng khác nhau. Cả hai đều làm xuất hiện cấu trúc cây thông qua bao đóng bắc cầu của quan hệ cơ sở, nhưng quan hệ tổng quát là mối quan hệ “hoặc” (OR) còn quan hệ kết nhập là mối quan hệ “và” (AND). Hình 11 mô tả sự khác nhau của quan hệ tổng quát hoá và kết nhập.

Kế thừa bội cho phép một lớp được kế thừa các thuộc tính, các thao tác và các quan hệ kết hợp từ nhiều lớp cơ sở. Trong quan hệ kế thừa bội có thể dẫn đến sự pha trộn thông tin từ nhiều nguồn dữ liệu khác nhau từ các lớp được kế thừa. Quan hệ kế thừa đơn, một lớp được kế thừa từ một lớp cơ sở, thường tạo ra cấu trúc cây, còn kế thừa bội lại tổ chức các lớp thành đồ thị định hướng phi chu trình. Kế thừa bội là cơ chế mạnh trong mô hình hệ thống, nhưng đồng thời cũng sẽ tạo ra nhiều sự phức tạp về tính nhập nhằng, không nhất quán dữ liệu [24, 26].

Kế thừa bội từ những lớp phân biệt

Một lớp có thể kế thừa từ nhiều lớp cơ sở khác nhau.

Lớp Nguoi là cơ sở để tạo ra hai lớp con: HDQuanTri (những người trong hội đồng quản trị) và KinhDoanh (những người kinh doanh). Từ các lớp trên lại xây dựng các lớp BanGiamDoc, CoDong (những người đóng cổ phần) kế thừa từ lớp HDQuanTri, lớp NhanVienCT (những người làm việc thường xuyên trong công ty) và NhanVienHD (những người làm việc theo hợp đồng) kế thừa từ lớp KinhDoanh. Trong Công ty lại có những người vừa là cổ đông, vừa là nhân viên. Những người đó chính là các đối tượng của lớp NhanVienCoDong kế thừa từ hai lớp con CoDong và NhanVienCongTy .

Kế thừa bội từ hai lớp khác nhau và có lớp cơ sở chung

Kế thừa bội không có lớp cơ sở chung

Kế thừa bội như trên là kế thừa có lớp cơ sở chung (lớp Nguoi). Chúng ta có thể tạo ra lớp kế thừa bội từ nhiều lớp mà chúng lại không có lớp cơ sở chung. Loại kế thừa này thường xuất hiện khi ta muốn pha trộn một số chức năng của các lớp thư viện khác nhau.

Chúng ta hãy xét mô hình của chương trình đánh cờ. Trước khi đi một nước cờ, chương trình phải nghiên cứu vị trí của các quân cờ và các nước đi tiếp theo sao cho nước đi đó là có thể dẫn đến chiến thắng nhanh nhất. Trong hình 2-13 (b), mỗi đối tượng của lớp SearchTree (cây tìm kiếm) có thể là đối tượng của lớp MoveSubtree (cây con các nước đi) hoặc của lớp PossibleMove (lớp các nước có thể chọn). Bản thân lớp MoveSubtree lại có thể chứa các SearchTree nhỏ hơn. Mỗi nước đi của lớp Move lại có thể là nước đi có thể (PossibleMove) hoặc lớp các nước đi hiện thời (ActualMove). Lớp PossibleMove kế thừa hành vi chung của lớp Move và lớp SearchTree.

Kế thừa bội không có lớp cơ sở chung

Sự phụ thuộc là một loại quan hệ liên kết giữa hai phần tử trong mô hình, trong đó thể hiện sự thay đổi trong một phần tử sẽ kéo theo sự thay đổi của phần tử kia. Quan hệ kết hợp thường là quan hệ hai chiều, nhưng quan hệ phụ thuộc lại thường là quan hệ một chiều, thể hiện một lớp phụ thuộc vào lớp khác. Lớp A phụ thuộc vào lớp B khi:

  • Lớp A sử dụng một đối tượng của lớp B như là tham số trong các thao tác (lời gọi hàm),
  • Trong các thao tác của lớp A có truy nhập tới các đối tượng của lớp B,
  • Khi thực hiện một thao tác nào đó trong lớp A lại phải tham chiếu tới miền xác định của lớp B.
  • Lớp A sử dụng các giao diện của lớp B.

Tương tự, hai gói có thể phụ thuộc vào nhau khi có một lớp ở một gói phụ thuộc vào lớp của gói kia.

Trong UML, quan hệ phụ thuộc được thể hiện bằng mũi tên đứt nét.

Hình 2-18 mô tả quan hệ phụ thuộc giữa hai lớp và phụ thuộc của hai gói.

Quan hệ phụ thuộc giữa các lớp và các gói

Quan hệ hiện thực hoá thể hiện sự kết nối giữa các lớp và giao diện. Quan hệ này thường được sử dụng với các giao diện và những lớp làm nhiệm vụ cài đặt các dịch vụ (phương thức) đã được khai báo trong các giao diện. Quan hệ hiện thực hoá được ký hiệu là mũi tên đứt nét như hình 2-19.

Quan hệ hiện thực hoá
0