CodeGym/Khóa học Java/Mô-đun 3/cách tiếp cận MVC

cách tiếp cận MVC

Có sẵn

Giới thiệu về kiến ​​trúc MVC

Kiến trúc ứng dụng phổ biến nhất mà mọi lập trình viên đều biết là MVC . MVC là viết tắt của Model-View-Controller .

Đây không phải là kiến ​​trúc của các ứng dụng mà là kiến ​​trúc của các thành phần ứng dụng, nhưng chúng ta sẽ quay lại sắc thái này sau. MVC là gì?

MVC là một lược đồ để tách dữ liệu ứng dụng và logic điều khiển thành ba thành phần riêng biệt— mô hình, chế độ xem và bộ điều khiển —để mỗi thành phần có thể được sửa đổi độc lập.

  • Mô hình (Model) cung cấp dữ liệu và đáp ứng các lệnh của bộ điều khiển bằng cách thay đổi trạng thái của nó.
  • Chế độ xem chịu trách nhiệm hiển thị dữ liệu mô hình cho người dùng để đáp ứng với các thay đổi của mô hình.
  • Bộ điều khiển (Controller) diễn giải các hành động của người dùng, thông báo cho mô hình về nhu cầu thay đổi.

Mô hình này được phát minh vào năm 1978 (!). Vâng, các vấn đề với kiến ​​trúc phần mềm phù hợp đã có liên quan từ 50 năm trước. Đây là cách mô hình này được mô tả bằng sơ đồ trong bản gốc:

Giới thiệu về kiến ​​trúc MVC

Mô hình cung cấp dữ liệu và phương pháp để làm việc với chúng: truy vấn cơ sở dữ liệu, kiểm tra tính chính xác. Mô hình độc lập với chế độ xem (không biết cách hiển thị dữ liệu) và bộ điều khiển (không có điểm tương tác với người dùng), cung cấp quyền truy cập và quản lý dữ liệu.

Mô hình được xây dựng theo cách để đáp ứng các yêu cầu bằng cách thay đổi trạng thái của nó và có thể tích hợp thông báo về “người quan sát”. Mô hình, do độc lập với biểu diễn trực quan, có thể có một số biểu diễn khác nhau cho một “mô hình”.

Khung nhìn chịu trách nhiệm lấy dữ liệu cần thiết từ mô hình và gửi cho người dùng. Chế độ xem không xử lý đầu vào của người dùng.

Bộ điều khiển cung cấp "giao tiếp" giữa người dùng và hệ thống. Điều khiển và hướng dữ liệu từ người dùng đến hệ thống và ngược lại. Sử dụng một mô hình và một khung nhìn để thực hiện hành động mong muốn.

Có một khó khăn nhất định với thực tế là mô hình này đã phát triển một chút trong nhiều thập kỷ. Đó là, tên vẫn giữ nguyên, nhưng mục đích của các bộ phận bắt đầu thay đổi.

Kiến trúc MVC trên web

Ý tưởng đằng sau mẫu thiết kế MVC rất đơn giản: chúng ta cần phân tách rõ ràng trách nhiệm đối với các hành vi khác nhau trong ứng dụng của mình:

Người mẫu- xử lý dữ liệu và logic ứng dụng.

xem— cung cấp dữ liệu cho người dùng ở bất kỳ định dạng được hỗ trợ nào.

bộ điều khiển- xử lý các yêu cầu của người dùng và gọi các tài nguyên thích hợp.

Ứng dụng được chia thành ba thành phần chính, mỗi thành phần chịu trách nhiệm cho các nhiệm vụ khác nhau. Chúng ta hãy xem xét kỹ hơn các thành phần của ứng dụng máy khách-máy chủ bằng một ví dụ.

Bộ điều khiển

Người dùng nhấp vào các thành phần khác nhau trên trang trong trình duyệt, do đó trình duyệt sẽ gửi các yêu cầu HTTP khác nhau: GET, POST hoặc các yêu cầu khác. Bộ điều khiển có thể bao gồm trình duyệt và mã JS hoạt động bên trong trang.

Chức năng chính của bộ điều khiển trong trường hợp này là gọi các phương thức trên các đối tượng cần thiết, quản lý quyền truy cập vào tài nguyên để thực hiện các tác vụ do người dùng chỉ định. Thông thường, bộ điều khiển gọi mô hình thích hợp cho tác vụ và chọn chế độ xem thích hợp.

Người mẫu

Mô hình theo nghĩa rộng là dữ liệu và quy tắc được sử dụng để làm việc với dữ liệu - chúng cùng nhau tạo nên logic nghiệp vụ của ứng dụng. Việc thiết kế một ứng dụng luôn bắt đầu bằng việc xây dựng các mô hình của các đối tượng mà ứng dụng đó hoạt động.

Giả sử chúng ta có một cửa hàng trực tuyến bán sách, vậy một người chỉ là người dùng ứng dụng hay cũng là tác giả của một cuốn sách? Những câu hỏi quan trọng này phải được giải quyết trong quá trình thiết kế mô hình.

