Đây là câu hỏi tôi đã từng tìm hiểu một thời gian, đã tìm kiếm và không tìm thấy gì về: những thực tiễn được chấp nhận xung quanh việc sao chép mô hình miền trong Javascript cho ứng dụng web, khi sử dụng khung như Backbone hay gõ cửa?
Đưa ra một ứng dụng web có kích thước không tầm thường với một tập các mô hình miền ở phía máy chủ, chúng ta có nên sao chép các mô hình này trong ứng dụng web không (xem ví dụ ở phía dưới)? Hay chúng ta nên sử dụng tính chất động để tải các mô hình này từ máy chủ?
Theo tôi, các đối số để sao chép các mô hình là trong việc giảm bớt xác thực các trường, đảm bảo rằng các trường dự kiến sẽ có mặt trên thực tế, v.v ... Cách tiếp cận của tôi là coi mã phía máy khách như một ứng dụng gần như riêng biệt, làm những việc tầm thường chính nó và chỉ dựa vào máy chủ cho dữ liệu và các hoạt động phức tạp (yêu cầu dữ liệu mà phía khách hàng không có). Tôi nghĩ rằng việc xử lý mã phía máy khách như thế này giống như phân tách giữa các thực thể với ORM và các mô hình được sử dụng với chế độ xem trong lớp UI: chúng có thể có cùng các trường và liên quan đến cùng một khái niệm miền, nhưng chúng khác biệt nhiều thứ.
Mặt khác, đối với tôi, việc sao chép các mô hình này ở phía máy chủ là vi phạm rõ ràng về DRY và có khả năng dẫn đến các kết quả khác nhau ở phía máy khách và phía máy chủ (nơi một phần được cập nhật nhưng phần kia không được cập nhật ). Để tránh vi phạm DRY này, chúng tôi chỉ cần sử dụng tính năng động của Javascripts để lấy tên trường và dữ liệu từ máy chủ và khi chúng được xem.
Vì vậy: có bất kỳ hướng dẫn được chấp nhận xung quanh khi nào (và khi không) lặp lại chính mình trong những tình huống này? Hay đây là một điều hoàn toàn chủ quan, dựa trên dự án và nhà phát triển?
Thí dụ
Mô hình phía máy chủ
class M
{
int A
DateTime B
int C
int D = (A*C)
double SomeComplexCalculation = ServiceLayer.Call();
}
Mô hình phía khách hàng
function M(){
this.A = ko.observable();
this.B = ko.observable();
this.C = ko.observable();
this.D = function() { return A() * C(); }
this.SomeComplexCalculation = ko.observalbe();
return this;
}l
M.GetComplexValue = function(){
this.SomeComplexCalculation(Ajax.CallBackToServer());
};
Tôi nhận ra câu hỏi này khá giống với câu hỏi này , nhưng tôi nghĩ rằng đây là vấn đề gần như hoàn toàn đối với ứng dụng web từ máy chủ, trong đó câu hỏi chỉ nói về việc này chỉ trong trường hợp tính toán phức tạp.
M.getComplexValue()
, bạn có thể muốn xem xét mẫu "Lời hứa" như một cách để giảm thiểu địa ngục gọi lại trong khi cho phép tất cả các hoạt động (không có khả năng) không đồng bộ.