Rails: Triển khai đối tượng Policy

Tram Ho

Bài viết này yêu cầu bạn cần có kiến thức về hướng đối tượng, Ruby và Ruby on Rails.

Mẫu thiết kế policy object là gì?

Các đối tượng Policy đóng gói và thể hiện một quy tắc nghiệp vụ duy nhất.

Trong các ứng dụng của mình, chúng ta có thể có các quy tắc nghiệp vụ khác nhau được mã hóa chủ yếu dưới dạng if – else hoặc câu lệnh switch. Các quy tắc này đại diện cho các khái niệm trong miền (domain) của bạn, ví dụ như:

  • Liệu “khách hàng có đủ điều kiện để được giảm giá hay không?”
  • Liệu “email có được gửi hay không?”
  • Liệu “người chơi có được tặng điểm hay không?”

Nguồn: Bài viết này

Bắt đầu thôi nào! (Tác giả sử dụng Rails API làm ví dụ nhưng bài viết này cũng có thể được triển khai trong Rails bình thường)

1. Đặt vấn đề

Giả sử chúng ta có bộ điều khiển (controller) sau:

Bạn đặt tất cả các logic policy (quy tắc nghiệp vụ) trong controller của mình. Đây không phải là một giải pháp tốt. Đặc biệt trong trường hợp bạn phải xử lý nhiều logic phức tạp (controller nên chỉ sử dụng để điều hướng, tránh xử lý nhiều logic phức tạp).

Nhưng, ta có thể bỏ qua class GenerateDiscountVoucherCode. Ta chỉ cần biết là lớp này chịu trách nhiệm tạo ra mã voucher giảm giá.

2. Di chuyển logic Policy vào trong model

Well, chúng ta có thể chuyển logic policy vào trong model. Vì thế, nó chuyển thành như vầy:

app/controllers/discounts_controller.rb

app/models/user.rb

Nhưng đây vẫn chưa phải giải pháp tối ưu. Việc thêm logic policy object mặc dù đã giúp tối ưu controller nhưng lại làm phồng model. Bây giờ, hãy triển khai mẫu thiết kế policy object!

3. Tạo một lớp riêng biệt

Bây giờ, ta sẽ tạo một lớp riêng biệt chứa các logic policy như sau:

Như vậy, controller và model sẽ trông như sau:

app/controllers/discounts_controller.rb

app/models/user.rb

4. Tổng kết

So với controller ban đầu của chúng ta, việc này “chỉ là” đặt logic policy vào một class riêng. Đó là sự thật, vì mục đích chính của chúng ta là chuyển logic policy ra khỏi controller và model.

Các đối tượng policy đóng gói và thể hiện một quy tắc nghiệp vụ duy nhất.

Bạn sẽ thấy mẫu thiết kế này hữu ích trong trường hợp bạn có logic policy phức tạp. Ví dụ mà tác giả đưa ra là một logic policy đơn giản.

Tài liệu tham khảo

Bài viết trên được dịch từ nguồn Rails: Policy Objects Implementation

Cảm ơn các bạn đã đọc bài, chúc các bạn có một ngày làm việc hiệu quả

Chia sẻ bài viết ngay