Association, Aggregation, Composition, Dependency là gì?
Giải thích rõ ràng về bốn mối quan hệ cơ bản trong lập trình hướng đối tượng - Association, Aggregation, Composition và Dependency với ví dụ cụ thể bằng Swift. Hiểu đúng các khái niệm này sẽ giúp bạn thiết kế phần mềm chuyên nghiệp hơn!

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
Related Posts
Discover more content you might enjoy

Vibe Coding - Code lại blog từ đầu và rebrand thành khoa.blog
Chia sẻ chi tiết quá trình build lại blog từ đầu với vibe coding, từ việc chuyển đổi dữ liệu đến việc triển khai các tính năng mới, giúp người đọc hiểu rõ hơn về quá trình phát triển blog cá nhân.

Dự đoán về Vibe Coding: Cách AI sẽ biến đổi việc tạo ra phần mềm
Phân tích chi tiết cách 'vibe coding' - phương pháp lập trình dựa trên mô tả ý định thay vì viết code trực tiếp - sẽ dân chủ hóa việc phát triển phần mềm, giúp người đọc hiểu rõ hơn về xu hướng công nghệ và tác động của nó đến ngành công nghệ thông tin.

The MVP #1: Làm một trang dạy học trực tuyến cần gì?
Bài viết phân tích những nhược điểm của Udemy và các yêu cầu cần thiết để xây dựng một nền tảng học trực tuyến độc lập.

English Course Challenge in 2 weeks - Day 12: Kinh nghiệm quay khoá học
Bài viết chia sẻ kinh nghiệm quay khóa học tiếng Anh về Bubble.io, bao gồm việc lựa chọn phần mềm Screen.Studio để quay màn hình và tự động tạo phụ đề, những bài học từ việc đặt mục tiêu và xác định đối tượng học viên trước khi chọn nội dung, cũng như lợi ích của việc thử thách bản thân để vượt qua nỗi sợ và hoàn thành dự định. Tác giả cũng giới thiệu khóa học 'Build your first web app in Bubble for beginners' dành cho người mới bắt đầu.

Day 5 - Profitable MVP in 30 Days - Ý tưởng này đã có người làm rồi
Ngày thứ năm của thử thách Profitable MVP in 30 Days, đối mặt với việc phát hiện ý tưởng đã có người thực hiện và cách biến điều này thành lợi thế để cải thiện sản phẩm của mình.

Bitcoin Domain (.btc) là gì? Cách mua như thế nào?
Tìm hiểu về Bitcoin Domain (.btc) và cách mua domain này