Hơn nữa, có các bộ quy tắc: cái gì có thể làm được, cái gì không thể làm, bộ dữ liệu nào được chấp nhận và bộ dữ liệu nào không. Một cuốn sách có thể tồn tại mà không có tác giả? Còn tác giả không có sách? Ngày sinh của người dùng có thể vào năm 300, v.v.

Mô hình cung cấp cho bộ điều khiển chế độ xem dữ liệu mà người dùng đã yêu cầu (tin nhắn, trang sách, hình ảnh, v.v.). Mô hình dữ liệu sẽ giống nhau cho dù chúng tôi muốn trình bày nó như thế nào cho người dùng. Do đó, chúng tôi chọn bất kỳ chế độ xem có sẵn nào để hiển thị dữ liệu.

Mô hình chứa phần quan trọng nhất trong logic ứng dụng của chúng tôi , logic giải quyết vấn đề mà chúng tôi đang xử lý (diễn đàn, cửa hàng, ngân hàng, v.v.). Bộ điều khiển chủ yếu chứa logic tổ chức cho chính ứng dụng đó (giống như Trình quản lý dự án của bạn).

Xem

Chế độ xem cung cấp nhiều cách khác nhau để biểu diễn dữ liệu nhận được từ mô hình. Nó có thể là một mẫu chứa đầy dữ liệu. Có thể có một số chế độ xem khác nhau và bộ điều khiển chọn chế độ xem nào là tốt nhất cho tình huống hiện tại.

Một ứng dụng web thường bao gồm một bộ điều khiển, mô hình và chế độ xem. Bộ điều khiển chỉ có thể ở phần phụ trợ, nhưng cũng có thể có một biến thể của một số bộ điều khiển, khi logic của nó cũng được trải rộng trên phần giao diện người dùng. Một ví dụ điển hình của phương pháp này là bất kỳ ứng dụng di động nào.

Ví dụ MVC trên web

Giả sử bạn cần phát triển một cửa hàng trực tuyến bán sách. Người dùng có thể thực hiện các thao tác sau: xem sách, đăng ký, mua, thêm mục vào đơn hàng hiện tại, đánh dấu sách mình thích và mua chúng.

Ứng dụng của bạn nên có một mô hình chịu trách nhiệm cho tất cả logic nghiệp vụ. Bạn cũng cần một bộ điều khiển sẽ xử lý tất cả các hành động của người dùng và biến chúng thành các lệnh gọi phương thức từ logic nghiệp vụ. Tuy nhiên, một phương thức điều khiển có thể gọi nhiều phương thức mô hình khác nhau.

Bạn cũng cần tập hợp các chế độ xem: danh sách sách, thông tin về một cuốn sách, giỏ hàng, danh sách đơn đặt hàng. Mỗi trang của ứng dụng web thực sự là một chế độ xem riêng biệt hiển thị một khía cạnh nhất định của mô hình cho người dùng.

Hãy xem điều gì sẽ xảy ra nếu người dùng mở danh sách các sách được đề xuất ở cửa hàng sách để xem tên sách. Toàn bộ chuỗi hành động có thể được mô tả dưới dạng 6 bước:

Ví dụ MVC trên web

Các bước:

  1. Người dùng nhấp vào liên kết "được đề xuất" và trình duyệt sẽ gửi yêu cầu tới, chẳng hạn như /books/recommendations.
  2. Bộ điều khiển kiểm tra yêu cầu : người dùng phải đăng nhập. Hoặc chúng ta nên có bộ sưu tập sách cho người dùng không đăng nhập. Bộ điều khiển sau đó gọi mô hình và yêu cầu nó trả về danh sách sách được đề xuất cho người dùng N.
  3. Mô hình truy cập cơ sở dữ liệu, lấy thông tin về sách từ đó: sách hiện đang phổ biến, sách được mua bởi người dùng, sách được mua bởi bạn bè của anh ấy, sách từ danh sách mong muốn của anh ấy. Dựa trên dữ liệu này, mô hình xây dựng danh sách 10 cuốn sách được đề xuất và gửi lại cho bộ điều khiển.
  4. Người điều khiển nhận danh sách các sách được đề xuất và xem xét nó. Ở giai đoạn này, bộ điều khiển đưa ra quyết định! Nếu có ít sách hoặc danh sách hoàn toàn trống, thì nó sẽ yêu cầu danh sách sách cho người dùng chưa đăng nhập. Nếu có một chương trình khuyến mãi đang diễn ra ngay bây giờ, bộ điều khiển có thể thêm sách khuyến mại vào danh sách.
  5. Bộ điều khiển xác định trang nào sẽ hiển thị cho người dùng. Đó có thể là một trang lỗi, một trang có danh sách sách, một trang chúc mừng người dùng đã trở thành khách truy cập thứ một triệu.
  6. Máy chủ cung cấp cho máy khách trang ( chế độ xem ) do bộ điều khiển chọn. Nó chứa đầy dữ liệu cần thiết (tên người dùng, danh sách sách) và chuyển đến máy khách.
  7. Máy khách nhận trang và hiển thị nó cho người dùng.

Những lợi ích của phương pháp này là gì?

