1. Mô hình 1 và 2
Trong bản tiền phát hành của đặc tả JavaServer Pages, Sun có đề cập đến hai mô hình khi dùng công nghệ JSP gọi là Mô hình 1 (Model 1) và Mô hình 2 (Model 2). Tuy sau này, hai mô hình này không xuất hiện trong bản đặc tả chính thức nhưng hai thuật ngữ này vẫn được tiếp tục sử dụng.
Trong Mô hình 1, JSP được sử dụng để xử lý mọi tác vụ bao gồm việc xử lý truy vấn gửi từ phía khách, thực hiện các logic xử lý, phát sinh trả lời ...Tuy có thể được sử dụng để phát triển ứng dụng web đơn giản và nhỏ, mô hình này không được khuyến khích sử dụng. Vì mặc dù có tách bạch phần trình bày (presentation) và nội dung (content) do mọi truy vấn dữ liệu được thực hiện thông qua các JavaBeans; nhưng nó gây ra việc viết nhiều mã java xử lý truy vấn ở trang jsp và việc lặp lại mã nên phức tạp khi bảo trì và thay đổi.
Trong Mô hình 2, servlet được sử dụng cho phần xử lý truy vấn từ người dùng và JSP cho việc phát sinh trả lời. Servlet nhận truy vấn từ phía khách, thực hiện những tác vụ cần thiết để có được thông tin nhằm khởi tạo các beans cho trang JSP dùng, và thực hiện việc điều phối, tức việc chuyển đến trang JSP trả lời. Mô hình này phân tách phần logic lấy và thao tác xử lý nội dung với phần hiển thị nội dung nên nó thường được gắn với mẫu Mô hình - Mặt nhìn - Khối điều khiển MVC
2. MVC (Model-View-Controller)
Mô hình MVC được Trygve Reenskaug đề ra năm 1979 và từ đó được sử dụng đầu tiên trong ngôn ngữ lập trình Smalltalk. Như tên gọi của nó thể hiện, kiến trúc Mô hình - Mặt nhìn - Khối điều khiển MVC cho phép xem một ứng dụng gồm ba thành phần riêng biệt : Mô hình đại diện cho nội dung nghiệp vụ, Mặt nhìn đại diện cho việc trình bày phần xuất ra cho người dùng, Khối điều khiển đại diện cho việc nhận và xử lý nhập liệu của người dùng.
a. Mô hình (Model)
- Bao gồm một hay nhiều đối tượng đại diện dữ liệu nghiệp vụ.
- Cung cấp các phương thức cho phép việc truy nhập, thêm và sửa đổi dữ liệu này.
- Cụ thể, nó là một tập hợp các đối tượng nghiệp vụ (Business Object), các lớp/thư viện cung cấp thêm logic cho những đối tượng này (như thực hiện việc tính toán, quản lý trạng thái, vân vân).
* Chú ý, các đối tượng nghiệp vụ không nên đồng thời là các DAO (Data Access Object : Đối tượng truy cập dữ liệu) :
- Các đối tượng nghiệp vụ đại diện cho lãnh vực đang đề cập và nó gọi đến các DAO để thực hiện việc thao tác với cơ sở dữ liệu.
- Các DAO cung cấp các các chức năng SCRUD (search, create, read, update, delete tức tìm kiếm, tạo, đọc, cập nhật và xoá) của cơ chế tồn trữ dữ liệu (persistence mechanism) thông qua việc sử dụng các chuẩn (standard) hay các bộ khung (framework) kết nối chẳng hạn như :
+ JDBC (Java Database Connectivity) cùng với driver tương ứng với cơ sở dữ liệu sử dụng.
+ JPA (Java Persistence API) với việc lựa chọn một trong những hiện thể (implementation) của nó như Toplink Essentials, Eclipselink, OpenJPA ...
+ Thư viện Hibernate (có hỗ trợ JPA)
+ JPO (Java Data Objects) với việc lựa chọn một trong những hiện thể (implementation) của nó như DataNucleus AccessPlatform
b. Mặt nhìn (View)
- Là phần thiết kế và thể hiện nội dung cho người dùng.
- Thực hiện việc phát sinh trả lời từ dữ liệu được cung cấp.
- Có thể thực hiện việc tương tác với phía người dùng nhưng không thực hiện việc xử lý mà chuyển cho Khối điều khiển xử lý.
c. Khối điều khiển (Controller)
- Nhận và xử lý truy vấn từ người dùng bằng cách chuyển truy vấn này thành truy vấn nghiệp vụ.
- Thực hiện việc điều phối : chọn mặt nhìn và cung cấp dữ liệu cho nó.
3. Các biến thể của mô hình MVC
a. MVP (Model-View-Presenter : Mô hình - Mặt nhìn - Khối trình bày)
MVP do Mike Potel đề ra năm 1996, trong đó Khối trình bày (Presenter) là thành phần trung gian, so với Khối điều khiển (Controller) trong mô hình MVC, nó kiêm thêm chức năng thực hiện logic trình bày. Mô hình này khái niệm hoá các hành động của người dùng thành các Chọn lựa (Selection : việc chọn một thành phần con trong Mô hình), các Lệnh (Command : các thao tác thực hiện trên các chọn lựa) và các Tương tác (Interactor : các sự kiện của chuột, bàn phím ...). Khối trình bày bao hàm các thành phần này.
Cụ thể, khi tương tác với Mô hình (Model) để lấy dữ liệu, Khối trình bày sẽ không gởi ngay dữ liệu này cho Mặt nhìn (View) mà sẽ phát sinh dữ liệu trả lời trước rồi gởi dữ liệu phát sinh này. Thường hơn, nó sẽ truy cập trực tiếp để gán (cập nhật) dữ liệu cho Mặt nhìn. Mặt nhìn đóng vai trò thụ động hiển thị nội dung.
Ta cần làm rõ việc truy cập trực tiếp của Khối trình bày đến Mặt nhìn, có các cách sau :
- Khối trình bày truy cập trực tiếp Mặt nhìn, do đó phụ thuộc vào công nghệ do Mặt nhìn sử dụng, cách này kém linh hoạt hơn cách dưới đây.
- Khối trình bày truy cập thông qua mặt giao (interface) được hiện dựng (implement) bởi Mặt nhìn. Trong trường hợp này, Khối trình bày không biết về công nghệ cụ thể dùng để thiết kế (design) trình bày nội dung đến người dùng. Điều này cho phép việc tái sử dụng Khối trình bày với những công nghệ thiết kế khác nhau của Mặt nhìn.
Trong mọi trường hợp trên, vì Khối trình bày truy cập trực tiếp Mặt nhìn nên nó phụ thuộc vào Mặt nhìn. Do đó, một Khối trình bày tương ứng với một Mặt nhìn.
b. Mô hình trình bày (Presentation Model)
Mô hình trình bày được Martin Fowler đưa ra năm 2004 theo đó nó thể hiện trạng thái và hành vi của phần trình bày một cách độc lập với các thành tố điều khiển dùng trong giao diện "Represent the state and behavior of the presentation independently of the GUI controls used in the interface". Đối với người dùng VisualWorks Smalltalk, mô hình này còn được biết đến với tên gọi Mô hình Ứng dụng (Application Model).
Mô hình này giống MVP ở chỗ tách biệt Mặt nhìn (view) khỏi trạng thái và hành xử của nó. Theo đó, Phần trình bày gồm hai thành phần : Mặt nhìn trình bày (Presentation View) hay Mặt nhìn (View) và Mô hình trình bày (Presentation Model). Phần trình bày (Presentation) được hiểu là giao diện người dùng (User Interface), tức ứng với Mặt nhìn - Khối điều khiển (View - Controller) trong mô hình MVC.
* Phần Mô hình trình bày (Presentation Model):
- Chứa dữ liệu của Mặt nhìn.
- Giữ trạng thái và cách hành xử của Mặt nhìn. Nó chỉ giữ những trạng thái có thể thay đổi khi người dùng tương tác với mặt nhìn và không nhất thiết phải giữ toàn bộ trạng thái của mặt nhìn.
- Thực hiện logic trình bày.
* Phần mặt nhìn (View) :
- Đồng bộ (synchronize) với phần Mô hình mặt nhìn để hiển thị nội dung do phần này giữ.
- Lưu trạng thái của nó vào Mô hình trình bày và đồng thời từ đây cập nhật lại mình thông qua các điều khiển sự kiện (event handle).
* Thực hiện việc đồng bộ (Synchronization)
Trên đây phần đồng bộ được để trong Mặt nhìn nhưng thực ra nó tế nhị hơn nhiều. Việc thực hiện đồng bộ giữa Mô hình trình bày và Mặt nhìn như thế nào là do quyết định của người lập trình, có các chọn lựa sau :
- Thực hiện việc đồng bộ ở Mô hình trình bày khi đó phần này phụ thuộc vào mặt nhìn vì chứa mã tham chiếu đến nó
- Thực hiện việc đồng bộ ở Mặt nhìn khi đó Mặt nhìn sẽ phụ thuộc vào Mô hình trình bày vì chứa mã tham chiếu đến phần này.
- Hoặc đưa vào một lớp trung gian ánh xạ giữa Mô hình trình bày và Mặt nhìn nhằm giữ cho hai thành phần này độc lập với nhau.
c. MVVM (Model-View-ViewModel : Mô hình - Mặt nhìn - Mô hình mặt nhìn)
Mô hình MVVM, được John Gossman đề ra năm 2005, là một đặc thù hoá của Mô hình trình bày (Presentation Model) và được dùng chủ yếu trong các công nghệ phát triển bởi Microsoft như WPF (Windows Presentation Foundation), Silverlight.
* Mô hình mặt nhìn (ViewModel) :
- Như tên gọi thể hiện, nó là mô hình của mặt nhìn, tức chứa nội dung, trạng thái của mặt nhìn.
- Khác với mô hình MVP, nó độc lập với mặt nhìn : không biết đến mặt nhìn lẫn công nghệ sử dụng bởi mặt nhìn. Do đó các mặt nhìn khác nhau có thể cùng dùng dung một Mô hình mặt nhìn, ngay cả khi công nghệ của các mặt nhìn này khác nhau.
- Quản lý thông tin của ứng dụng, định nghĩa logic và hành xử của ứng dụng.
* Mặt nhìn (View) :
- Định nghĩa giao diện đồ hoạ của ứng dụng.
- Chỉ cần biết những lệnh (command), thuộc tính (property) nào cần phải kết gắn (binding). Và không cần biết chi tiết điều gì xảy ra khi nội dung một thuộc tính thay đổi hay một lệnh được thực thi.
- Hoàn toàn phụ thuộc vào việc kết gắn (binding).
* Việc đồng bộ được thực hiện thông qua cơ chế Gắn kết dữ liệu (Data Binding) :
- Trong công nghệ WPF, Silverlight Mô hình trình bày được gán là Ngữ-cảnh-dữ-liệu (DataContext) của Mặt nhìn.
4. Đào sâu
a. Vì sao cần tách bạch các thành phần trong một ứng dụng?
- Giúp hạn chế việc viết trùng mã tại nhiều mặt nhìn chung.
- Dễ dàng cho việc kiểm thử (test).
- Dễ dàng cho việc bảo trì (maintain), thay đổi (modify), tái sắp xếp (factory)
- ...
b. Vì sao các thành phần trong một ứng dụng nên độc lập với nhau?
- Hỗ trợ việc tái sử dụng mã (code reuse).
- Viết lại ít mã hơn khi cần thay đổi công nghệ do chỉ phải viết lại cho phần liên quan đến công nghệ cần thay.
- ...
Không có nhận xét nào:
Đăng nhận xét