Lập trình viên viết ra những phần mềm, những ứng dụng, phần mềm tốt đòi hỏi lập trình viên phải cần có những kĩ năng, kinh nhiệm, từng chải qua nhiều dự án. Để viết được những phần mềm như vậy bạn cần học nhiều thứ và điều bạn cần học trong số đó là tìm hiểu nguyên tắc SOLID.

SOLID là gì?

Hiểu một cách đơn giản, những nguyên tắc SOLID giúp cho các lập trình viên phát triển, xây dựng ra các phần mềm dễ dàng và clean hơn, dễ dàng bảo trì và sửa đổi khi quy mô của phần mềm phát triển lớn hơn, phức tạp hơn.

SOLID là viết tắt của 5 chữ cái đầu trong 5 nguyên tắc này:

  • Single responsibility priciple
  • Open/Closed principle
  • Liskov substitution principe
  • Interface segregation principle
  • Dependency inversion principle

Vì sao chúng ta cần áp dụng SOLID trong phần mềm

Mỗi loại design pattern hoặc principle được tổng hợp lại nhằm mục đích để giải quyết những bài toán thường gặp hay những bài toán lặp đi lặp lại trong quá trình thực hiện phát triển phần mềm. Nguyên tắc SOLID sinh ra với mục đích tương tự như vậy, chúng giúp phần mềm hoạt động tốt hơn.

Khi áp dụng SOLID vào việc phát triển phần mềm, ứng dụng thì phần mềm các bạn tạo ra sẽ dễ hiểu, dễ duy trì và linh hoạt hơn.

Quá trình ra đời của SOLID?

Lập trình hướng đối tượng (object oriented programming – OOP) là một mô hình lập trình được sử dụng nhiều hiện nay. Các tính chất hướng đối tượng đáng chú ý như là:

  • Tính trừu tượng
  • Tính đóng gói
  • Tính kế thừa
  • Tính đa hình

Những tính chất của hướng đối tượng này giúp chúng ta xây dựng được các chương trình giải quyết được nhiều vấn đề cụ thể khác nhau. Hầu hết lập trình viên đều đã biết các tính chất này của OOP, nhưng cách thức để phối hợp các tính chất này với nhau để tăng hiệu quả của ứng dụng thì không phải ai cũng nắm được. Một trong những chỉ dẫn(hướng dẫn) để giúp chúng ta sử dụng được OOP hiệu quả hơn đó là thực hiện theo nguyên tắc SOLID.

5 nguyên tắc của SOLID

1. Nguyên tắc trách nhiệm đơn lẻ (Single Responsibility Principle)

Có thế có nhiều cách để có thể đánh giá chất lượng code của một chương trình. Nhưng yêu cầu quan trọng là code của chương trình(ứng dụng) phải có khả năng bảo trì được (maintainable).

1.1 Nguyên tắc trách nhiệm đơn lẻ là gì?

Một class chỉ nên thực hiện một công việc. Nói cách khác, một class chỉ nên thực hiện một công việc, thay vì thực hiện nhiều việc trong một class thì chúng ta có thể cho mỗi class thực hiện một công việc.

1.2 Tại sao cần phải đơn lẻ?

Nếu một class có quá nhiều chức năng cũng sẽ trở nên cồng kềnh và phức tạp hơn. Cùng với sự phát triển của ứng dụng, các requirement liên tục thay đổi dẫn tới sự thay đổi của code. Nếu một class quá nhiều chức năng sẽ rất khó thay đổi, tốn nhiều thời gian cho việc sửa chữa hơn và gây thể ảnh hưởng tới các module đang chạy.

1.3 Làm sao để Đơn lẻ ?

Về cơ bản, chúng ta cần phải thiết kế các module, các class sao cho đơn giản nhất có thể, mỗi module chỉ thực hiện một chức năng cụ thể duy nhất.

1.4 Ví dụ

solid viết code
solid viết code

Việc chia nhỏ ra như vậy ta thấy rằng có thể dễ dàng gọi đến lớp tương ứng với từng công việc

nguyên tắc solid
nguyên tắc solid

1.5 Kết luận

Nguyên tắc này nghe có vẻ đơn giản, nhưng thực ra cần nhiều thời gian để có thể sử dụng thành thục nguyên lý này. Tuy nhiên cũng không nên vội vàng, hãy để thời gian để bạn hiểu rõ được ý nghĩa thực sự của nguyên lý này.

2. OCP Nguyên tắc đóng mở (The Open-Closed Principle)

2.1 Nguyên tắc đóng mở là gì?

“Cần hạn chế việc chỉnh sửa bên trong một Class hoặc Module có sẵn, thay vào đó hãy xem xét mở rộng chúng.”

Có hai vấn đề cần quan tâm tới trong nguyên tắc này:

  • Hạn chế sửa đổi: Có nghĩa là không nên chỉnh sửa mã code của một module hoặc class có sẵn, vì làm như vậy sẽ ảnh hưởng tới tính đúng đắn của chương trình.
  • Ưu tiên mở rộng: Khi ứng dụng của bạn cần phát triển thêm tính năng mới, ta nên kế thừa và mở rộng các module/class có sẵn thành các module con lớn hơn. Các module/class con vừa có các đặc tính của lớp cha (đã được kiểm chứng đúng đắn) và bổ sung tính năng mới phù hợp với yêu cầu.

2.2 Ứng dụng

Nguyên tắc OCP xuất hiện khắp mọi ngóc ngách trong việc lập trình. Ứng dụng cơ bản của nguyên lý này là hệ thống plug-in(cho Eclipse, Visual Studio, add-on Chrome…). Để thêm các tính năng mới cho phần mềm, chỉ việc cài đặt các plug-in này, không cần can thiệp gì đến source code sẵn có.

3. Nguyên tắc phân vùng Liskov (The Liskov Substition Principle)

3.1 Nguyên tắc đóng mở là gì?

“Trong một chương trình, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình”.

3.2 Chúng ta hãy xem ví dụ sau đây:

nguyên tắc phân vùng
nguyên tắc phân vùng

Chúng ta có class Square kế thừa Rectangle

nguyên tắc phân vùng 2- solid
nguyên tắc phân vùng 2

4. Nguyên tắc phân tách giao diện (Interface Segregation Principle)

“Nếu Interface quá lớn thì nên tách thành những interface nhỏ hơn, với nhiều mục đích cụ thể.”

Nhờ thiết kế này, chúng ta không còn phải lo lắng tới việc phải implement những hàm không cần thiết. Sẽ dễ dàng kiểm soát được việc mở rộng hơn.

5. Dependency inversion principle

Nguyên tắc này được phát biểu như sau:

-Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.

-Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại. ( Các class giao tiếp với nhau thông qua interface, không phải thông qua implementation.)

Có thể hiểu như sau:

Những thành phần trong 1 chương trình chỉ nên phụ thuộc vào những cái trừu tượng (abstraction).
Những thành phần trừu tượng không nên phụ thuộc vào các thành phần mang tính cụ thể mà nên ngược lại.

Xem thêm: Design pattern là gì?

Trên đây là những nguyên tắc thiết yếu cần có trong lập trình. Cảm ơn các bạn đã xem bài viết của mình.

Tham khảo thêm tại: https://en.wikipedia.org/wiki/SOLID

Có thể bạn quan tâm:

  1. Lập Trình Hướng Đối Tượng căn bản, 4 tính chất của oop?