SOLID là gì? 5 nguyên tắc của SOLID và cách áp dụng

ITNavi26 Nov 2022 581

Nếu đang công tác ở ngành lập trình hẳn bạn đã từng nghe cụm từ SOLID ít nhất một lần. Như các công việc khác, lập trình sẽ cần có nguyên tắc để giảm thiểu rủi ro và tối ưu hóa hiệu suất, đó chính là SOLID. Vậy SOLID là gì? Hãy cùng ITNavi khám phá ngay trong bài viết dưới đây.

SOLID là gì?

Trong lập trình SOLID vốn là 5 nguyên tắc phát triển bởi Michael Feathers và Bob Martin. Những hướng dẫn này giúp cho các lập trình viên tạo được đoạn code dễ hiểu, dễ đọc và dễ Maintain. 

SOLID giúp cho các lập trình viên tạo được đoạn code dễ hiểu, dễ đọc và dễ Maintain

SOLID chính là viết tắt 5 cụm từ sau:

  • Single Responsibility Principle(SRP): Tức là nguyên tắc trách nhiệm đơn lẻ.
  • Open/Closed Principle(OCP): Đây chính là nguyên tắc đóng mở.
  • Liskov Substitution Principle(LSP): Là nguyên tắc phân vùng Liskov.
  • Interface Segregation Principle(ISP): Nghĩa là nguyên tắc phân tách giao diện.
  • Dependency Inversion Principle(DIP): Đây chính là nguyên tắc đảo ngược phụ thuộc.

 

Lịch sử ra đời của SOLID

OOP(Object Oriented Programming- lập trình hướng đối tượng) là phương thức lập trình cho phép chúng ta dùng code để tiến hành trừu tượng hóa đối tượng nào đó.

SOLID chính là cẩm nang hướng dẫn chúng ta dùng OOP hiệu quả

Quy trình này giúp tạo đối tượng nhất định. Đây được coi là phương thức lập trình phổ biến nhất hiện nay. OOP phù hợp với hầu hết những ngôn ngữ lập trình hiện nay.

Hiệu năng của Object Oriented Programming được quyết định bởi 4 yếu tố sau:

  • Abstraction(tính trừu tượng): Người dùng sẽ dùng lớp trừu tượng để tạo mô hình của đối tượng ở thế giới thực.
  • Encapsulation(tính đóng gói): Dùng để chỉ những thực thể của lớp trừu tượng có giá trị độc lập.
  • Inheritance(tính kế thừa): Cho phép đối tượng được kế thừa, đồng thời mở rộng lẫn nhau.
  • Polymorphism(tính đa hình): Tùy từng đối tượng, ta có thể thực hiện quy trình theo nhiều cách riêng biệt.

Vậy SOLID liên quan gì tới OOP? Bạn có thể hiểu SOLID chính là cẩm nang hướng dẫn chúng ta dùng OOP hiệu quả. Khi tuân thủ những nguyên tắc này bạn sẽ phối hợp nhuần nhuyễn cả 4 tính năng của OOP.

5 nguyên tắc SOLID và cách áp dụng

Để hiểu rõ hơn về SOLID, chúng ta cùng khám phá chi tiết 5 nguyên tắc SRP, OCP, LSP, ISP và DIP cũng như cách áp dụng chúng bạn nhé:

Single Responsibility Principle(SRP- nguyên tắc trách nhiệm đơn lẻ)

Single Responsibility Principle ứng với chữ S trong SOLID. Bạn có thể hiểu đơn giản nguyên tắc này đó chính là mỗi người một việc.

Single Responsibility Principle(SRP- nguyên tắc trách nhiệm đơn lẻ)

Khi thiết kế phần mềm, ứng dụng bạn chỉ nên để duy nhất một Class(lớp) chỉ có một chức năng/ một trách nhiệm nhằm:

  • Kiểm thử: Khi kiểm thử bạn sẽ không phải suy nghĩ nhiều cho việc test Class. Bởi Class khi đó chỉ có duy nhất 1 chức năng xác định.
  • Ít mối quan hệ phụ thuộc: Do chỉ có đúng 1 chức năng cho Class, vì vậy sẽ giảm thiểu phụ thuộc qua lại giữa những chức năng.
  • Tính lớp lang: Tức là làm lớp nhỏ, sau đó tìm tới lớp lớn hơn. Điều này giúp bạn có thể sắp xếp phần mềm hiệu quả hơn.

