24/05/2018, 22:51

Thực hiện các Use Case

Use Case là những lời miêu tả độc lập với sự thực thi các chức năng của hệ thống. Điều đó có nghĩa là Use Case sẽ được thực hiện (thực thể hóa) trong hệ thống, vậy nên trách nhiệm để thực thi các hành động được miêu tả trong tài liệu Use Case đều được phân ...

Use Case là những lời miêu tả độc lập với sự thực thi các chức năng của hệ thống. Điều đó có nghĩa là Use Case sẽ được thực hiện (thực thể hóa) trong hệ thống, vậy nên trách nhiệm để thực thi các hành động được miêu tả trong tài liệu Use Case đều được phân bổ về cho các đối tượng cộng tác thực thi chức năng đó.

Các nguyên tắc của UML cho việc thực hiện các Use Case là: Một Use Case sẽ được thực hiện trong một sự cộng tác (collaboration): Một sự cộng tác chỉ ra một giải pháp (phụ thuộc vào sự thực thi nội bộ) của một Use Case sử dụng các khái niệm lớp/đối tượng và mối quan hệ giữa chúng đối với nhau (gọi là ngữ cảnhcontext của sự cộng tác) cũng như sự tương tác giữa chúng để đạt tới chức năng mong muốn (gọi là chuỗi tương tác của sự cộng tác). Kí hiệu cho sự cộng tác là một hình ellipse có chứa tên của sự cộng tác đó.

Một sự cộng tác được trình bày trong UML qua một loạt các biểu đồ chỉ ra cả ngữ cảnh lẫn chuỗi tương tác giữa các thành phần tham gia: thành phần tham gia trong một sự cộng tác là một loạt các lớp (và trong một thực thể cộng tác: các đối tượng). Các biểu đồ sử dụng ở đây là biểu đồ cộng tác, biểu đồ chuỗi và biểu đồ hoạt động. Cần phải sử dụng loại biểu đồ nào để tạo ra một bức tranh bao quát về sự cộng tác là quyết định tùy thuộc vào từng trường hợp cụ thể. Trong một vài trường hợp, chỉ một biểu đồ cộng tác đã có thể là đủ; nhưng trong các trường hợp khác, người ta nhất thiết cần tới sự kết hợp của nhiều loại biểu đồ khác nhau.

Một cảnh kịch (Scenario) là một thực thể (instance) của một Use Case hay là một sự cộng tác: một cảnh kịch là một chuỗi thực thi cụ thể (một dòng chảy cụ thể của các sự kiện) trình bày một sự thực thể hóa của một Use Case (tức là một lần sử dụng hệ thống). Khi một cảnh kịch được quan sát trong tư cách một Use Case, người ta chỉ miêu tả những ứng xử bên ngoài hướng về phía tác nhân. Khi quan sát một cảnh kịch trong tư cách là một thực thể của sự cộng tác, người ta sẽ miêu tả cả sự thực thi nội tại (các dòng lệnh code) của các lớp tham gia ở đây, thuật toán cũng như thủ tục của chúng cùng sự giao tiếp giữa chúng với nhau.

Tác vụ thực hiện một Use Case là chuyển các bước và hành động khác nhau trong lời miêu tả Use Case thành lớp (Class), thủ tục trong những lớp này cũng như quan hệ giữa chúng với nhau. Nó được miêu tả là động tác phân bổ trách nhiệm của mỗi bước đi trong Use Case vào các lớp tham gia sự cộng tác thực hiện Use Case đó. Tại giai đoạn này, người ta phải tìm ra một giải pháp cung cấp những hành vi hướng ngoại đã được xác định của Use Case; nó được miêu tả trong những thuật ngữ của một sự cộng tác nội bộ trong hệ thống.

Mỗi bước hành động trong Use Case sẽ được chuyển thành thủ tục (operation) trong các lớp tham gia. Một bước trong Use Case sẽ được chuyển thành một loạt các thủ tục tại nhiều lớp; rất hiếm khi xảy ra ánh xạ 1-1 giữa các hành động trong Use Case và các thủ tục được thực thi trong tương tác giữa các đối tượng của các lớp tham gia. Cũng xin nhớ rằng một lớp có thể tham gia nhiều Use Case khác nhau và trách nhiệm cao nhất của lớp nằm chính trong việc kết tập tất cả các vai trò mà lớp này đảm nhận trong các Use Case khác nhau.

Mối quan hệ giữa một Use Case và sự thực thi nó theo khái niệm cộng tác được chỉ ra hoặc qua một mối quan hệ nâng cao (refinement relationship) – biểu thị bằng đoạn thẳng chấm chấm với mũi tên - - - -> hay một hyperlink ngầm trong một công cụ nào đó. Một hyperlink trong một công cụ sẽ tạo điều kiện chuyển từ việc quan sát một Use Case trong một biểu đồ Use Case sang ngay sự cộng tác thực thi Use Case đó. Các hyperlink cũng được sử dụng để chuyển từ Use Case này sang một cảnh kịch (thường là một mô hình động – biểu đồ hoạt động, biểu đồ chuỗi hay biểu đồ cộng tác) miêu tả một sự thực hiện cụ thể nào đó của Use Case.

