TÓM TẮT
- 1 1. Giới Thiệu Tổng Quan Về Class Diagram
- 2 2. Bước Chuẩn Bị Trước Khi Vẽ Class Diagram
- 3 3. Quy Trình Vẽ Class Diagram Từng Bước
- 4 4. Các Nguyên Tắc Thiết Kế Khi Vẽ Class Diagram
- 5 5. Ví Dụ Thực Tế: Vẽ Class Diagram Cho Hệ Thống Quản Lý Bán Hàng
- 6 6. Các Lỗi Thường Gặp Khi Vẽ Class Diagram Và Cách Khắc Phục
- 7 7. Tips Nâng Cao Để Tối Ưu Hóa Class Diagram
- 8 8. Quy Trình Kiểm Thẩm (Review) Class Diagram
- 9 9. Kết Luận
1. Giới Thiệu Tổng Quan Về Class Diagram
Class diagram (sơ đồ lớp) là một trong những biểu đồ quan trọng nhất trong UML (Unified Modeling Language). Nó mô tả cấu trúc tĩnh của hệ thống phần mềm, thể hiện các lớp (class), các thuộc tính (attributes), các phương thức (operations) và mối quan hệ giữa chúng. Đối với các nhà phát triển, kiến trúc sư phần mềm hay sinh viên ngành công nghệ thông tin, việc nắm vững cách vẽ class diagram không chỉ giúp hiểu rõ kiến trúc phần mềm mà còn hỗ trợ trong việc thiết kế, bảo trì và mở rộng hệ thống.
1.1. Lý Do Cần Vẽ Class Diagram
- Trực quan hoá kiến trúc: Giúp các thành viên trong nhóm nắm bắt nhanh cấu trúc hệ thống.
- Giao tiếp hiệu quả: Là ngôn ngữ chung giữa nhà phân tích, lập trình viên, tester và khách hàng.
- Phát hiện lỗi thiết kế: Khi vẽ diagram, ta có thể nhận ra các quan hệ không hợp lý, vi phạm nguyên tắc SOLID, v.v.
- Hỗ trợ lập trình hướng đối tượng: Class diagram là bản đồ cho việc viết code OOP, giúp định hướng triển khai lớp, kế thừa, giao diện…
1.2. Các Thành Phần Cơ Bản Của Class Diagram
| Thành phần | Ký hiệu | Mô tả |
|---|---|---|
| Class | Hình chữ nhật chia thành 3 phần | Tên lớp, thuộc tính, phương thức |
| Attribute | Tên:Kiểu | Thuộc tính của lớp, có thể có phạm vi truy cập (+ public, – private, # protected, ~ package) |
| Operation | Tên(Tham số):Kiểu trả về | Phương thức (hàm) của lớp, cũng có phạm vi truy cập |
| Association | Đường thẳng | Quan hệ “có” giữa các lớp, có thể có đa số (1, 0.., 1..,…) |
| Aggregation | Đường thẳng có hình thoi rỗng | Quan hệ “toàn bộ – một phần” yếu, phần có thể tồn tại độc lập |
| Composition | Đường thẳng có hình thoi đen | Quan hệ “toàn bộ – một phần” mạnh, phần không tồn tại nếu toàn bộ chết |
| Inheritance (Generalization) | Đường thẳng mũi tên rỗng | Kế thừa, lớp con (subclass) kế thừa lớp cha (superclass) |
| Realization | Đường thẳng mũi tên gạch chấm | Lớp thực thi một interface |
| Dependency | Đường chấm | Một lớp phụ thuộc vào lớp khác (sử dụng tạm thời) |
| Interface | Hình chữ nhật với < |
Định nghĩa tập hợp các phương thức mà lớp thực thi |
2. Bước Chuẩn Bị Trước Khi Vẽ Class Diagram
2.1. Xác Định Phạm Vi Hệ Thống
- Phân tích yêu cầu: Đọc tài liệu yêu cầu (SRS – Software Requirements Specification) để hiểu các chức năng chính.
- Chia hệ thống thành các mô-đun: Không cần vẽ toàn bộ hệ thống trong một diagram; mỗi mô-đun (module) có thể có một class diagram riêng.
- Xác định mức độ chi tiết: Đối với giai đoạn thiết kế sơ bộ (high-level) chỉ cần vẽ các lớp chính; ở giai đoạn chi tiết (low-level) mới vẽ đầy đủ thuộc tính và phương thức.
2.2. Thu Thập Thông Tin Về Các Lớp

Có thể bạn quan tâm: Cách Vẽ Cis‑trans: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Tên lớp: Thông thường là danh từ danh từ (noun) mô tả thực thể, ví dụ:
Customer,Order,Product. - Thuộc tính: Xác định các dữ liệu mà lớp cần lưu trữ, ví dụ:
Customercóname,email,phoneNumber. - Phương thức: Xác định các hành động mà lớp thực hiện, ví dụ:
Customercóregister(),login(). - Mối quan hệ: Xác định các mối quan hệ giữa các lớp: kế thừa, kết hợp, phụ thuộc…
2.3. Lựa Chọn Công Cụ Vẽ
- Công cụ trực tuyến: Lucidchart, Draw.io (diagrams.net), Creately, Gliffy.
- IDE tích hợp: Visual Studio, IntelliJ IDEA, Eclipse (có plugin UML).
- Phần mềm chuyên dụng: Enterprise Architect, StarUML, Visual Paradigm.
Lựa chọn công cụ dựa vào độ phức tạp, khả năng cộng tác và chi phí.
3. Quy Trình Vẽ Class Diagram Từng Bước
3.1. Bước 1: Vẽ Các Lớp Cơ Bản
- Tạo hình chữ nhật: Mỗi lớp được biểu diễn bằng một hình chữ nhật chia thành 3 phần.
- Phần trên (Tên lớp): Đặt tên lớp ở giữa, viết in đậm, viết hoa chữ cái đầu.
- Phần giữa (Thuộc tính): Liệt kê thuộc tính, mỗi thuộc tính trên một dòng, định dạng
phạm vi tên:kiểu. - Ví dụ:
- id: int,+ name: String. - Phần dưới (Phương thức): Liệt kê các phương thức, định dạng
phạm vi tên(tham số):kiểu trả về. - Ví dụ:
+ getName(): String,- calculateTotal(): double.
3.2. Bước 2: Xác Định Phạm Vi Truy Cập (Visibility)
- + (public): Truy cập từ bất kỳ đâu.
- – (private): Chỉ trong lớp hiện tại.
- # (protected): Trong lớp và lớp con.
- ~ (package): Truy cập trong cùng package (Java) hoặc assembly (C#).
Việc chỉ ra rõ phạm vi giúp hiểu rõ mức độ đóng gói (encapsulation) trong thiết kế.
3.3. Bước 3: Thêm Các Mối Quan Hệ
3.3.1. Kế Thừa (Generalization)
- Vẽ một đường thẳng có mũi tên rỗng hướng tới lớp cha.
- Đặt từ khóa
<<abstract>>nếu lớp cha là abstract. - Ví dụ:
class Employeekế thừaclass Person.
3.3.2. Thực Thi Interface (Realization)
- Vẽ đường thẳng mũi tên gạch chấm hướng tới interface.
- Đánh dấu
<<interface>>trên hình chữ nhật interface. - Ví dụ:
class Orderthực thi<<interface>> Payable.
3.3.3. Association (Kết Nối)
- Vẽ đường thẳng giữa hai lớp.
- Đặt nhãn (label) nếu cần, ví dụ:
1,0..,1... - Thêm tên vai trò (role name) ở mỗi đầu nếu cần, ví dụ:
customerở phíaOrder.
3.3.4. Aggregation
- Vẽ đường thẳng có hình thoi rỗng ở phía “toàn bộ”.
- Dùng khi phần (part) có thể tồn tại độc lập.
- Ví dụ:
ClassroomaggregationStudent.
3.3.5. Composition
- Vẽ đường thẳng có hình thoi đen ở phía “toàn bộ”.
- Dùng khi phần không thể tồn tại nếu toàn bộ chết.
- Ví dụ:
HousecompositionRoom.
3.3.6. Dependency
- Vẽ đường chấm (dotted line) từ lớp phụ thuộc tới lớp được phụ thuộc.
- Đánh dấu tên phương thức hoặc tham số nếu cần.
- Ví dụ:
ReportGeneratorphụ thuộcDatabaseConnection.
3.4. Bước 4: Thêm Ghi Chú (Notes) và Constraint

Có thể bạn quan tâm: Cách Vẽ Circle Progressbar Trong Android: Hướng Dẫn Toàn Diện Từ Cơ Bản Đến Nâng Cao
- Ghi chú: Dùng hình chữ nhật có góc cong, gắn vào lớp bằng đường dotted line.
- Constraint: Viết trong dấu
{}ở phía cuối lớp hoặc mối quan hệ, ví dụ{unique email}.
3.5. Bước 5: Kiểm Tra Lại Độ Nhất Quán
- Kiểm tra tên trùng: Không có lớp, thuộc tính hoặc phương thức trùng lặp.
- Kiểm tra phạm vi: Đảm bảo các thuộc tính và phương thức có phạm vi hợp lý.
- Kiểm tra mối quan hệ: Đảm bảo không có vòng lặp kế thừa (circular inheritance) và quan hệ aggregation/composition hợp lý.
- Kiểm tra nguyên tắc SOLID: Đặc biệt là Single Responsibility và Interface Segregation.
4. Các Nguyên Tắc Thiết Kế Khi Vẽ Class Diagram
4.1. Nguyên Tắc Single Responsibility (SRP)
Mỗi lớp chỉ nên có một lý do để thay đổi. Khi vẽ diagram, nếu một lớp chứa quá nhiều thuộc tính hoặc phương thức không liên quan, hãy tách ra thành các lớp riêng.
4.2. Nguyên Tắc Open/Closed (OCP)
Lớp nên mở để mở rộng, đóng để sửa đổi. Sử dụng kế thừa và interface để thực hiện việc mở rộng mà không thay đổi lớp hiện tại.

Có thể bạn quan tâm: Cách Vẽ Chữ “án” Đẹp, Chuẩn Và Độc Đáo: Hướng Dẫn Từ Cơ Bản Đến Nâng Cao
4.3. Nguyên Tắc Liskov Substitution (LSP)
Lớp con phải có thể thay thế lớp cha mà không làm hỏng chương trình. Khi thiết kế inheritance trong diagram, hãy chắc chắn rằng các phương thức của lớp con không vi phạm hành vi của lớp cha.
4.4. Nguyên Tắc Interface Segregation (ISP)
Không ép buộc một lớp phải triển khai các phương thức không cần thiết. Khi tạo interface, chỉ đưa vào các phương thức liên quan chặt chẽ.
4.5. Nguyên Tắc Dependency Inversion (DIP)
Các module cấp cao không nên phụ thuộc vào module cấp thấp mà nên phụ thuộc vào abstraction (interface). Trong diagram, sử dụng dependency và realization để thể hiện.

Có thể bạn quan tâm: Cách Vẽ Chữ Tfboys: Hướng Dẫn Chi Tiết Từng Bước Để Tự Tạo Kiệt Tác
5. Ví Dụ Thực Tế: Vẽ Class Diagram Cho Hệ Thống Quản Lý Bán Hàng
5.1. Phân Tích Yêu Cầu
- Quản lý khách hàng: Thêm, sửa, xóa, tìm kiếm.
- Quản lý sản phẩm: Thêm, sửa, xóa, tồn kho.
- Quản lý đơn hàng: Tạo, tính tổng, trạng thái.
- Thanh toán: Hỗ trợ nhiều phương thức (credit card, PayPal).
5.2. Xác Định Các Lớp Chính
| Lớp | Thuộc tính | Phương thức |
|---|---|---|
Customer |
- id: int, - name: String, - email: String, - phone: String |
+ register(), + login(), + updateInfo() |
Product |
- id: int, - name: String, - price: double, - stock: int |
+ adjustStock(qty:int), + getPrice(): double |
Order |
- id: int, - orderDate: Date, - status: OrderStatus, - items: List<OrderItem> |
+ addItem(product:Product, qty:int), + calculateTotal(): double, + place() |
OrderItem |
- product: Product, - quantity: int, - unitPrice: double |
+ getSubTotal(): double |
Payment (abstract) |
- amount: double, - paymentDate: Date |
+ process(): boolean |
CreditCardPayment |
- cardNumber: String, - cvv: String, - expiryDate: Date |
+ process(): boolean |
PayPalPayment |
- email: String |
+ process(): boolean |
InventoryManager |
- products: List<Product> |
+ checkStock(productId:int): int, + updateStock(productId:int, qty:int) |
CustomerRepository |
- customers: Map<int,Customer> |
+ findById(id:int): Customer, + save(customer:Customer) |
OrderRepository |
- orders: Map<int,Order> |
+ findById(id:int): Order, + save(order:Order) |
5.3. Vẽ Diagram
- Lớp
Customer,Product,Order,OrderItemở mức cao, mỗi lớp có các thuộc tính và phương thức như bảng trên. - Quan hệ:
OrderaggregationOrderItem(một đơn hàng có nhiều mục).OrderItemassociationProduct(một mục liên kết tới một sản phẩm).CustomerassociationOrder(khách hàng có thể có nhiều đơn hàng) – đa số1..phíaOrder.OrderdependencyPayment(đặt thanh toán khi đặt hàng).Paymentgeneralization thànhCreditCardPaymentvàPayPalPayment.InventoryManagerdependencyProduct(cập nhật tồn kho).-
CustomerRepositoryvàOrderRepositorydependency tớiCustomervàOrdertương ứng. -
Kế thừa:
-
Paymentlà abstract class, các lớp con kế thừa và thực thiprocess(). -
Ghi chú:
{unique email}đặt ở lớpCustomerđể chỉ email phải là duy nhất.{stock >= 0}ở lớpProductđể ràng buộc tồn kho không âm.
5.4. Kiểm Tra Độ Nhất Quán
- Không có vòng lặp kế thừa.
- Aggregation/composition hợp lý:
OrdercompositionOrderItem(không tồn tạiOrderItemnếuOrderbị xóa). - Dependency được sử dụng đúng chỗ:
Orderphụ thuộc vàoPaymentchỉ khi thực hiện thanh toán, không phải là một thuộc tính cố định.
6. Các Lỗi Thường Gặp Khi Vẽ Class Diagram Và Cách Khắc Phục

| Lỗi | Nguyên nhân | Cách khắc phục |
|---|---|---|
| Quá nhiều thuộc tính trong một lớp | Không tách trách nhiệm | Áp dụng SRP, tách ra thành lớp phụ (ví dụ: Address tách ra từ Customer). |
| Sử dụng quá nhiều inheritance | Thiết kế phức tạp, khó bảo trì | Xem xét dùng composition hoặc interface thay vì kế thừa sâu. |
| Thiếu đa số (multiplicity) | Không rõ quan hệ 1-1, 1-n, n-n | Luôn thêm nhãn 1, 0.., 1.. ở mỗi đầu đường liên kết. |
| Ghi nhầm direction của arrow | Nhầm mối quan hệ phụ thuộc | Nhớ rằng arrow luôn chỉ về phía “được phụ thuộc / được kế thừa”. |
| Không đồng nhất trong naming | Gây nhầm lẫn | Tuân thủ naming convention (CamelCase cho class, lowerCamelCase cho thuộc tính/phương thức). |
| Quên đánh dấu abstract class/interface | Không rõ lớp có thể khởi tạo hay không | Thêm <<abstract>> hoặc <<interface>> ở tiêu đề lớp. |
7. Tips Nâng Cao Để Tối Ưu Hóa Class Diagram
- Sử dụng Packages: Nhóm các lớp liên quan vào một package, giúp diagram sạch sẽ, dễ đọc.
- Layered Diagram: Đối với hệ thống lớn, chia diagram thành các lớp tầng (presentation, business, data access). Vẽ mỗi lớp tầng riêng, sau đó liên kết qua các interface.
- Sử dụng Color Coding: Màu sắc để phân biệt loại lớp (entity, service, controller, repository). Tuy nhiên, không nên lạm dụng, chỉ dùng để tăng tính trực quan.
- Sử dụng Stereotypes: Thêm
<<entity>>,<<controller>>,<<service>>để mô tả vai trò trong kiến trúc MVC. - Tự động sinh diagram từ code: Nhiều IDE và công cụ (e.g., Visual Studio, IntelliJ) hỗ trợ reverse engineering, giúp đồng bộ diagram với code.
- Version Control: Lưu diagram dưới dạng file XML (draw.io) hoặc .xmi để quản lý qua Git, tránh mất mát và dễ hợp tác.
8. Quy Trình Kiểm Thẩm (Review) Class Diagram
- Review tính đúng đắn: Kiểm tra xem mọi lớp, thuộc tính, phương thức có phản ánh yêu cầu không.
- Review tính nhất quán: Đảm bảo không có trùng lặp, tên thống nhất, quan hệ hợp lý.
- Review nguyên tắc OOP: Kiểm tra SRP, OCP, LSP, ISP, DIP.
- Review performance: Đánh giá xem có lớp nào gây overhead (ví dụ: quá nhiều lớp wrapper) không.
- Feedback từ team: Thu thập ý kiến của developer, tester, product owner.
- Cập nhật: Sửa đổi diagram dựa trên feedback, ghi chú phiên bản (v1.0, v1.1…).
9. Kết Luận
Việc vẽ class diagram không chỉ là một công việc kỹ thuật mà còn là nghệ thuật truyền đạt kiến trúc phần mềm một cách rõ ràng, ngắn gọn và chuẩn xác. Bắt đầu từ việc phân tích yêu cầu, xác định các lớp, định nghĩa thuộc tính và phương thức, cho tới thiết lập các mối quan hệ và kiểm tra nguyên tắc thiết kế, mỗi bước đều đóng góp vào việc xây dựng một bản thiết kế vững chắc, hỗ trợ quá trình phát triển, bảo trì và mở rộng phần mềm.
Hãy luôn nhớ:
- Giữ diagram sạch sẽ: Chỉ vẽ những lớp, thuộc tính, phương thức thực sự cần thiết.
- Tuân thủ nguyên tắc OOP: Đảm bảo tính mở rộng, tái sử dụng và giảm độ phụ thuộc.
- Kiểm tra và cập nhật liên tục: Phản hồi từ nhóm và thay đổi yêu cầu sẽ khiến diagram phải thay đổi, đừng để nó lỗi thời.
- Sử dụng công cụ phù hợp: Lựa chọn công cụ vẽ và quản lý version để đồng bộ với code và đội ngũ.
Khi bạn nắm vững quy trình và các nguyên tắc trên, việc vẽ class diagram sẽ trở nên nhanh chóng, hiệu quả và giúp dự án của bạn đạt được chất lượng cao hơn. Hãy thực hành thường xuyên, áp dụng vào các dự án thực tế và không ngừng cải thiện kỹ năng của mình. Chúc bạn thành công trong hành trình thiết kế phần mềm!
