GRASP – Controller

Use-case là gì? (Nếu bạn đã hiểu khái niệm này có thể bỏ qua)
Use case là một thuật ngữ mang ý nghĩa là một yêu cầu chúc năng của hệ thống. Use case mô tả sự tương tác giữa các tác nhân bên ngoài (actor – thí dụ như người dùng hay một request từ ngoài) và hệ thống. Use case mô tả các yêu cầu của hệ thống phải làm gì, chứ không mô tả hệ thống làm thế nào. Mỗi use case sẽ mô tả cách thức actor tương tác với hệ thống để đạt được mục tiêu nào đó dùng ngôn ngữ của người sử dụng và tránh dùng thuật ngữ.
Ví dụ: Use case rút tiền từ máy ATM:
– Người dùng đưa thẻ ATM vào máy / hệ thống
– Kế tiếp, người dùng nhập mật mã
– Kế tiếp, người dùng chọn chức năng rút tiền
– Kế tiếp, người dùng xác định số tiền cần rút
– Cuối cùng, người dùng nhận lại tiền và thẻ
Chúng ta có thể thấy ở trên chỉ là các bước cần thiết để giao tiếp giữa người và máy cho usecase rút tiền, không hề có một chỉ dẫn cho hệ thống phải làm gì thí dụ như kiểm tra password hay kiểm tra số tiền thừa hoặc người dùng phải bấm nút gì, mục nào …
Mục đích của cách viết usecase như vậy là để phát biểu yêu cầu được khái quát nhất có thể, ít bị phụ thuộc vào các thay đổi chi tiết của hệ thống và làm cho lập trình viên dễ hình dung nghiệp vụ chính, không bị sa đà vào các chi tiết phụ.

Class nào nên giữ trách nhiệm xử lý một system event?
Một event hệ thống (system event) là một event ở tầng cao được tạo ra bởi các tác động bên ngoài hệ thống. Các event này liên kết với hoạt động điều hành trong hệ thống để trả về kết quả. Thí dụ, khi một user click vào nút “Submit Order” có nghĩa là người đó đã kích hoạt một event hệ thống để chỉ định rằng “order đã được submit”. Tương tự, giả sử nếu người dùng bấm nút “View Product Info” nghĩa là anh ta đã kích hoạt một event hệ thống chỉ định “Hiển thị thông tin về mặt hàng”.
Một Controller là một object:
(1) Không phải là một object trên giao diện (user interface object – thí dụ như button, window …)
(2) Giữ trách nhiệm xử lý một system event
(3) Định nghĩa các method cho hoạt động của hệ thống.
Các tiêu chuẩn để xác định một Controller class:
+ Đại diện cho toàn bộ hệ thống (Facade Controller)
+ Đại diện cho toàn bộ các nghiệp vụ của hệ thống
+ Đại diện cho những thứ mang tính chất như trạng thái tham gia và ảnh hưởng vào hoạt động của một task (role controller)
+ Những handler người dùng tạo ra để xử lý các tất cả system event phục vụ cho một use case (use-case controller)
Ví dụ: Trong trò chơi Cá Ngựa bao gồm nhiều class, trong đó:
+ Class Game đại diện cho toàn bộ hệ thống
+ Class GameManager đại diện cho toàn bộ nghiệp vụ của hệ thống bao gồm khởi tạo trò chơi, xác định người thắng, luật chơi …
+ Player đại diện cho những thứ mang trạng thái tham gia và ảnh hưởng vào hoạt động của một task
+ PlayerHandler được người dùng tạo ra để xử lý hoạt động cho một use-case
Những class này không xử lý trực tiếp các request mà sẽ bổ nhiệm nhiệm vụ này cho class khác thực hiện. Nói cách khác, Controller là class định hướng các hoạt động của hệ thống.

Bạn có thể tham khảo một controller dưới đây:

Việc xác định một controller trong một tình huống cụ thể sẽ ảnh hưởng đến và bị ảnh hưởng bởi các tiêu chuẩn Low Coupling và High Cohesion. Vì vậy, việc chọn lựa controller luôn là vấn đề gây nhiều tranh cãi trong thiết kế nói chung. Tuy nhiên, với việc ra đời của các mô hình phần mềm như MVC, MVVM hay event based … vấn đề đã được thu gọn lại và đơn giản hóa rất nhiều. Ở các mô hình này, các controller dường như đã có một nơi định nghĩa sẵn cho mình mà người thiết kế hầu như không cần phải suy nghĩ nữa. Vì vậy, mình tạm ngừng bài này ở đây để hẹn các bạn vào một bài viết mới tập trung hơn và thiết thực hơn về các mô hình MVC và MVVM.

No Comments

Post A Comment