Hiểu các nguyên tắc SOLID

Nguyên tắc SOLID là năm hướng dẫn thiết kế đối tượng để giúp các nhà phát triển tạo ra các hệ thống dễ dàng hơn để duy trì, mở rộng, và kiểm tra. chúng được giới thiệu bởi Robert C. Martin vào đầu những năm 2000 và đã trở thành nền tảng của cấu trúc phần mềm hiện đại. mỗi nguyên tắc nói về một khía cạnh cụ thể của thiết kế phần mềm:

  • Nguyên tắc trách nhiệm phụ trách [SRP]: Lớp chỉ nên có một lý do để thay đổi, nghĩa là nó nên chịu trách nhiệm về một chức năng duy nhất.
  • Nguyên tắc mở/COP: Lớp học nên mở để mở rộng nhưng đóng để sửa đổi — bạn có thể thêm những hành vi mới mà không thay đổi mã đã có.
  • Các kiểu con Nguyên tắc conLiskov (LP): ) phải thay thế kiểu con cho kiểu cơ bản của chúng mà không làm hỏng hệ thống.
  • Ứng dụng khách không nên phụ thuộc vào giao diện mà không dùng; tốt hơn là có nhiều giao diện nhỏ, cụ thể hơn một giao diện lớn, mục đích chung.
  • Nguyên tắc phụ (DIP): ) Các mô- đun cấp cao không nên phụ thuộc vào các mô- đun cấp thấp; cả hai nên phụ thuộc vào các trừu tượng. Các khái niệm không nên phụ thuộc vào chi tiết — chi tiết nên dựa vào trừu tượng hóa.

Vai trò của UML trong việc hình dung hóa phần mềm

Ngôn ngữ Mô hình hợp nhất (MML) cung cấp một ký hiệu chuẩn cho thiết kế hệ thống hình ảnh hóa. Biểu đồ hoạt động như một ngôn ngữ được chia sẻ giữa các nhà phát triển, kiến trúc sư và các nhà giữ hoa, làm cho việc giao tiếp dễ dàng hơn với cấu trúc phức tạp. Khi áp dụng cho kiến trúc của SOLID, sơ đồ UML cho thấy thiết kế phù hợp với các nguyên tắc và các khu vực nổi bật cần thiết.

UML bao gồm 14 kiểu biểu đồ, nhưng điều thích hợp nhất cho việc hình dung về SOLID là sơ đồ cấp, sơ đồ thành phần, sơ đồ trình tự và sơ đồ gói. Mỗi kiểu biểu đồ có thể nhấn mạnh các khía cạnh khác nhau của các nguyên tắc — chẳng hạn, sơ đồ lớp học cho thấy trách nhiệm và giao diện lớp học, trong khi sơ đồ thành phần tô sáng các hướng phụ thuộc và điểm khả thi.

Lập sơ đồ UML cho mỗi nguyên tắc SOLID

Các biểu đồ và biểu đồ lớp học về trách nhiệm đơn lẻ

Sơ đồ lớp là lý tưởng để xác minh sự tuân thủ của SRP. Một sơ đồ lớp được thiết kế tốt cho thấy mỗi lớp với một tập hợp các tính năng và phương pháp rõ ràng. Nếu một lớp có nhiều trách nhiệm, hộp trong sơ đồ sẽ chứa các thao tác không liên quan — một cờ đỏ cho việc vi phạm SRP.

