Giới thiệu

Mô hình kiểu kiểuView-P riêng của họ (MVC) là nền tảng của phát triển ứng dụng web trong nhiều thập kỷ. Tuy nhiên, khi ứng dụng tăng theo sự phức tạp và yêu cầu người dùng tăng, nhiều đội phát hiện ra rằng các mô hình của họ - lớp chịu trách nhiệm về dữ liệu và logic kinh doanh - vội vàng trở thành chai cổ. Mô hình cấu trúc thiết kế kém dẫn đến sự kết hợp chặt chẽ, song song, và một cơ sở mã mà chống lại thay đổi. Tính khả năng rập khuôn thiết kế cố định, sửa chữa. Bài này cung cấp một tập hợp toàn diện nhất cho mô hình i công cụ xây dựng trong các mô hình MVC, được chứng minh dựa trên các ứng dụng cấu trúc và kinh nghiệm cấu trúc đã tạo.

Hiểu gương mẫu của MVC

Mẫu MVC chia một ứng dụng thành ba thành phần liên kết:

  • Mô tả: quản lý dữ liệu, luật kinh doanh và sự kiên trì logic, đó là một nguồn lẽ thật duy nhất cho lãnh vực của ứng dụng.
  • Xem: vẽ giao diện người dùng, thường là bằng cách đọc dữ liệu từ mô hình (hoặc một trình bày đại diện cho nó).
  • [FLT: 0] Trình duyệt: xử lý đầu vào, dàn nhạc tương tác giữa mô hình và khung xem, và cập nhật trạng thái phù hợp.

Một mô hình cấu trúc tốt cho phép ứng dụng thích ứng với những yêu cầu mới, xử lý tăng giao thông, hỗ trợ nhiều giao diện (v. d., web, ADI, i) mà không thay đổi ccaring.

Nguyên tắc cốt lõi cho các mô hình có thể khắc phục

Trước khi lặn vào những khuôn mẫu cụ thể, điều thiết yếu là phải thâm nhập vào một vài nguyên tắc cơ bản:

  • Trách nhiệm chạy bộ: mỗi mô hình hoặc hạng nên có một lý do xác định rõ để thay đổi. Ví dụ, việc truy cập dữ liệu riêng từ giá trị kinh doanh.
  • Sự phân chia các mối quan tâm: các khía cạnh khác nhau của ứng dụng (sự phục tùng, hợp lệ hóa, thông báo, v. v.) nên được thực hiện trong các lớp riêng biệt, có sự kết hợp lỏng lẻo.
  • Đừng lặp lại chính mình (DRY): [FLT: 1] phỏng đoán lại lập luận [FLT:] trong nhiều mô hình hoặc bộ điều khiển dẫn đến việc duy trì ác mộng.
  • Phụ thuộc vào mô- đun mức độ cao (các phiên bản ảo) chứ không phải thực hiện cụ thể. Điều này cho phép trao đổi cơ sở dữ liệu, nhà cung cấp lưu trữ, hoặc dịch vụ bên ngoài mà không cần viết lại logic.

Thiết kế miền (DDDDD)

Thiết kế miền DDD của Eric Evans là một trong những cách tiếp cận hiệu quả nhất để mô hình tính khả thi.

Ngôn ngữ Ubiquity

Thiết lập một từ vựng chung được chia sẻ bởi các nhà phát triển, các chuyên gia địa phương và các nhà giữ bản quyền. Hãy dùng cùng một từ khóa trong mã, tài liệu và các cuộc đối thoại. Ví dụ, một ứng dụng điện tử nên có một [FLT: 0] lớp phản ánh hành vi thứ tự thực, không phải là một chung .

Các văn bản đã giới hạn

Ứng dụng lớn được cấu tạo bởi nhiều phần phụ. DD DD khuyên xác định ranh giới rõ ràng giữa các ngữ cảnh - Ví dụ, mô hình riêng biệt cho quản lý trật tự, kiểm kê và vận chuyển. Trong mỗi bối cảnh đã ràng buộc, mô hình có thể được tối ưu hóa cho miền cụ thể đó mà không làm rò rỉ các khái niệm qua các ranh giới. Sự cô lập này là chìa khóa cho việc tự nâng cấp các đội phát triển độc lập.

Thu thập

Tổng hợp là một nhóm các đối tượng miền được xem như một đơn vị riêng. Thực thể gốc bảo đảm sự nhất quán. Chẳng hạn, một ) có thể bao gồm và thực thể, tất cả các thiết bị truy cập thông qua gốc. Mẫu này giảm các mối quan hệ phức tạp và giao dịch đơn giản.

Để lặn sâu hơn, hãy nhắc đến lời giới thiệu củaMartin “Biểu đồ ” [FLT: 1].

Kiến trúc lớp

