Association, Aggregation, Composition, Dependency là gì?
Giới thiệu
Mấy cái Association, Aggregation, Composition mình cứ hay nhầm qua nhầm lại hoài, thôi giờ viết một bài để sau này nhầm lên đọc lại cho nhanh. Code mình họa mình dùng Swift nha.
À, trước tiên ôn lại xíu nha:
Sự khác nhau giữa Class ( lớp ) vs Object ( đối tượng ) với Instance ( thể hiện ): Class ( lớp ) như bản thiết kết của một Object ( đối tượng ). Instance ( thể hiện ) là một đơn vị độc lập của class
Ví dụ: lớp HocSinh sẽ có thuộc tính maHocSinh, tenHocSinh là bản thiết kế của đối tượng học sinh. hocSinh1, hocSinh2 là 2 thể hiện của lớp học Sinh
Association
Sự liên kết giữa 2 lớp khi mà không ai sở hữu ai.
the lifetime of the instances of the two classes are independent of each other and there is no ownership between two classes.
Vòng đời các thể hiện của 2 lớp thì độc lập nhau và không có mối quan hệ sở hữu nào ở đây cả.
class Student { var name: String var teachers: [Teacher] init(name: String, teachers: [Teacher]) { self.name = name self.teachers = teachers } } class Teacher { var name: String init(name: String) { self.name = name } } let teacher1 = Teacher(name: "Nguyen Van Teo") let teacher2 = Teacher(name: "Tran Thi Buoi")
let khoa = Student(name: "Khoa", teachers: [teacher1,teacher2]) let teo = Student(name: "Teo", teachers: [teacher2])
Ví dụ: Một học sinh có thể liên kết ( associate ) với nhiều giáo viên. Học sinh khoa có 2 giáo viên là teacher1, teacher2
Những thể hiện ( instance ) của class Teacher được tạo ở ngoài class Student. Nên khi thằng khoa bị hủy thì 2 ông giáo viên teacher1, teacher2 cũng không bị ảnh hưởng gì.
Mấy thằng học sinh khác như teo, lan, tý có thể liên kết ( associate ) với Teacher qua các instance teacher1, teacher2. Nên ta nói là Student không có quan hệ sở hữu ( ownership ) gì với Teacher hết ráo.
Khi vẽ vời mối quan hệ associate, ta dùng hình mũi tên giống vầy nha:
Aggregation
Aggregation cũng giống như Association, nhưng khác là Aggregation có mối quan hệ sở hữu ( ownership ) giữa các instance
class Pin { var value = "2000mA" } class CellPhone{ var pin: Pin! init(pin: Pin) { self.pin = pin } } let pin = Pin() let samsung = CellPhone(pin: pin)
Vậy Aggregation khác gì Associate:
Có tính sở hữu ( ownership ) giữa 2 class. Mấy sách nước ngoài người ta đặt là part-whole relationship. Điện thoại cần có pin. Pin là bên part, điện thoại là whole trong part-whole relationship.
Vòng đời của part không phụ thuộc vào whole. Điện thoại ( CellPhone ) cần có một cục pin ( Pin ) để hoạt động. Khi điện thoại hư có thể đem cục pin này sang điện thoại khác.
UML dùng mũi tên này để vẽ:
Composition
Composition tương tự như Aggregation nhưng khác là vòng đời của thằng part sẽ bị thụ thuộc và thằng whole
class Room{ var name = "Phong69" } class Hotel { var rooms = [Room]() func getRoom(){ var room1 = Room() var room2 = Room() self.rooms.append(room1) self.rooms.append(room2) } }
let hotel = Hotel()
Khi hotel ( whole ) bị hủy thì room1, room2 ( part ) cũng bị hủy theo. Nói cách khác là vòng đời của thằng part bị phụ thuộc vào vòng đời của whole trong part-whole relationship
Nhìn cái hình cho dễ nhớ nào:
Dependency
Khi một class A phụ thuộc và một class B, những thay đổi ở B có thể ảnh hưởng đến A.
class Customer { var id: Int var name: String init(id: Int, name: String){ self.id = id self.name = name } } class Order { var customerId: Int var date: Date init(customer: Customer) { self.date = Date() self.customerId = customer.id } } let khoa = Customer(id: 123, name: "Khoa") let order = Order(customer: khoa)
Khi lưu order mới ta cần biết customerId.
Buồn buồn, ta thay đổi id ở Customer thành kiểu string chứ không phải Int nữa thì Order sẽ phải thay đổi theo. Ta gọi mối quan hệ này là Dependency
Vẽ thì dùng mũi tên này:
Sẵn bonus thêm cái hình mũi tên để vẽ UML nè:
Nguồn tham khảo thêm:
https://www.codeproject.com/Articles/777540/Association-Aggregation-Composition-Dependency-and