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
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
Khi vẽ vời mối quan hệ associate, ta dùng hình mũi tên giống vầy nha:
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:
UML dùng mũi tên này để vẽ:
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:
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
NIVIKI.COM | Telegram | Twitter
Thất nghiệp. Đang rủ rê nhiều người thất nghiệp. Hy vọng với NIVIKI.COM có thể lan toả tinh thần thất nghiệp đến với nhiều người hơn nữa