Một kiến trúc được chia nhỏ thành nhiều phần khác nhau, những mối quan tâm khác nhau bằng cách biến mô hình thành những dây nối hợp lý riêng biệt:

  • Lớp & l: chứa các thực thể kinh doanh, đối tượng giá trị, và dịch vụ miền. Lớp này không có phụ thuộc vào cơ sở hạ tầng.
  • Lớp Ứng dụng: Các bộ phận dùng trường hợp, đối tượng vùng, và quản lý giao dịch. Nó phụ thuộc vào lớp miền.
  • Lớp cấu trúc: sự kiên trì, tin nhắn, cuộc gọi bên ngoài và những mối quan tâm kỹ thuật khác. Nó phụ thuộc vào các lớp miền và các lớp ứng dụng.
  • Lớp phát âm: Điều khiển và xem tương tác với lớp ứng dụng qua giao diện.

Sự tách biệt này đảm bảo rằng sự thay đổi trong công nghệ cơ sở dữ liệu, chiến lược tích hợp, hoặc khung cơ sở dữ liệu UI không lan truyền qua logic kinh doanh cốt lõi. nó cũng làm cho các đơn vị thử nghiệm dễ dàng hơn- có thể kiểm tra lý trí nếu không có cơ sở dữ liệu chế nhạo.

Các kho và dịch vụ

Hai mẫu đặc biệt có giá trị để giữ cho mô hình sạch sẽ và có thể được nhân rộng:

Thay đổi dòng cuối

Một bản tóm tắt dữ liệu truy cập logic, cung cấp một giao diện bộ nhớ trong bộ nhớ cho đối tượng miền. Thay vì in các bản ghi lưu trong các bộ điều khiển, bạn gọi . Tính trừu tượng này cho phép trao đổi nguồn dữ liệu (v. d., từ MySQL tới PostgreSQL hay thậm chí là một cửa hàng inmory để thử nghiệm) với ảnh hưởng tối thiểu.

Lớp dịch vụ

Dịch vụ chứa lý luận thương mại không phải tự nhiên thuộc một thực thể riêng lẻ. Chẳng hạn, một có thể phối hợp quyền kiểm tra lại, giá trị và kiểm tra khi đặt thứ tự. Dịch vụ phụ thuộc vào các kho và thực thể miền, nhưng vẫn còn có khả năng xác thực về cơ sở dữ liệu. Sự phân chia này cũng có thể hỗ trợ việc sử dụng lại qua kiểm soát, công việc nền và hệ thống máy tính.

Để đọc thêm, xin xem Mô tả cách tái tổ chức [FLT: 1).

Chuyển đổi đối tượng dữ liệu (DTOs) và mô hình xem

Hiển thị mô hình miền đầy đủ của bạn cho lớp xem hoặc các khách hàng bên ngoài tạo sự kết nối chặt chẽ và thường phơi bày chi tiết nội bộ không cần thiết. Thay vào đó, hãy dùng DTO để định hình dữ liệu đúng như cần thiết. Lợi ích bao gồm:

  • Thực hiện thay đổi cho các thực thể miền không tự động ngắt ứng dụng khách ARI.
  • Có thể bỏ qua các trường nhạy cảm (v. d. ID nội bộ, nhãn giờ kiểm tra).
  • Cách dịch: DTO có thể sửa đổi chỉ cần có các trường cần thiết bởi một điểm kết thúc cụ thể, giảm kích cỡ tải.

Xem mô hình phục vụ cùng mục đích cho lớp trình bày, chỉ chứa dữ liệu cần phải vẽ (thường là cùng với hiển thị ngày tháng hợp lý hoặc tổng số đã tính).

Đang tạo tiến trình truy cập cơ sở dữ liệu để xác thực khả năng

Ngay cả kiến trúc kiểu mẫu sạch nhất cũng sẽ thất bại nếu truy cập cơ sở dữ liệu không hiệu quả.

Chỉ mục

Phân tích các mẫu truy vấn và tạo chỉ mục trên cột được dùng trong , , và các điều khoản. Việc chạy quá trình có thể viết chậm, do đó, đo và theo dõi.

Truy vấn việc lưu trữ

Dùng các cửa hàng nhớ tạm như Redis hoặc Memcached để lưu tạm kết quả của các bộ nhớ tạm đắt tiền. Bộ nhớ tạm tạm tạm tạm tạm tạm không thích hợp với miền (phụ thuộc vào thời gian, tùy chọn sự kiện, hay hướng dẫn sử dụng sách hướng dẫn).

Đăng ký và tải lười biếng

Không bao giờ nạp bộ nhớ lớn. Dùng bộ nhớ dựa trên con chạy hay sửa đổi nút nút. Trong tiến trình ORM, cho phép tải lười biếng về các mối quan hệ con, nhưng cẩn thận với các vấn đề truy vấn N + 1- 2 • khi cần thiết, hãy sử dụng việc tải (v. d., [FLT: 10] trong phần mở rộng (FLT:11) trong đường dẫn mặc định (FLT:11).

Nạp lười biếng và nóng lòng nạp

Chọn chiến lược tải chính xác là quan trọng cho hiệu suất:

  • Nạp chậm: dữ liệu liên quan chỉ được nạp khi truy cập. Tính năng này hiệu quả cho thao tác đơn động nhưng có thể làm giảm hiệu suất trong vòng lặp (Vấn đề N + 1).
  • Nạp bộ nạp: tải tất cả các mối quan hệ cần thiết trong một yêu cầu. Hãy dùng khi bạn biết cách xem hay dịch vụ sẽ cần dữ liệu liên quan. Nhiều ORM hỗ trợ việc tải hoặc chiếu ảnh một cách rõ ràng.

Một phương pháp thực tế là mặc định là sẵn sàng tải các đường đã biết và chỉ tải lười biếng cho bạn ít khi truy cập. Hãy phân tích các đoạn trong cơ sở dữ liệu dưới tải thực tế để tìm sự thăng bằng đúng.

Lên kế hoạch cho việc leo đứng ngang

Khi ứng dụng của bạn tăng vượt ra ngoài một máy chủ, lớp mô hình phải hỗ trợ phân phối:

  • [FLT: 0] Mô hình không có mục: [FLT: 1] tránh cất giữ thông tin riêng về phiên chạy người dùng hoặc yêu cầu trong trường hợp mô hình. Hãy dùng việc chích bổ sung phụ thuộc để cung cấp dịch vụ không có trạng thái.
  • Mô hình nối tiếp nhanh: Mô hình sẽ đi qua mạng (v. d., qua JSON ARI) nên được thiết kế để tạo ra chuỗi nhanh/ gửi theo dõi. Hãy dùng đồ thị phức tạp thay vì đồ thị có tham chiếu vòng tròn.
  • Thành phốta cơ sở dữ liệu Sharding:) Để phân chia dữ liệu cực lớn, chia nhỏ dữ liệu trong nhiều cơ sở dữ liệu. Lớp kho của bạn nên trừu tượng hóa lý luận phân mảnh, lý tưởng với một chiến lược định tuyến dựa trên gốc tổng hợp.
  • Trong hệ thống phân phối, tránh các giao dịch khóa tài nguyên qua dịch vụ. Thay vào đó, nắm bắt sự nhất quán bằng cách sử dụng các mẫu sự kiện như sự kiện và hàng đợi thông điệp.

Các thực hành tốt nhất thêm

Name

Dùng một công cụ cài đặt quan hệ phụ thuộc để giải quyết các quan hệ phụ thuộc kho và dịch vụ. Cái tính năng này làm cho cấu hình gấp đôi từ việc thực hiện bê tông và làm cho nó trở nên nhỏ hơn để thay đổi thành phần để thử hay phóng to.

Khả năng thiếu khả năng

Bất cứ khi nào có thể, giá trị thiết kế là không thể thay đổi. Một lớp không thể thay đổi được có lỗi liên quan đến việc bí danh và tính đồng bộ. Hơn nữa, mô hình không thay đổi dễ dàng hơn để thử và tạm thời hơn.

Thử thách trong sự cô đơn

Thử nghiệm đơn vị cho dịch vụ và logic miền không nên cần thiết một cơ sở dữ liệu hoặc khung khởi động lại. Hãy dùng giả sử sử sử sao chép hoặc thực hiện lại. Kiểm tra hợp lệ có thể xác minh ứng xử kiên trì chống lại cơ sở dữ liệu thật, nhưng giữ chúng nhắm đến.

Lớp chống phá vỡ

Khi kết hợp với hệ thống di sản hoặc các hệ thống ATI bên ngoài, hãy tạo một lớp chống tham nhũng được phiên dịch giữa mô hình của bạn và mô hình bên ngoài của hệ thống, điều này ngăn chặn những thay đổi bên ngoài vào lãnh thổ của bạn.

Tài liệu khiêu dâm và các bản thảo mã

Các cấu trúc mô hình thường bị mờ đi theo thời gian. duy trì các bản ghi chép quyết định kiến trúc (ADRs) và áp dụng thống nhất thông qua các đánh giá mã. một mô hình có nhiều trình độ chi trả khi các thành viên mới lên tàu hoặc thăm lại mô-đun vài tháng sau đó.

Kết luận

Các mô hình cấu trúc để có khả năng sao chép trong mô hình MVC không phải là một bài tập thiết kế một lần mà là một sự rèn luyện tính năng đang diễn ra. Bằng cách áp dụng các nguyên tắc như tách các mối quan tâm, áp dụng DD và lớp kiến trúc, và khôn ngoan sử dụng các kho, dịch vụ, và DTOs, bạn tạo một lớp mô hình có thể phát triển với ứng dụng của bạn. Tính năng truy cập dữ liệu, chọn đúng chiến lược nạp, và lên kế hoạch để tăng tốc độ ngang đảm bảo ứng dụng của bạn vẫn còn lại trong tải. Hãy nhớ rằng mỗi quyết định kiến trúc liên quan đến việc sử dụng, đo lường, và nó.

Để khám phá thêm, hãy xem xét việc nghiên cứu sách Thiết kế miền ) và ) ) ). Những nguồn tài nguyên này cung cấp sự hiểu biết sâu sắc hơn về các mẫu được thảo luận ở đây.