Thực tiễn cho các mô hình miền trong Javascript (có khung)


8

Đâ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.


Là câu hỏi của bạn nhiều hơn về cách bạn quản lý các cá thể đối tượng ở phía JS cho các thành phần tách rời hoặc nhiều hơn về giao tiếp giữa máy khách và máy chủ? Ngoài ra, liên quan đến 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ộ.
Darien

Đó là về việc nên sử dụng các đối tượng được xác định trong JS (như trong ví dụ) hoặc một đối tượng ẩn danh với các trường được điền động
Andy Hunt

Câu trả lời:


0

Tôi nghĩ rằng các mẫu thiết kế tốt và một khung như Breeze có thể giúp bạn hiểu. Không lặp lại mô hình miền trên máy khách một lần nữa, để nó trên máy chủ nhưng sử dụng Breeze để kéo mô hình đến máy khách.

Dưới đây là một ví dụ tuyệt vời về việc sử dụng breezejs với kho lưu trữ và đơn vị mẫu công việc.

https://github.com/yagopv/DurandalAuth

Mô hình miền được giữ trên máy chủ và dễ dàng đọc siêu dữ liệu và tạo các thực thể cục bộ từ máy chủ. Tôi nghĩ rằng đây là một giải pháp tuyệt vời cho vấn đề của bạn. Bạn nhận được quyền truy cập loại khung thực thể cục bộ thông qua JS và bạn có thể giữ mô hình của mình trên máy chủ. Tôi nghĩ rằng nó đánh vào sự cân bằng tốt của các vấn đề bạn đưa ra trong câu hỏi của bạn.


2
Làm thế nào để trả lời câu hỏi này? Khi nó đứng, điều này đọc giống như một thư rác.
gnat

1
Đó là một câu trả lời khá trực tiếp. Câu hỏi là lặp lại mô hình miền trên máy khách một lần nữa. Câu trả lời của tôi là không để nó trên máy chủ nhưng người dùng dễ dàng kéo mô hình đến máy khách. Tôi không liên kết với làn gió nhẹ. Tôi chỉ tìm thấy các khung hữu ích.
Roger Brogan

3

Câu hỏi thực tế của bạn khá chung chung nên rất khó trả lời, nhưng ví dụ xác thực mẫu của bạn cụ thể hơn một chút, vì vậy tôi sẽ cố gắng gắn bó với câu hỏi đó.

Như bạn đã nói, bạn nên luôn luôn KHÔ, càng nhiều càng tốt. Đó là một điều tốt để ghi nhớ như là một nhà phát triển. Tuy nhiên, bạn nên phân biệt giữa những thứ giống nhau và bạn nên tránh lặp lại chúng với những thứ chúng làm tương tự, nhưng chúng có Mục đích khác nhau .

Hãy lấy ví dụ xác nhận mẫu của bạn. Mục đích của mã xác thực của bạn trên máy chủ là để đảm bảo rằng bạn có địa chỉ email của người dùng chẳng hạn để đưa vào cơ sở dữ liệu. Vì vậy, quá trình đăng ký của bạn phải có địa chỉ email của người dùng, bạn sẽ kiểm tra xem trong quá trình đăng ký.

Nhưng mục đích của mã JavaScript phía máy khách của bạn là gì? Có, nó thực hiện xác nhận trên trường nhập email, nhưng toàn bộ ý tưởng là: Để kiểm tra xem người dùng đã nhập địa chỉ email của họ chưa, nếu không hiển thị cho họ một cảnh báo TRƯỚC KHI gửi nó đến máy chủ! Vì vậy, mục đích của xác thực biểu mẫu phía máy khách của bạn là dừng gửi dữ liệu vô dụng đến máy chủ và hiển thị thông báo lỗi sau vài giây để gửi lại mẫu đơn. Tại sao? bởi vì nó gây khó chịu cho người dùng. Bây giờ bạn có nghĩ rằng bạn chỉ nên giữ chức năng xác thực mẫu của mình trên máy chủ không? Không, bởi vì họ có mục đích khác nhau.

Mục đích của xác thực mẫu ở phía máy khách không phải là tôi không thể tin tưởng người dùng, chúng ta hãy kiểm tra nó , nhưng đó là một điều UX mà bạn đang cố gắng tránh giao tiếp với máy chủ chỉ để nhận thông báo lỗi xác thực; Tuy nhiên, mục đích của xác thực mẫu ở phía máy chủ là tôi không thể tin tưởng người dùng, hãy xem họ đang yêu cầu tôi làm gìNgười dùng cũng có thể là một yêu cầu API - mà không cần bất kỳ người dùng nào của con người về phía khách hàng

Nếu bạn nhìn vào nó như thế này, ví dụ xác thực mẫu của bạn sẽ hoàn toàn ổn, mà không khiến bạn cảm thấy WET.

Về câu hỏi thực tế của bạn, đừng cố giữ mọi thứ trên máy chủ hoặc mọi thứ trên máy khách; Nó thực sự phụ thuộc vào nhiệm vụ. Giả sử nếu tôi cần phân tích một tệp CSV lớn cho người dùng và tôi chỉ có một trăm người dùng trên trang web và tôi biết rằng tôi có người dùng di động, thì tôi có thể phân tích tệp đó trên máy chủ và sau đó xuất ra một cách dễ dàng -to-digest markup cho khách hàng. Tuy nhiên, nếu tôi có hàng triệu người dùng, thì tôi sẽ thử phân tích tệp trên máy của họ - sử dụng trình duyệt web của họ để sử dụng sức mạnh xử lý của họ để tránh làm cháy máy chủ của chúng tôi. Vì vậy, chức năng phân tích cú pháp có thể là trên máy chủ hoặc máy khách, bất cứ điều gì có ý nghĩa hơn.

Tuy nhiên, nếu bạn không chắc chắn giữ đồ đạc của mình ở đâu, thì tôi sẽ nói giữ chúng trên máy chủ và sau đó phục vụ kết quả cho người dùng - tránh mã trùng lặp trên cả máy chủ và máy khách.


Rất muốn biết lý do tại sao câu trả lời đã bỏ phiếu. Tôi thực sự đánh giá cao nếu bạn chia sẻ suy nghĩ của bạn là tốt.
Mahdi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.