2012-10-06 53 views
30

Tôi hiện đang làm việc trên ba ứng dụng Vaadin và tôi thực sự cảm thấy như tôi bỏ lỡ một cái gì đó. Tôi đã từng làm việc với Spring MVC trước đây, nơi mà kiến ​​trúc rõ ràng và được tách riêng, bạn tiêm các dịch vụ vào các bộ điều khiển và không kết nối bộ điều khiển với giao diện người dùng và vân vân.Vaadin: Các mẫu thiết kế

Bây giờ trong Vaadin, đó là một câu chuyện khác. Vì vậy, nếu có bất kỳ chuyên gia Vaadin ra khỏi đó, cho tôi hỏi bạn vài câu hỏi:

Câu hỏi 1:

  • Is it OK để tiêm dịch vụ (hoặc DAO) trực tiếp đến các thành phần giao diện người dùng?
  • Ví dụ: Thành phần chịu trách nhiệm hiển thị liên hệ trong ứng dụng email (ContactWidget, dựa trên VerticalLayout with Links) cần hiển thị liên hệ. Có thể gửi trực tiếp contactRepository vào phần tử giao diện người dùng này không?

Câu hỏi 2:

  • Liên quan đến việc áp dụng chính đã được thông qua với số tiền rất lớn của componenets UI, bởi vì rất nhiều các thành phần giao diện người dùng cần truy cập vào một số dữ liệu toàn cầu hay gọi các phương pháp toàn cầu về chính lớp ứng dụng
  • Ví dụ: Thành phần bật lên có Nút mở cửa sổ mới, là con của cửa sổ chính trong ứng dụng. Do đó thành phần popup phải có tham chiếu đến ứng dụng chính.

Câu hỏi 3:

  • Dependencies giữa các thành phần giao diện người dùng có thể nhận được khá hoang dã. Có lẽ không có gì nhiều để làm ở đây, nhưng đôi khi nó không cảm thấy như thế này cửa sổ phụ thuộc vào danh sách này phụ thuộc vào popup đó ... bạn có được ý tưởng, nó trông chặt chẽ cùng với tôi

Tôi muốn muốn tìm hiểu càng nhiều càng tốt về thiết kế tốt với Vaadin trước khi mã của tôi chuyển thành Spaghetti, vì vậy mọi đề xuất, kinh nghiệm và phương pháp hay nhất sẽ được đánh giá cao.

Trả lời

15