Ưu điểm rõ ràng nhất mà chúng tôi nhận được từ việc sử dụng khái niệm MVC là sự tách biệt rõ ràng giữa logic trình bày (giao diện người dùng) và logic ứng dụng (phụ trợ).

Ưu điểm thứ hai là việc chia phần máy chủ thành hai: mô hình thông minh ( người thực thi ) và bộ điều khiển ( trung tâm quyết định ).

Trong ví dụ trước, đã có lúc bộ điều khiển có thể nhận được một danh sách sách trống được đề xuất từ ​​mô hình và quyết định phải làm gì với danh sách đó. Về mặt lý thuyết, logic này có thể được đưa trực tiếp vào mô hình.

Đầu tiên, khi yêu cầu những cuốn sách được đề xuất, mô hình sẽ quyết định phải làm gì nếu danh sách trống. Sau đó, tôi sẽ phải thêm mã vào cùng một nơi, phải làm gì nếu hiện tại đang có chương trình khuyến mãi, sau đó là nhiều tùy chọn khác nhau hơn.

Sau đó, hóa ra quản trị viên cửa hàng muốn xem trang của người dùng sẽ trông như thế nào nếu không có khuyến mãi hoặc ngược lại, hiện tại không có khuyến mãi nhưng anh ấy muốn xem khuyến mãi trong tương lai sẽ được hiển thị như thế nào. Và không có phương pháp nào cho việc này. Do đó, người ta đã quyết định tách trung tâm quyết định (bộ điều khiển) khỏi logic nghiệp vụ (mô hình).

Ngoài việc tách biệt các khung nhìn khỏi logic ứng dụng, khái niệm MVC làm giảm đáng kể độ phức tạp của các ứng dụng lớn. Mã có cấu trúc hơn nhiều, giúp dễ dàng bảo trì, kiểm tra và sử dụng lại các giải pháp.

Hiểu khái niệm về MVC, bạn, với tư cách là nhà phát triển, nhận ra nơi bạn cần thêm sắp xếp danh sách sách:

  • Ở mức truy vấn cơ sở dữ liệu.
  • Ở cấp độ logic kinh doanh (mô hình).
  • Ở mức logic nghiệp vụ (bộ điều khiển).
  • Trong chế độ xem - về phía máy khách.

Và đây không phải là một câu hỏi tu từ. Ngay bây giờ, hãy nghĩ xem bạn cần thêm mã để sắp xếp danh sách sách ở đâu và tại sao.

Mô hình MVC cổ điển

Tương tác giữa các thành phần MVC được triển khai khác nhau trong ứng dụng web và ứng dụng di động. Điều này là do ứng dụng web tồn tại trong thời gian ngắn, xử lý một yêu cầu của người dùng và thoát, trong khi ứng dụng dành cho thiết bị di động xử lý nhiều yêu cầu mà không cần khởi động lại.

Các ứng dụng web thường sử dụng mô hình "thụ động", trong khi các ứng dụng di động sử dụng mô hình "hoạt động". Mô hình hoạt động, không giống như mô hình thụ động, cho phép bạn đăng ký và nhận thông báo về những thay đổi trong đó. Điều này là không cần thiết cho các ứng dụng web.

Đây là cách tương tác của các thành phần trong các mô hình khác nhau trông như thế nào:

Mô hình MVC cổ điển

Các ứng dụng di động (mô hình hoạt động) tích cực sử dụng các sự kiện và cơ chế đăng ký sự kiện. Với cách tiếp cận này, chế độ xem ( view ) đăng ký thay đổi mô hình. Sau đó, khi một số sự kiện xảy ra (ví dụ: người dùng nhấp vào nút), bộ điều khiển được gọi là . Nó cũng cung cấp cho mô hình một lệnh để thay đổi dữ liệu.

Nếu một số dữ liệu đã thay đổi, thì mô hình sẽ tạo ra một sự kiện về việc thay đổi dữ liệu này. Tất cả các chế độ xem đã đăng ký sự kiện này (điều quan trọng là thay đổi dữ liệu cụ thể này) đều nhận được sự kiện này và cập nhật dữ liệu trong giao diện của chúng.

Trong các ứng dụng web, mọi thứ được tổ chức hơi khác một chút. Sự khác biệt chính về kỹ thuật là máy khách không thể nhận tin nhắn phía máy chủ theo sáng kiến ​​của máy chủ .

Do đó, bộ điều khiển trong ứng dụng web thường không gửi bất kỳ thông báo nào đến chế độ xem mà cung cấp cho khách hàng một trang mới, về mặt kỹ thuật là chế độ xem mới hoặc thậm chí là ứng dụng khách mới (nếu một trang không biết gì về trang kia) .

Tại thời điểm hiện tại, vấn đề này được giải quyết một phần bằng các phương pháp sau:

  • Thường xuyên kiểm tra máy chủ để biết các thay đổi đối với dữ liệu quan trọng (mỗi phút một lần trở lên).
  • WebSockets cho phép khách hàng đăng ký tin nhắn máy chủ.
  • Thông báo đẩy web từ phía máy chủ.
  • Giao thức HTTP/2 cho phép máy chủ bắt đầu gửi tin nhắn đến máy khách.
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào