Khi thiết kế hệ thống phần mềm, sơ đồ Use Case là công cụ không thể thiếu giúp chúng ta mô tả cách người dùng tương tác với hệ thống. Nhưng nếu chỉ đơn thuần vẽ các Use Case độc lập, mô hình sẽ trở nên rời rạc, khó mở rộng và khó quản lý. Đây là lúc hai mối quan hệ quan trọng Include và Extend phát huy tác dụng.
Hãy tưởng tượng bạn đang xây dựng một hệ thống đặt hàng trực tuyến. Một số chức năng có thể chia sẻ hoặc phụ thuộc vào nhau. Làm sao để thể hiện điều đó một cách logic và hiệu quả? Hãy cùng tìm hiểu!
1. Hiểu về Use Case và Quan Hệ Giữa Các Use Case
Use Case là gì?
Use Case là một kịch bản mô tả cách một tác nhân (actor) tương tác với hệ thống để đạt được mục tiêu cụ thể. Ví dụ: trong hệ thống mua hàng, các Use Case có thể là Đặt hàng, Thanh toán, Kiểm tra giỏ hàng, v.v.
Nhưng trong thực tế, một số Use Case có những phần chung lặp lại, hoặc có những chức năng mở rộng chỉ được kích hoạt trong điều kiện đặc biệt. Để tổ chức chúng hợp lý, UML cung cấp hai loại quan hệ đặc biệt:
Include: Dùng để tái sử dụng các Use Case chung.
Extend: Dùng để mở rộng Use Case trong một số điều kiện nhất định.
2. Mối Quan Hệ Include – Khi Một Use Case Cần Chia Sẻ Hành Vi Chung
Khái niệm
Quan hệ Include thể hiện việc một Use Case bắt buộc phải gọi một Use Case khác để hoàn thành nhiệm vụ của nó.
🔹 Cách nhận biết: Khi có một đoạn chức năng lặp đi lặp lại ở nhiều Use Case khác nhau, ta có thể tách nó ra thành một Use Case riêng rồi “Include” vào các Use Case cần sử dụng nó.
Ví dụ thực tế
Giả sử trong hệ thống đặt hàng, có các Use Case sau:
Đặt hàng
Thanh toán đơn hàng
Hủy đơn hàng
Cả ba Use Case này đều yêu cầu kiểm tra thông tin khách hàng. Thay vì lặp lại bước này trong từng Use Case, ta tạo một Use Case riêng gọi là “Xác minh thông tin khách hàng” và sử dụng quan hệ Include.
📌 Mô hình UML
[Đặt hàng] ---<<include>>---> [Xác minh thông tin khách hàng]
[Thanh toán đơn hàng] ---<<include>>---> [Xác minh thông tin khách hàng]
[Hủy đơn hàng] ---<<include>>---> [Xác minh thông tin khách hàng]
Khi nào nên dùng Include?
✅ Khi có một Use Case chung xuất hiện trong nhiều Use Case khác nhau.
✅ Khi muốn tránh lặp code và làm hệ thống rõ ràng hơn.
✅ Khi chức năng được gọi là bắt buộc phải có.
3. Mối Quan Hệ Extend – Khi Một Use Case Cần Được Mở Rộng Trong Một Số Trường Hợp
Khái niệm
Quan hệ Extend thể hiện một Use Case mở rộng chức năng của một Use Case khác, nhưng chỉ trong một số điều kiện nhất định.
🔹 Cách nhận biết: Khi một chức năng không phải lúc nào cũng xảy ra, chỉ được kích hoạt dựa trên một điều kiện cụ thể, thì ta sử dụng Extend.
Ví dụ thực tế
Giả sử trong hệ thống đặt hàng, ta có Use Case Thanh toán đơn hàng. Trong một số trường hợp, khách hàng có thể chọn sử dụng Mã giảm giá, nhưng không phải ai cũng có mã giảm giá. Vậy, ta không nên gộp “Sử dụng mã giảm giá” vào “Thanh toán đơn hàng”, mà nên sử dụng quan hệ Extend.
📌 Mô hình UML
[Thanh toán đơn hàng] ---<<extend>>---> [Sử dụng mã giảm giá]
✅ Ở đây, “Sử dụng mã giảm giá” không phải lúc nào cũng xảy ra, mà chỉ được kích hoạt nếu khách hàng có mã giảm giá.
Khi nào nên dùng Extend?
✅ Khi một Use Case chỉ xảy ra trong một số điều kiện nhất định.
✅ Khi không muốn làm phức tạp Use Case chính bằng các chức năng phụ trợ.
✅ Khi muốn mô tả rõ ràng điều kiện nào kích hoạt một Use Case mở rộng.
4. So Sánh Include và Extend – Khi Nào Dùng Cái Nào?
Tiêu chí | Include | Extend |
---|---|---|
Bản chất | Tái sử dụng một phần chức năng chung | Mở rộng chức năng khi có điều kiện |
Bắt buộc? | Bắt buộc | Không bắt buộc |
Ứng dụng | Khi nhiều Use Case có chung một phần chức năng | Khi một chức năng chỉ xảy ra trong một số trường hợp |
Hướng quan hệ | Một chiều (Use Case chính gọi Use Case chung) | Một chiều (Use Case mở rộng chỉ được kích hoạt trong một số điều kiện) |
Ví dụ | Xác minh thông tin khách hàng | Sử dụng mã giảm giá trong thanh toán |
5. Lời Kết – Ứng Dụng Include và Extend Trong Dự Án Thực Tế
Việc hiểu rõ Include và Extend giúp chúng ta tổ chức hệ thống một cách hợp lý, giảm trùng lặp và làm cho sơ đồ Use Case dễ hiểu hơn.
👉 Khi thiết kế hệ thống thực tế, hãy luôn đặt câu hỏi:
✔️ Chức năng này có được dùng chung nhiều nơi không? → Nếu có, hãy tách nó ra và dùng Include.
✔️ Chức năng này có phải lúc nào cũng xảy ra không? → Nếu không, hãy dùng Extend.
Chỉ cần hiểu đúng bản chất của hai mối quan hệ này, bạn sẽ có một sơ đồ Use Case rõ ràng, trực quan và dễ bảo trì hơn rất nhiều. 🚀