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

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.

English Course Challenge in 2 weeks - Day 7: Fine-tuning ChatGPT là gì?
Bài viết chia sẻ tiến trình ngày thứ 7 trong thử thách tạo khóa học tiếng Anh trong 2 tuần. Tác giả giới thiệu về Fine-tuning ChatGPT, một tính năng cho phép tạo phiên bản ChatGPT tùy chỉnh dựa trên dữ liệu cung cấp, đặc biệt hữu ích cho chatbot hỗ trợ khách hàng. Bài viết cũng thảo luận về việc điều chỉnh hướng phát triển ứng dụng demo và khóa học, cùng với những khó khăn khi sử dụng API của OpenAI tại Việt Nam.

English Course Challenge in 2 weeks - Day 2: Tiềm năng của Prompt Engineering
Bài viết chia sẻ về việc phát triển ứng dụng SaaS AI demo cho khóa học Bubble, tập trung vào Prompt Engineering - kỹ thuật viết prompt hiệu quả cho AI. Tác giả giới thiệu cấu trúc prompt chuẩn gồm 6 phần: Persona, Context, Task, Format, Examplar và Tone, đồng thời trình bày ý tưởng và mockup cho ứng dụng hỗ trợ người dùng viết prompt tốt hơn, giải quyết vấn đề nhiều người gặp phải khi sử dụng AI.

Đối thoại với AI: Generative AI (AI tạo sinh) và những điều cần biết
Bài viết dạng hỏi đáp toàn diện về AI tạo sinh, bao gồm kỹ thuật viết prompt hiệu quả, cách kiếm tiền từ AI, các nền tảng thay thế Claude AI, chi phí huấn luyện mô hình lớn, và các khái niệm quan trọng như BERT, mô hình tiền huấn luyện cùng những vấn đề đạo đức liên quan.

Sống tối giản dưới 7kg hành lý
Bài viết chia sẻ trải nghiệm và lợi ích của việc du lịch với hành lý tối giản dưới 7kg. Tác giả kể về hành trình chuyển từ mang nhiều hành lý trong chuyến xuyên Việt sang chỉ mang một balo nhỏ trong chuyến đi Bali, và những lợi ích như tiết kiệm chi phí hành lý, check-in/check-out nhanh chóng, di chuyển dễ dàng, và tạo thói quen sử dụng đồ hiệu quả. Bài viết cũng đưa ra danh sách đồ dùng cần thiết cho một chuyến đi với hành lý tối giản.
