Class diagram & Các ký hiệu quan hệ (relation) trong UML
Trong lập trình thì class diagram dùng để mô tả cấu trúc của hệ thống phần mềm bằng cách thể hiện các class của hệ thống, bao gồm các thuộc tính, phương thức, và mối liên hệ giữa chúng
Trong lập trình thì class diagram dùng để mô tả cấu trúc của hệ thống phần mềm bằng cách thể hiện các class của hệ thống, bao gồm các thuộc tính (property), phương thức (method), và mối liên hệ (relation) giữa chúng.
Có 6 loại liên hệ trong class diagram là Inheritance, Realization/Implement, Dependency, Association, Aggregation, Composition.
Inheritance
Inheritance là khả năng xây dựng class mới dựa trên một class đã có sẵn và kế thừa các thuộc tính, hành vi của class đó.
Ví dụ class Student
và Teacher
cùng kế thừa class Person
.
Realization/Implement
Realization/Implement là hành vi khai báo các methods có trong interface mà một class phải implement.
Ví dụ class Cat
implement 2 interface FourLegged
và OxygenBreather
bằng cách khai báo method run(destination)
và breathe
bên trong nó.
Dependency
Dependency là mối liên kết cơ bản và yếu nhất trong các mối liên hệ giữa các class với nhau. Hai class có mối liên hệ dependency nếu một class có sự thay đổi thì sẽ dẫn đến việc class còn lại cũng phải thay đổi theo.
Dependency thường xảy ra khi bạn sử dụng một tên class cụ thể trong một class khác. Bạn có thể làm cho sự phụ thuộc này yếu hơn bằng cách thay tên class cụ thể bằng một interface hay abstract class.
Ví dụ đối tượng Professor
phụ thuộc vào đối tượng Course
Association
Association là mối quan hệ mà trong đó một đối tượng sử dụng hoặc tương tác với một đối tượng khác.
Association có thể được xem là một dạng đặc biệt của dependency trong đó một đối tượng luôn có quyền truy cập đến các đối tượng khác mà nó tương tác, trong khi phụ thuộc đơn giản không thiết lập liên kết cố định giữa các đối tượng.
Ví dụ đối tượng Professor
có thể giao tiếp với đối tượng Student
.
Association thường được thể hiện dưới dạng một field bên trong class, liên kết luôn tồn tại ở đó, bạn luôn có thể yêu cầu order cho biết thông tin của khách hàng đã đặt đơn. Association không nhất thiết phải được thể hiện dưới dạng một field bên trong class. Trong trường hợp bạn sử dụng interface để mô hình hóa class thì mối liên kết được thể hiện bằng việc bạn luôn biết được rằng sẽ có một method trả về thông tin khách hàng của order.
Để hiểu được sự khác nhau giữa Association và Dependency chúng ta cùng xem xét ví dụ sau:
Method teach
nhận vào một tham số kiểu Course
. Nếu method getKnowledge
của class Course
thay đổi thì code của chúng ta cũng sẽ bị ảnh hưởng. Đây gọi là dependency.
Bây giờ xét đến field student
thì chúng ta cũng có thể nói là class Student
là dependency của class Professor
bởi vì nếu method remember
thay đổi thì code của Professor
cũng bị ảnh hưởng theo. Tuy nhiên điểm khác biệt ở đây là field student
luôn tồn tại ở đó và có thể được truy cập trong tất cả các method của Professor
. Vì vậy class Student
không chỉ đơn thuần là dependency của class Professor
mà chúng ta gọi đó association.
Association là dạng tổng quát của Aggregation và Composition.
Aggregation
Aggregation là một loại liên kết chuyên biệt để thể hiện các mối liên hệ “one-to-many”, “many-to-many”, hoặc “whole-part” giữa nhiều đối tượng.
Thông thường thì đối với một liên kết aggregation, một object sẽ chứa 1 tập hợp các đối tượng khác (component) và hoạt động tương tự như là một container hay một collection. Một component có thể tồn tại độc lập hoặc có thể được liên kết cùng lúc với nhiều container khác nhau.
Ví dụ đối tượng Department
có thể chứa 1 hoặc nhiều đối tượng Professor
.
Composition
Composition ****là một dạng đặc biệt của aggregation khi một đối tượng có thể bao gồm một hoặc nhiều đối tượng khác. Điểm khác biệt ở đây là các component chỉ có thể tồn tại như là một phần của container chứ không thể tồn tại độc lập
Ví dụ đối tượng University
có thể chứa 1 hoặc nhiều đối tượng Department
.
Lưu ý:
Class diagrams có nhiều level từ high level đến low level để mô tả hệ thống từ tổng quát nhất đến chi tiết
Khi vẽ high level class diagram thì chúng ta nên vẽ từng nhóm đối tượng riêng lẻ của hệ thống rồi liên kết các nhóm nhỏ lại với nhau
Class diagram không phải là Entity Relationship Diagram (ERD)
Tóm lại:
Dependency: Class A có thể bị ảnh hưởng bởi những thay đổi của class B, hay là class A phụ thuộc vào class B.
Association: Object A biết về object B. Class A phụ thuộc vào class B.
Aggregation: Object A biết về object B, và bao gồm một hoặc nhiều object B. Class A phụ thuộc vào class B.
Composition: Object A biết về object B, bao gồm một hoặc nhiều object B, và quản lý vòng đời (life cycle) của chúng. Class A phụ thuộc vào class B.
Realization/Implement: Class A khai báo các methods có trong interface B. Các object của class A có thể được xem là có kiểu B. Class A phụ thuộc vào B.
Inheritance: Class A kế thừa các interface, thuộc tính, methods của class B và có thể mở rộng hơn nữa. Object của class A có thể được xem là có kiểu B. Class A phụ thuộc vào class B.