Phân bổ trách nhiệm cho các lớp một cách thành công là một tác vụ đòi hỏi kinh nghiệm. Cũng giống như mọi công đoạn hướng đối tượng khác, công việc này mang tính vòng lặp (iterative). Nhà phát triển thử nghiệm với nhiều sự phân bổ trách nhiệm khác nhau và dần dần nâng cấp chúng trong giải pháp của mình cho tới khi tạo ra được một mô hình thực hiện chức năng đó, đồng thời lại đủ mức độ năng động để cho phép tiến hành các sự thay đổi trong tương lai.

Jacobson sử dụng phương pháp định nghĩa ba loại đối tượng căn bản (có nghĩa là ba loại lớp): các đối tượng biên (boundary objects) , đối tượng chỉ huy (control objects) và đối tượng thực thể (entity objects). Đối với mỗi Use Case, các lọai đối tượng này được sử dụng để miêu tả một sự cộng tác thực thi Use Case. Trách nhiệm của các loại đối tượng kể trên như sau:

- Đối tượng thực thể: loại đối tượng này đại diện cho các thực thể của bài toán nằm trong phạm vi mà hệ thống xử lý. Thường chúng mang tính thụ động, theo khái niệm là chúng không tự gây nên các tương tác đối với chúng. Trong một hệ thống thông tin, các đối tượng thực thể thường mang tính trường tồn (persistent) và được lưu trữ trong một hệ ngân hàng dữ liệu. Các đối tượng thực thể thường tham gia vào nhiều Use Case khác nhau.

- Đối tượng biên: loại đối tượng này nằm gần đường ranh giới của hệ thống (mặc dù vẫn nằm bên trong hệ thống). Chúng tương tác với các tác nhân nằm bên ngoài hệ thống và nhận thông điệp cũng như gửi thông điệp đến các loại đối tượng khác nằm bên trong hệ thống.

- Đối tượng chỉ huy: loại đối tượng này chỉ huy sự tương tác giữa các nhóm đối tượng. Một đối tượng như thế có thể đóng vai trò "bộ phận điều khiển” cho toàn bộ một Use Case hoàn tất, hay nó có thể thực thi một chuỗi hành động chung của nhiều Use Case. Thường thì một đối tượng như vậy chỉ tồn tại trong quá trình thực thi Use Case.

Ba loại đối tượng này có ba kí hiệu khác nhau và có thể được sử dụng khi vẽ các loại biểu đồ miêu tả cộng tác hoặc biểu đồ lớp. Sau khi đã định nghĩa nhiều loại đối tượng khác nhau và xác nhận các cộng tác, người ta có thể để công đi tìm sự tương tự giữa chúng để một số lớp có thể được sử dụng trong một loạt các Use Case khác nhau. Sử dụng các Use Case theo phương thức này ta có thể tạo nên nền tảng cho việc phân tích và thiết kế hệ thống; qui trình phát triển được Ivar Jacobson gọi là "Qui Trình Phát Triển Theo Use Case" (Use case – driven).

Nhìn chung có nhiều phương pháp khác nhau để phân bổ trách nhiệm từ Use Case về cho các lớp. Có phương pháp đề nghị đầu tiên phải tiến hành phân tích phạm vi bài toán, chỉ ra tất cả các lớp thực thể (thuộc phạm vi bài toán) với mối quan hệ của chúng với nhau. Sau đó nhà phát triển sẽ phân tích từng Use Case và phân bổ trách nhiệm cho các lớp trong mô hình phân tích (analysis model), nhiều khi sẽ thay đổi chúng hoặc bổ sung thêm các lớp mới. Một phương pháp khác lại đề nghị là nên lấy các Use Case làm nền tảng để tìm các lớp, làm sao trong quá trình phân bổ trách nhiệm thì mô hình phân tích của phạm vi bài toán sẽ từng bước từng bước được thiết lập.

Một điểm quan trọng cần phải nhắc lại là công việc ở đây mang tính vòng lặp. Khi phân bổ trách nhiệm cho các lớp, ta có thể phát hiện ra sự thiếu đồng bộ hoặc lỗi trong các biểu đồ lớp và qua đó, dẫn đến việc sửa chữa trong biểu đồ lớp. Những lớp mới sẽ được nhận dạng và tìm ra nhằm mục đích hỗ trợ cho các Use Case. Trong một số trường hợp, thậm chí có thể xảy ra chuyện phải thay đổi hoặc sửa chữa cả biểu đồ Use Case vì khi hiểu hệ thống một cách sâu sắc hơn, nhà phát triển sẽ nhận ra rằng có một Use Case nào đó đã không được miêu tả chính xác và đúng đắn. Các Use Case giúp chúng ta tập trung vào khía cạnh chức năng của hệ thống, làm sao phải đảm bảo cho nó được miêu tả chính xác và được xây dựng chính xác trong hệ thống. Một trong những vấn đề xảy ra với nhiều phương pháp hướng đối tượng mà không sử dụng đến khái niệm Use Case là chúng tập trung quá nhiều vào cấu trúc tĩnh của các lớp và các đối tượng (nhiều khi người ta gọi là phương pháp mô hình hóa khái niệm – conceptual modeling) nhưng lại bỏ qua các khía cạnh chức năng và khía cạnh động của hệ thống.

0