DEV Community

HCMUTE Project
HCMUTE Project

Posted on

Nguyên lý Controller trong GRASP Pattern

1. Định nghĩa

Controller là một mẫu thiết kế trong GRASP (General Responsibility Assignment Software Patterns) nhằm xác định đối tượng nào sẽ xử lý các yêu cầu từ người dùng trong hệ thống. Đây là một lớp trung gian, đóng vai trò điều phối giữa giao diện người dùng và các lớp nghiệp vụ.

2. Vai trò của Controller

Controller chịu trách nhiệm:

  • Nhận yêu cầu từ người dùng và gọi các phương thức phù hợp trên các lớp nghiệp vụ.
  • Giữ cho các lớp nghiệp vụ không phụ thuộc vào giao diện người dùng, giúp dễ bảo trì và mở rộng.
  • Kiểm soát luồng dữ liệu và đảm bảo tuân thủ nguyên tắc High CohesionLow Coupling.

3. Nguyên tắc thiết kế Controller hiệu quả

a. Áp dụng High Cohesion

  • Controller chỉ nên tập trung vào điều phối luồng xử lý, không nên thực hiện quá nhiều chức năng nghiệp vụ.
  • Không chứa logic liên quan đến giao diện người dùng hoặc truy xuất dữ liệu.

b. Giảm Coupling với Business Classes

  • Controller không nên chứa logic nghiệp vụ chi tiết mà chỉ chuyển tiếp yêu cầu đến các lớp thích hợp.
  • Tuân theo nguyên tắc Law of Demeter (Don't Talk to Strangers) để tránh gọi trực tiếp các phương thức từ nhiều lớp khác nhau.

c. Định danh theo Use Case

  • Thông thường, Controller được đặt tên theo Use Case, ví dụ: PlaceBetHandler, OrderHandler.
  • Điều này giúp dễ hiểu và duy trì hơn so với các tên chung chung như MainController.

4. Ví dụ minh họa

Giả sử trong hệ thống đặt cược, có Use Case "Đặt cược" (Place Bet) với các bước:

  1. Hiển thị thông tin cuộc đua (displayRaceDetails())
  2. Chọn cuộc đua (selectRace())
  3. Nhập thông tin đặt cược (enterBet())

Thay vì để lớp Race xử lý việc hiển thị chi tiết cuộc đua, chúng ta sẽ sử dụng Controller PlaceBetHandler để điều phối yêu cầu:

public class PlaceBetHandler {
    private RaceService raceService;
    private BetService betService;

    public PlaceBetHandler(RaceService raceService, BetService betService) {
        this.raceService = raceService;
        this.betService = betService;
    }

    public void displayRaceDetails(int raceId) {
        Race race = raceService.getRaceById(raceId);
        System.out.println(race.getDetails());
    }

    public void enterBet(int raceId, double amount) {
        betService.placeBet(raceId, amount);
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Lợi ích của Controller trong GRASP

  • Tách biệt giao diện người dùng và lớp nghiệp vụ, giúp hệ thống linh hoạt hơn khi thay đổi UI hoặc backend.
  • Dễ bảo trì và mở rộng, vì mọi logic điều phối tập trung trong một lớp duy nhất.
  • Cải thiện tính tái sử dụng, vì các lớp nghiệp vụ không bị ràng buộc với giao diện cụ thể.

6. Kết luận

Mẫu thiết kế Controller trong GRASP giúp xây dựng hệ thống có kiến trúc rõ ràng, dễ bảo trì và mở rộng. Khi áp dụng, cần kết hợp với các nguyên tắc High Cohesion, Low CouplingLaw of Demeter để đảm bảo hiệu quả thiết kế.

Top comments (0)