Ví dụ: Tạo nơi để lưu trữ sách cũng như thuộc tính gồm tên tác giả, tên sách, nội dung, sách và chức năng in sách như sau:

Tạo nơi để lưu trữ sách cũng như thuộc tính gồm tên tác giả, tên sách, nội dung, sách và chức năng in sách

Điều kể trên đã vi phạm nguyên tắc trách nhiệm đơn lẻ. Vì vậy, bạn cần tách chức năng in sách và lưu trữ thành 2 Class riêng biệt. Bạn có thể tạo Class mới từ lớp xử lý sách như sau để tránh phải tốn công cho việc kiểm thử cũng như sắp xếp sửa đổi những chức năng:

Tạo Class mới từ lớp xử lý sách

Open/Closed Principle(OCP là nguyên tắc đóng mở)

Open/Closed Principle ứng với chữ O ở SOLID. Với nguyên lý này, mỗi khi thêm chức năng mới, bạn hãy viết một Class mới để mở rộng Class cũ chứ không nên sửa Class cũ. 

Việc này sẽ phát sinh nhiều lớp, nhưng người dùng sẽ không cần Test lại những lớp cũ đó mà chỉ cần test nơi chứa chức năng mới.

Thường mở rộng thêm chức năng cần viết Code mới. Vậy để thiết kế một module có thể mở rộng nhưng hạn chế sửa đổi code chúng ta cần làm gì? Lúc này bạn hãy tách các phần dễ thay đổi khỏi phần khó có thể thay đổi những vẫn bảo đảm không làm ảnh hưởng tới những phần còn lại.

Ví dụ: Bạn cần 1 lớp đảm nhận kết nối tới CSDL. Bạn đầu thiết kế chỉ có MySQL và SQL Server. Cụ thể:

Bạn đầu thiết kế chỉ có MySQL và SQL Server

Yêu cầu: Bạn cần kết nối thêm vài hệ CSDL khác và Oracle. Để thêm chức năng người dùng cần thêm Code các khối Elseif khác. Nhưng việc này khiến cho Code trở nên cồng kềnh, đồng thời khó quản lý hơn.

Giải pháp như sau: Dùng Abstract để thiết kế lại những lớp MySql, SqlServer, Oracle… Những lớp này đều tạo kết nối tới CSDL tương ứng, được gọi là Connection. Cách kết nối tới CSDL gọi chung là doConect.

Khi làm lại thiết kế sẽ có dạng như sau:

Thiết kế Class sau khi làm lại

Với thiết kế này, khi bạn cần kết nối tới CSDL mới chỉ cần thêm Class mới kế thừa Connection, không cần đổi Code của ConnectionManager. Có thể thấy điều này đã thỏa mãn đủ 2 điều kiện của OCP.

Liskov Substitution Principle(LSP- nguyên tắc phân vùng Liskov)

Liskov Substitution Principle ứng chữ L trong SOLID. LSP là một trong những nguyên tắc quan trọng của SOLID. Phân vùng Liskov giúp giải quyết được những lỗi thường xảy ra đối với lập trình.

Ví dụ: Có đoạn mã mô tả về chim biết bay. Khi gặp chim không biết bay(cánh cụt) chúng sẽ được gắn cùng NoFlyException. Nhưng nếu ở vòng lặp main, chim cánh cụt lại xuất hiện, chương trình sẽ quăng Exception tự động. Đó chính là bản chất của Liskov Substitution Principle.

Cách giải quyết: Chúng ta cần phải tác Class chim không biết bay thành một Interface riêng. Phân vùng Liskov xuất hiện để nhắc nhở các lập trình viên phải chú ý tới sai phạm của nội dung trong những code lập trình. Nếu để tới khi thực hiện xong mới phát hiện lối thì sẽ tốn nhiều thời gian để sửa, thậm chí không thể sửa được.

Interface Segregation Principle(ISP- nguyên tắc phân tách giao diện)

Thay vì sử dụng Interface lớn, bạn nên tách chúng thành các Interface nhỏ với mục đích cụ thể. Để hiểu rõ hơn về Interface Segregation Principle chúng ta đi vào một ví dụ thực tế. 

