Business logic bị trộn vào controller

Controller 1000 dòng – không rõ là API hay là… nghiệp vụ kế toán?

Khi nhìn vào một controller 1000 dòng, tôi chỉ muốn khóc thay cho team. Controller không chỉ nhận request, validate data, mà còn kiêm luôn xử lý logic nghiệp vụ, gọi database, và đôi khi cả gửi email. Hệ thống như một bát mì thập cẩm: ngon thì có, nhưng rối không chịu nổi.


Code smell: Controller ôm đồm mọi thứ

Controller nên chỉ nhận request, trả response, nhưng thực tế:
  • Validate lẫn logic: Controller vừa check input, vừa tính toán nghiệp vụ (ví dụ: tính giá đơn hàng).
  • Gọi thẳng DB: Query SQL dài hàng chục dòng nằm ngay trong controller.
  • Khó test, khó đọc: Code rối, không ai dám refactor vì sợ hỏng.

Hậu quả? Team mất hàng giờ để hiểu code, thêm feature mới thì như đi trên băng mỏng.

Giải pháp: Tách tầng Service và Repository

Để làm code sạch hơn:
  1. Áp dụng Service Layer:
    • Controller chỉ nhận request, validate, và trả response.
    • Service xử lý logic nghiệp vụ (ví dụ: tính giá, gửi email).
    • Repository xử lý truy vấn database.
  2. Cấu trúc rõ ràng:
    • Controller → gọi Service.
    • Service → gọi Repository.
    • Repository → trả dữ liệu từ DB.
  3. Viết test cho Service: Logic nghiệp vụ nằm trong Service, dễ viết unit test hơn.

Ví dụ: API /orders chỉ nên gọi OrderService.createOrder(), không nên chứa code tính giá hay query DB.

🎯 Tóm lại: Tách business logic ra Service và Repository giúp code dễ đọc, dễ test, dễ mở rộng. Đừng để controller thành “siêu nhân” ôm đồm mọi thứ.

Post a Comment

Mới hơn Cũ hơn