Tôi đã sử dụng MVP và MVC trong quá khứ và tôi thích MVP hơn vì nó kiểm soát luồng thực thi tốt hơn theo quan điểm của tôi.
Tôi đã tạo cơ sở hạ tầng của mình (kho dữ liệu / lớp kho lưu trữ) và sử dụng chúng mà không gặp vấn đề gì khi mã hóa dữ liệu mẫu cứng, vì vậy bây giờ tôi đang chuyển sang GUI và chuẩn bị MVP của mình.
Mục A
Tôi đã thấy MVP sử dụng khung nhìn làm điểm vào, đó là trong phương thức xây dựng khung nhìn, nó tạo ra người trình bày, từ đó tạo ra mô hình, nối các sự kiện khi cần.
Tôi cũng đã xem người trình bày là điểm vào, trong đó một khung nhìn, mô hình và người trình bày được tạo ra, người trình bày này sau đó được đưa ra một khung nhìn và đối tượng mô hình trong hàm tạo của nó để kết nối các sự kiện.
Như trong 2, nhưng mô hình không được chuyển cho người trình bày. Thay vào đó, mô hình là một lớp tĩnh nơi các phương thức được gọi và các phản hồi được trả về trực tiếp.
Mục B
Về mặt giữ quan điểm và mô hình đồng bộ tôi đã thấy.
Bất cứ khi nào một giá trị trong chế độ xem thay đổi, tức là
TextChanged
sự kiện trong .Net / C #. Điều này kích hoạt mộtDataChangedEvent
cái được truyền qua mô hình, để giữ cho nó đồng bộ mọi lúc. Và khi mô hình thay đổi, tức là một sự kiện nền mà nó lắng nghe, thì khung nhìn được cập nhật thông qua cùng một ý tưởng nâng cao aDataChangedEvent
. Khi người dùng muốn cam kết thay đổi,SaveEvent
nó sẽ kích hoạt, chuyển qua mô hình để thực hiện lưu. Trong trường hợp này, mô hình bắt chước dữ liệu của chế độ xem và xử lý các hành động.Tương tự như # b1, tuy nhiên, chế độ xem không đồng bộ hóa với mô hình mọi lúc. Thay vào đó khi người dùng muốn thực hiện các thay đổi,
SaveEvent
sẽ bị sa thải và người trình bày nắm bắt các chi tiết mới nhất và chuyển chúng vào mô hình. trong trường hợp này, mô hình không biết về dữ liệu khung nhìn cho đến khi bắt buộc phải hành động theo nó, trong trường hợp đó, nó được chuyển qua tất cả các chi tiết cần thiết.
Mục C
Hiển thị các đối tượng kinh doanh trong dạng xem, tức là một đối tượng (MyClass) không phải dữ liệu nguyên thủy (int, double)
Khung nhìn có các trường thuộc tính cho tất cả dữ liệu của nó mà nó sẽ hiển thị dưới dạng các đối tượng miền / doanh nghiệp. Chẳng hạn như
view.Animals
hiển thị một thuộcIEnumerable<IAnimal>
tính, mặc dù chế độ xem xử lý các thuộc tính này thành các Nút trong TreeView. Sau đó, đối với động vật được chọn, nó sẽ phơi bàySelectedAnimal
nhưIAnimal
tài sản.Khung nhìn không có kiến thức về các đối tượng miền, nó chỉ hiển thị thuộc tính cho các kiểu đối tượng nguyên thủy / khung (.Net / Java). Trong trường hợp này, người trình bày sẽ truyền một đối tượng bộ điều hợp cho đối tượng miền, bộ điều hợp sau đó sẽ dịch một đối tượng kinh doanh nhất định thành các điều khiển hiển thị trên khung nhìn. Trong trường hợp này, bộ điều hợp phải có quyền truy cập vào các điều khiển thực tế trên chế độ xem, không chỉ bất kỳ chế độ xem nào trở nên gắn kết chặt chẽ hơn.
Mục D
Nhiều khung nhìn được sử dụng để tạo một điều khiển duy nhất. tức là Bạn có một chế độ xem phức tạp với một mô hình đơn giản như lưu các đối tượng thuộc các loại khác nhau. Bạn có thể có một hệ thống menu ở bên cạnh với mỗi lần nhấp vào một mục, các điều khiển thích hợp được hiển thị.
Bạn tạo một chế độ xem lớn, chứa tất cả các điều khiển riêng lẻ được hiển thị qua giao diện chế độ xem.
Bạn có nhiều quan điểm. Bạn có một chế độ xem cho menu và bảng điều khiển trống. Chế độ xem này tạo các chế độ xem khác được yêu cầu nhưng không hiển thị chúng (hiển thị = sai), chế độ xem này cũng thực hiện giao diện cho mỗi chế độ xem mà nó chứa (tức là chế độ xem con) để nó có thể hiển thị cho một người thuyết trình. Bảng trống được lấp đầy với các khung nhìn khác (
Controls.Add(myview)
) và ((myview.visible = true
). Các sự kiện được nêu trong các cuộc phỏng vấn "trẻ em" này được xử lý theo quan điểm của phụ huynh, từ đó chuyển sự kiện đến người trình bày và ngược lại để cung cấp các sự kiện trở lại cho các yếu tố con.Mỗi chế độ xem, có thể là chính của phụ huynh hoặc các chế độ xem con nhỏ hơn, mỗi chế độ được kết nối với người trình bày và mô hình riêng. Bạn hoàn toàn có thể thả một điều khiển xem vào một biểu mẫu hiện có và nó sẽ có chức năng sẵn sàng, chỉ cần nối dây vào một người thuyết trình đằng sau hậu trường.
Mục E
Nếu mọi thứ đều có giao diện, bây giờ dựa trên cách MVP được thực hiện trong các ví dụ trên sẽ ảnh hưởng đến câu trả lời này vì chúng có thể không tương thích chéo.
Mọi thứ đều có giao diện, View, Presenter và Model. Mỗi trong số đó rõ ràng có một triển khai cụ thể. Ngay cả khi bạn chỉ có một cái nhìn cụ thể, mô hình và người trình bày.
Khung nhìn và Model có giao diện. Điều này cho phép các quan điểm và mô hình khác nhau. Người trình bày tạo / được đưa ra khung nhìn và các đối tượng mô hình và nó chỉ phục vụ để truyền các thông điệp giữa chúng.
Chỉ có View có giao diện. Mô hình có các phương thức tĩnh và không được tạo, do đó không cần giao diện. Nếu bạn muốn một mô hình khác, người trình bày gọi một tập các phương thức lớp tĩnh khác. Là tĩnh Mô hình không có liên kết đến người trình bày.
Suy nghĩ cá nhân
Từ tất cả các biến thể khác nhau mà tôi đã trình bày (hầu hết tôi có thể đã sử dụng ở một số hình thức) mà tôi chắc chắn có nhiều hơn. Tôi thích A3 vì giữ logic kinh doanh có thể tái sử dụng bên ngoài chỉ MVP, B2 để ít trùng lặp dữ liệu và ít sự kiện hơn được thực hiện. C1 vì không thêm vào một lớp khác, chắc chắn rằng nó đặt một lượng nhỏ logic không thể kiểm tra đơn vị vào một khung nhìn (cách một đối tượng miền được trực quan hóa) nhưng điều này có thể được xem xét mã hoặc đơn giản là xem trong ứng dụng. Nếu logic phức tạp, tôi sẽ đồng ý với một lớp bộ điều hợp nhưng không phải trong mọi trường hợp. Đối với phần D, tôi cảm thấy D1 tạo ra một khung nhìn quá lớn cho một ví dụ về menu. Tôi đã sử dụng D2 và D3 trước đây. Vấn đề với D2 là cuối cùng bạn phải viết rất nhiều mã để định tuyến các sự kiện đến và từ người trình bày đến chế độ xem con chính xác và không tương thích kéo / thả, mỗi điều khiển mới cần thêm dây vào để hỗ trợ người trình bày duy nhất. D3 là lựa chọn ưa thích của tôi nhưng thêm vào nhiều lớp hơn là người thuyết trình và người mẫu để xử lý chế độ xem, ngay cả khi chế độ xem xảy ra rất đơn giản hoặc không cần phải sử dụng lại. tôi nghĩ rằng một hỗn hợp của D2 và D3 là tốt nhất dựa trên hoàn cảnh. Đối với phần E, tôi nghĩ mọi thứ có giao diện đều có thể quá mức tôi đã làm điều đó cho các đối tượng miền / doanh nghiệp và thường không thấy lợi thế nào trong "thiết kế" bằng cách làm như vậy, nhưng nó giúp ích trong việc thử nghiệm các đối tượng trong các thử nghiệm. Cá nhân tôi sẽ thấy E2 là một giải pháp cổ điển, mặc dù đã thấy E3 được sử dụng trong 2 dự án tôi đã làm việc trước đây. tôi nghĩ rằng một hỗn hợp của D2 và D3 là tốt nhất dựa trên hoàn cảnh. Đối với phần E, tôi nghĩ mọi thứ có giao diện đều có thể quá mức tôi đã làm điều đó cho các đối tượng miền / doanh nghiệp và thường không thấy lợi thế nào trong "thiết kế" bằng cách làm như vậy, nhưng nó giúp ích trong việc thử nghiệm các đối tượng trong các thử nghiệm. Cá nhân tôi sẽ thấy E2 là một giải pháp cổ điển, mặc dù đã thấy E3 được sử dụng trong 2 dự án tôi đã làm việc trước đây. tôi nghĩ rằng một hỗn hợp của D2 và D3 là tốt nhất dựa trên hoàn cảnh. Đối với phần E, tôi nghĩ mọi thứ có giao diện đều có thể quá mức tôi đã làm điều đó cho các đối tượng miền / doanh nghiệp và thường không thấy lợi thế nào trong "thiết kế" bằng cách làm như vậy, nhưng nó giúp ích trong việc thử nghiệm các đối tượng trong các thử nghiệm. Cá nhân tôi sẽ thấy E2 là một giải pháp cổ điển, mặc dù đã thấy E3 được sử dụng trong 2 dự án tôi đã làm việc trước đây.
Câu hỏi
Tôi có thực hiện MVP chính xác không? Có một cách đúng đắn về nó?
Tôi đã đọc tác phẩm của Martin Fowler có các biến thể và tôi nhớ khi tôi mới bắt đầu làm MVC, tôi đã hiểu khái niệm này, nhưng ban đầu không thể biết đâu là điểm vào, mọi thứ đều có chức năng riêng nhưng điều khiển và tạo bản gốc tập hợp các đối tượng MVC.