Khi bạn đọc các blog và sách của Rails hoặc xem các cuộc nói chuyện hội nghị, bạn sẽ học được nhiều điều về cách làm cho các mô hình của mình trở nên mỏng manh hơn.
Những kỹ thuật này thật tuyệt vời, bởi vì các mô hình của bạn sẽ quá lớn hoặc phức tạp để xử lý. Nhưng bạn có thực sự muốn đi xa đến mức để các mô hình của bạn chỉ chịu trách nhiệm về tính bền bỉ, liên kết và xác nhận? Làm cách nào để bạn quyết định mức độ logic sẽ ở trong các mô hình ActiveRecord của mình?
Gầy. Nhưng không quá gầy.
Active Record là một mẫu hoạt động tốt nhất khi các mô hình của bạn khớp chặt chẽ với lược đồ cơ sở dữ liệu của bạn. Đó là những gì nó được thiết kế cho! Nhưng điều đó có nghĩa là gì?
-
Nếu một số mã hoạt động theo quan điểm của mô hình ActiveRecord, nó có thể đi vào mô hình.
-
Nếu một số mã hoạt động kéo dài nhiều bảng / đối tượng và không thực sự có chủ sở hữu rõ ràng, nó có thể đi vào Đối tượng dịch vụ.
-
Bất kỳ thứ gì giống thuộc tính (như thuộc tính được tính toán từ các liên kết hoặc các thuộc tính khác) sẽ được đưa vào mô hình ActiveRecord của bạn.
-
Nếu bạn có logic phải sắp xếp việc lưu hoặc cập nhật nhiều mô hình cùng một lúc, nó sẽ chuyển sang Đối tượng biểu mẫu ActiveModel.
-
Nếu mã chủ yếu dùng để hiển thị hoặc định dạng các mô hình trong một dạng xem, thì nó sẽ đi vào trình trợ giúp Rails hoặc Trình trình bày.
Ngoài các nguyên tắc đó, bạn nên sử dụng các quy tắc tương tự mà bạn sẽ sử dụng để cấu trúc lại bất kỳ lớp nào đang trở nên quá lớn. Nhưng nói chung, bạn không nên cảm thấy tệ khi rời khỏi một số logic trong các mô hình ActiveRecord của bạn. Họ muốn có nó!
Vì vậy, vì Rails đã chọn mẫu Active Record, nên bạn cần có một số logic trong các mô hình của mình. Nhưng tại sao Rails lại chọn mô hình đó thay vì một thứ gì đó sạch hơn?
Ruby sẽ làm gì?
Trong Các mẫu Kiến trúc Ứng dụng Doanh nghiệp, mẫu Bản ghi Hoạt động giữ vị trí trung gian giữa Cổng Dữ liệu Hàng và Người Lập bản đồ Dữ liệu. Cổng dữ liệu hàng là một trình bao bọc hướng đối tượng gần như ngu ngốc xung quanh các hàng của bảng, giống như mô hình mỏng nhất trong tất cả các mô hình có thể có. Công cụ lập bản đồ dữ liệu phức tạp hơn Bản ghi Hoạt động và chủ yếu được sử dụng để chuyển đổi giữa các đối tượng không chứa gì ngoài logic nghiệp vụ và các đối tượng không chứa gì ngoài logic bền vững.
Vì vậy, trong ngữ cảnh của Ruby, Active Record hoàn toàn là mẫu mặc định chính xác.
Tại sao tôi lại nói như vậy?
Ruby được thiết kế để làm cho các lập trình viên hài lòng. Khi buộc phải cân bằng giữa sự sạch sẽ và tiện lợi, hầu như nó luôn chọn sự tiện lợi.
Ý tôi là, Array
có hơn một trăm phương thức trong API công khai của nó. Nó có một tấn của các phương thức chỉ là bí danh của nhau. Bởi vì một số nhà phát triển chỉ thích viết .detect
thành .find
.
Trong bối cảnh đó, rất có lý khi Rails sẽ mặc định thành một mẫu thuận tiện hơn một mẫu linh hoạt hơn hoặc có độ tinh khiết hướng đối tượng hơn. Đó là cách của Ruby. Và tôi thích nó.
Bạn luôn có thể cấu trúc lại thành một thứ gì đó linh hoạt hơn khi bạn cần. Nhưng một lần nữa, YAGNI.