Ví dụ, một lớp tên « Inice Management » (người quản lý dịch vụ) quản lý « từ thiện » (cả trong lẫn thư điện tử lẫn thư điện tử vi phạm SRP. Sơ đồ lớp sẽ hiển thị phương pháp « BAR tiểu thức Total » và « InendEmail » bên trong cùng hộp, đánh dấu sự cần thiết chia lớp thành « IniceCculator » và « emailService ». Việc đánh dấu ranh giới trách nhiệm giúp đỡ nhận sự vi phạm sớm hơn.

Biểu đồ và thành phần mở/Cloled

Sơ đồ thành phần minh họa cấu trúc cấp cao của một hệ thống, hiển thị các thành phần (v. d., mô- đun, hệ thống phụ) kết nối bằng giao diện. Để theo sát mục OCP, các thành phần nên hiển thị giao diện cố định trong khi cho phép thực hiện các giao diện mới mà không sửa đổi các giao diện đã có.

Trong một biểu đồ thành phần, bạn có thể đại diện điều này bằng cách sử dụng giao diện đã cung cấp và cần thiết. Một thành phần « Chi trả » có thể xác định giao diện « trả lại ». Phương pháp thanh toán mới ( Thẻ thanh công, PayPal) được thêm vào như là các thành phần riêng biệt mà thực hiện giao diện đó. Biểu đồ làm cho bộ xử lý lõi không cần thay đổi — nó chỉ phụ thuộc vào sự trừu tượng.

Nguyên tắc và di sản của Liskov

Nếu một lớp học có các mối quan hệ di truyền trực tiếp thử nghiệm các phương pháp cơ bản vi phạm cách cư xử, thì hệ thống phân cấp là nghi ngờ.

Một sự vi phạm LP cổ điển là một hạng mục được thừa kế « square » trong « rucle ». Trong sơ đồ, nếu « square » thay đổi « » [ đặt « hight » (dấu chấm dứt giao ước « rucre » (các ký tự) cổ điển) thì nó sẽ phá vỡ giao thức « rRclecleng ». Sơ đồ nên hiển thị không thể thay thế được. Để sửa đổi điều này, bạn có thể dùng giao diện thường dùng giao diện « squape` squad » với mục « Reccle » và « square » (các biểu đồ phân biệt hình phân loại » — rồi lớp sẽ không hiển thị một phần thừa kế trực tiếp giữa hai.

Bảng nháp và biểu đồ phân cách giao diện

UML có thể mô hình giao diện cụ thể bằng các hộp giao diện (với tùy chọn giao diện [FLT: 0]]. Để áp dụng cho IP, bạn tạo nhiều giao diện nhỏ thay vì một giao diện lớn. Sơ đồ cho biết các hạng nào phụ thuộc vào giao diện nào; nếu lớp có các phương pháp không sử dụng trong giao diện, đó là một sự vi phạm.

Thí dụ, thay vì dùng giao diện « In tạm dịch » bằng « in được », « « ký tự » (), « fx » (), « đã chia thành « « « In được », « khả năng » và « Bỏ qua ». Sơ đồ phân loại cho thấy chỉ thực hiện được « In được « In », trong khi « « « « Người in » (người dùng) » (không thể in được cả ba). Cách tiếp cận này giữ cho các ứng dụng « người dùng được » nghiêng và ngăn cản các ứng dụng khách bị buộc phải phụ thuộc vào thao tác không thích hợp.

Biểu đồ quan hệ phụ thuộc và ngược lại nguyên tắc phụ thuộc

Cả biểu đồ lớp và biểu đồ gói đều có thể minh họa sự tuân thủ của DIP. DIP cho biết các mô- đun cấp cao (v. d. logic doanh nghiệp) không nên phụ thuộc vào mô- đun cấp thấp (v. d., trình điều khiển co sở dữ liệu). Thay vào đó, cả hai nên phụ thuộc vào các mô- đun trừu tượng (mặt giao diện hay lớp trừu tượng).

Trong sơ đồ phụ thuộc gói, bạn có thể hiển thị hướng của phụ thuộc. Nếu gói có điểm cao trực tiếp đến gói cấp thấp, sơ đồ cảnh báo về sự vi phạm DIP. Giải pháp là giới thiệu một tính năng trừu tượng (mặt gián tiếp) trong gói cấp cao, với gói cấp thấp phụ thuộc vào giao diện đó. Sơ đồ cập nhật hiển thị quan hệ phụ thuộc ngược lại — dấu hiệu rõ ràng của « phù hợp với SOLID ».

Tập tin tốt nhất để tạo ra sơ đồ UML cho Kiến trúc SOLID

Làm theo những hướng dẫn này để tạo ra những sơ đồ UML sạch sẽ và có ích để củng cố các nguyên tắc SOLID:

  • Dùng định kiến và ghi chú:) áp dụng [FLT: 1] <), <, và < thành kiến. Thêm các ghi chú để giải thích những quyết định thiết kế, chẳng hạn như lý do tại sao giai cấp có một trách nhiệm.
  • Hãy giữ cho biểu đồ tập trung: [FLT: 1) Một sơ đồ nên chỉ nói về một nguyên tắc hoặc một tập hợp nhỏ các nguyên tắc liên quan.
  • Chỉ những mối quan hệ thích hợp: Hiển thị sự chia sẻ, liên kết, kết hợp và tên phụ thuộc nơi chúng quan trọng.
  • Vi phạm ánh sáng cao: Dùng màu khác hoặc gạch gạch gạch để đánh dấu các mối quan hệ khó khăn. Ví dụ, mũi tên phụ thuộc màu đỏ từ cấp cao đến mật mã cấp thấp có thể báo động một hành vi vi vi vi phạm DIP.
  • Khi bạn sửa chữa thiết kế để gặp SOLID, cập nhật các biểu đồ. UML là một hiện vật sống — xem nó như một đối tượng cho mã, chứ không phải phác thảo một lần.

Những cạm bẫy thông thường và cách tránh chúng

Ngay cả những nhà phát triển kinh nghiệm cũng có thể rơi vào bẫy khi sử dụng UML để thiết kế kiến trúc SOLID.

Công cụ để tạo biểu đồ UML

Một số công cụ có thể giúp bạn tạo ra sơ đồ UML đồng bộ hoá với mã. Chọn một cái phù hợp với dòng làm việc của bạn:

  • PlantUML: Một công cụ nhập dạng đồ thị dựa trên văn bản để tích hợp với điều khiển phiên bản. Viết mô tả văn bản đơn giản và tạo ra sơ đồ tự động. Lý tưởng cho các nhóm muốn lập trình như mã. [FLT: 2] LB [FLT] nhiều hơn tại Cây [FLT:].
  • Vẽ.io (diagrams.net): Một trình biên soạn sơ đồ dựa trên web miễn phí. Hỗ trợ UML Pages và xuất dễ dàng. Tốt cho việc hợp tác bảng trắng.
  • Lucidchart: Một nền tảng được trả tiền với mẫu UML và sự hợp tác thời gian thực.
  • Modelio: Một công cụ mô hình mã nguồn mở hỗ trợ UML và BPMN. Có thể tạo ra mã từ biểu đồ lớp và mã số đã có sẵn.
  • IntelliJ IDEA tối đa: bao gồm các tính năng in trong biểu đồ cho hạng, gói và sơ đồ phụ thuộc. Làm việc trực tiếp với cơ sở mã hóa trực tiếp cho sự đồng bộ hoá trực tiếp.

Để hiểu sâu hơn về nguyên tắc SOLID và sự kết hợp UML, bạn có thể đề cập đến nguyên tắc ban đầu của Robert C. Martin viết [Các nguyên tắc của sự thỏa mãn] [PDF] [FLT: 1] và bài viết Wikipedia về [FLT:] [FLT:].

Kết luận

Các biểu đồ UML biến đổi các nguyên tắc SOLID trừu tượng thành các mẫu hình ảnh cụ thể mà các nhà phát triển có thể kiểm tra, thảo luận và cải tiến.

Mấu chốt là sử dụng UML không phải là một hiện vật quan liêu mà là một công cụ sống tiến hóa với mã của bạn kết hợp với thế hệ biểu đồ tự động và đánh giá mã thường xuyên, UML trở thành một đồng minh mạnh mẽ trong việc xây dựng hệ thống điều hành SOLID đứng vững với thử nghiệm thời gian.