Chúng tôi đã có may mắn rất tốt bằng cách sử dụng mẫu MVVM (aka Fowler's PresentationModel). Tài liệu của anh ấy hơi cũ, nhưng là một điểm khởi đầu tốt.

Sau khi bạn đã đọc rằng, câu trả lời của tôi có thể làm cho ý nghĩa hơn

  1. số Tiêm dịch vụ của bạn vào ViewModel của bạn. ViewModel sẽ là một mặt tiền (và có thể gói gọn bộ điều hợp, trang trí, bộ đệm và bất kỳ mẫu nào khác mà bạn quyết định bạn cần)

  2. Tôi không thấy câu hỏi ở đây, nhưng chúng tôi có một tình huống tương tự như những gì bạn đang có miêu tả. Chúng tôi sử dụng EventBus của ổi để giao tiếp giữa các thành phần tách rời.Bằng cách này, nếu bạn cần bật lên một cửa sổ mới, bạn có thể: eventBus.post(new NewWindowRequest(theComponent)) Và ứng dụng chính của bạn có thể được đăng ký vào cùng một sự kiện, sau đó bật lên cửa sổ.

  3. MVVM và sử dụng thận trọng EventBus có thể hữu ích. Ngoài ra, BeanItem và ObjectProperty của Vaadin có thể được sử dụng để truyền bá các thay đổi, vì chúng là một phần của mẫu quan sát/dữ liệu ràng buộc tích hợp của Vaadin.

Gần đây, tôi đã thực hiện presentation on MVC vs MVP vs MVVM. Mã ví dụ có thể giúp bạn hiểu sự thay đổi từ MVC sang MVVM. Nó được viết bằng JavaScript, nhưng nó đủ đơn giản mà tôi tin rằng hầu hết mọi người đều có thể theo dõi nó. Tôi hoan nghênh bất kỳ phản hồi nào bạn có thể có.

+0

Thanx Dusty. Cuối cùng tôi đã chọn MVP làm bằng tay (rất nhẹ) và sự kiện tuyên truyền dựa trên EventBus của Guava. Tôi khá hài lòng với quyết định này mặc dù điều ngạc nhiên là không có khung MVP vững chắc (có dozena của betas/alphas/thí nghiệm) cho Vaadin. – Xorty

+0

Vâng, tốt, mặc dù đã được khoảng một thời gian dài, nó không có đủ lớn sau đây để có được các kỹ sư tình yêu mà công nghệ khác được. Hầu hết những người sử dụng nó đang tìm kiếm giải pháp đơn giản nhất có sẵn, hoặc nếu bạn giống như chúng tôi, không có đủ thời gian để ghi lại những gì chúng tôi đang làm. Tạo bằng tay là một lựa chọn rất tốt. Các khái niệm là phần quan trọng, và hầu hết các khung công tác MVC/MVP/MVVM chỉ có ở đó để đảm bảo bạn tô màu trong các dòng. Nếu bạn có kỷ luật, họ thường không phải là một yêu cầu. –

9

Vaadin là một phần mềm tuyệt vời và bạn chắc chắn không nên kết thúc bằng mã Spaghetti. Dù sao, mọi thứ phụ thuộc vào bạn.

Trả lời 1

Không, nó không phải là. Khớp nối chặt chẽ là xấu bất kể khung được sử dụng. Ví dụ của bạn (ContactWidget) mô tả việc triển khai tùy chỉnh danh sách. Nó có thể được hiển thị dưới dạng bảng có hoặc không có thông tin bổ sung. Tôi sẽ sử dụng ví dụ bảng vì nó phức tạp hơn và linh hoạt hơn (bạn có thể xây dựng toàn bộ ứng dụng có thành phần bảng nâng cao và ràng buộc dữ liệu thích hợp).

Vaadin xác định mô hình dữ liệu nâng cao theo mẫu MVC nổi tiếng. Có ba lớp lồng nhau: thùng chứa, mục, thuộc tính (trình xem thuộc tính và trình chỉnh sửa cũng được xác định). Cuốn sách Vaadin cho thấy sự tương tự tốt: ứng dụng bảng tính. Vì vậy, vùng chứa, mục và thuộc tính sẽ tương ứng với bảng, hàng và ô. Dễ tưởng tượng - dễ hiểu. Cuối cùng, ItemContainer sẽ tiết lộ bản chất của nó và bạn sẽ hiểu đây là hợp đồng chính cho bất kỳ cấu trúc dựa trên Vaadin tốt và linh hoạt nào. Tôi sẽ đề nghị để xem xét thông qua Vaadin cuốn sách, để có được tất cả các chi tiết khác:

Bạn cũng có thể xem xét thực hiện chứa đằng sau bất kỳ addon PagedTable để có được sự hiểu biết tốt hơn. Hãy bắt đầu với ArrayContainer https://vaadin.com/directory#addon/array-container, nó sẽ đơn giản hóa rất nhiều cho bạn.

Trả lời 2

Đi qua tham khảo ứng dụng chính dường như không phải là một giải pháp tốt. Bạn đã chú ý rằng cá thể ứng dụng đại diện cho phiên làm việc nhưng nó sẽ tốt hơn cho bạn để xác định một số loại hợp đồng SessionContext (mà vẫn có thể được ứng dụng của bạn thực hiện). Một phương thức tĩnh có thể được định nghĩa để cung cấp sự truy cập trong suốt tới cá thể SessionContext có liên quan. Dưới mui xe nó có thể sử dụng biến ThreadLocal http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html Theo cách như vậy bạn sẽ loại bỏ tất cả các tham số ký sinh đi qua.

trả lời 3

Thiết kế hệ thống cấp bậc của bạn với một dịch vụ chăm sóc tuyệt vời. Không kích hoạt sơn lại, thay vào đó hãy sử dụng Refresher. Theo dõi toàn bộ kiến ​​trúc.

Cuối cùng, Vaadin rất dễ sử dụng, do đó, vui lòng thực hiện một số bản PoC và trình diễn nhỏ trước khi thay đổi mã chính.

Như đã đề xuất bạn cũng có thể thử MVVM https://vaadin.com/directory#addon/bambi-mvvm

+1

Thanx cho câu trả lời, tôi đã kiểm tra bambi-mvvm - trông rất đẹp, nhưng nó khá đầy đủ, chưa được thử nghiệm và beta. Tương tự cho hầu hết các công cụ liên quan đến VaVin MVVM/MVP tôi tìm thấy: ( – Xorty

+0

Bạn được chào đón. Vaadin quá trẻ, hoặc tốt hơn là nói tương đối trẻ :) Cá nhân, tôi thích triển khai Container, Container.Indexed, ... nhận phân trang và một số tính năng khác. –

Các vấn đề liên quan