Interface Segregation Principle(ISP- nguyên tắc phân tách giao diện)

Chẳng hạn bạn đang sở hữu trung tâm cung cấp những gói du lịch gồm sản phẩm như sau: Gói 1, gói 2, gói 3… Những khách hàng cùng dùng một gói sẽ vào 1 Interface chung. Hẳn ban đầu bạn sẽ cảm thấy cách quản lý này khá hợp lý. 

Nhưng, trường hợp có khách hàng muốn dùng một vài dịch vụ có trong gói 1 và gói 2, thì gói mới sẽ được phát sinh. Ngày càng nhiều người yêu cầu các gói riêng như vậy. Nếu cứ viết chung vào giao diện gói du lịch, bạn sẽ phải thực hiện nhiều hàm không cần thiết.

Tuy nhiên, với ISP chúng ta có thể giải quyết được trường hợp này. Bạn hãy tách những dịch vụ thành các giao diện cụ thể. Khi đó, khách hàng yêu cầu sử dụng dịch vụ nào, bạn hãy gộp chúng thành một gói mới. Tóm lại, ISP giúp chúng ta mở rộng quy mô đơn giản, dễ dàng hơn.

Dependency Inversion Principle(DIP chính là nguyên tắc đảo ngược phụ thuộc)

Nội dung nguyên tắc này nói tới việc thành phần cụ thể nên phụ thuộc vào thành phần trừu tượng. Bởi thành phần trừu tượng ít bị thay đổi. Còn các thành phần cụ thể dù khác nhau nhưng đều tuân theo quy tắc thành phần trừu tượng định ra.

Dependency Inversion Principle(DIP chính là nguyên tắc đảo ngược phụ thuộc)

Việc phụ thuộc vào Abstraction sẽ giúp chương trình diễn ra linh động hơn và thích ứng tốt với những đổi thay liên tục.

Vì sao SOLID giúp lập trình hiệu quả hơn?

Đến đây hẳn bạn đã có thể hiểu được 5 nguyên tắc của SOLID rồi đúng không? SOLID giúp việc lập trình trở nên dễ dàng, hiệu quả hơn bởi:

Lý do

Chi tiết

✅ Dễ hiểu

Hiếm khi có phần mềm nào được phát triển độc lập bởi một cá nhân. Đó chính là kết quả làm việc của một team gồm nhiều thành viên.

Chính vì vậy việc áp dụng SOLID để code của bạn ngăn nắp, gọn gàng hơn sẽ tạo cảm tình với các đồng nghiệp khác. Đồng thời nó còn khiến Teamwork hiệu quả hơn.

✅ Dễ sửa đổi, nâng cấp

Khi chúng ta nhìn vào code sẽ nhân ra được vị trí của từng hàm hoặc vai trò của mỗi lớp. Từ đó bạn có thể dễ dàng nâng cấp hoặc sửa đổi chương trình mình đã viết. 

Điều này giúp lập trình viên đỡ tốn thời gian, công sức để tìm hiểu lại code của chính mình. Bên cạnh đó công nghệ này còn giúp người khác hiểu được ý nghĩa đoạn code đó và giúp bạn sửa chữa khi cần thiết.

✅ Khả năng tái sử dụng

Nếu chọn con đường lập trình, hẳn bạn sẽ tham gia rất nhiều dự án. Vậy nên, bạn cần phải làm cho code của mình ngăn nắp hơn và ghi chú thành từng Module một cách.

Bạn hãy dự án cũ và copy rồi sử dụng lại lần nữa. Cách này sẽ khiến bạn tiết kiệm nhiều thời gian đấy!


Trên đây là những chia sẻ về SOLID. Hy vọng bạn đã hiểu hơn về các nguyên tắc này. Tuy nhiên để vận dụng nhuần nhuyễn bạn nên áp dụng SOLID thường xuyên vào công việc của mình. Theo dõi ITNavi thường xuyên để đón đọc bài viết hay khác bạn nhé!

ITNavi - Nền tảng kết nối việc làm IT

Nguồn:SOLID là gì? 5 nguyên tắc của SOLID và cách áp dụng

Bài viết liên quan

NEWSLETTER

Nhập địa chỉ email của bạn dưới đây để đăng ký nhận tin mới nhất

KẾT NỐI VÀ THEO DÕI