The S.O.L.I.D Principles

The S.O.L.I.D Principles

Trong quá trình làm việc, anh em chắc không lạ gì với từ khóa S.O.L.I.D. SOLID là một bộ nguyên tắc hết sức quan trọng trong lập trình hướng đối tượng. SOLID được giới thiệu năm 2000 bởi Robert C. Martin (Uncle Bob) trong bài báo Design Principles and Design Patterns. SOLID được kết hợp từ 5 chữ cái đầu của 5 quy tắc cụ thể là:

  • Single Responsibility
  • Open / close principle
  • Lislov substitution principle
  • Interface Seregration
  • Dependency Inversion

Sau khi đọc và tìm hiểu một số nguồn về Solid mình có thấy một bài viết khá hay và trực quan nên muốn đưa nó đến cho anh em nào chưa biết. Cùng nhau xem nhé.

S — Single Responsibility

Như ta đã biết thì Single responsibility là quy tắc đầu tiên. Quy tắc này chỉ ra rằng:

Mỗi một class chỉ nên giữ một nhiệm vụ duy nhất.

Nhìn vào bức ảnh trên chúng ta có thể thấy ngay quy tắc này. Thay vì một class thực hiện tất cả các nhiệm vụ thì tại sao ta không chia ra thành nhiều class với mỗi một class thực hiện một nhiệm vụ riêng biệt.

Có thể nhiều người sẽ cho rằng tại sao phải mất công đi phân chia thành nhiều class sẽ rất khó quản lí về sau tuy nhiên việc này sẽ giúp ích khá nhiều trong việc lập trình trong hiện tại cũng như sau này và còn giảm thiểu bug.

Sẽ thật khó chịu khi 1 class lên tới mấy nghìn dòng code, khi lỗi một phần nào đó sửa sẽ dễ ảnh hưởng đến các phần còn lại phải k nào?

O — Open-Closed

Đây là quy tắc thứ 2. Quy tắc này chỉ ra rằng:

Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó

Bức ảnh trên thể hiện rõ điều này. Mỗi khi ta muốn thêm chức năng,.. cho chương trình, chúng ta nên viết class mới mở rộng class cũ thay vì sửa đổi class cũ. Điều này sẽ tránh được sự thay đổi không cần thiết cũng như sai xót trong quá trình lập trình làm thay đổi chức năng và nội dung của class cũ.

L — Liskov Substitution

Đây là quy tắc thứ 3. Quy tắc này chỉ ra rằng:

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

Bức ảnh trên nhìn khá dễ hiểu phải không nào. Trong quá trình lập trình sẽ thường xuyên sẽ phải tạo các class con kế thừa từ class cha tuy nhiên việc sử dụng class con thay thế class cha vẫn phải đảm bảo logic hoạt động của ứng dụng.

Một ví dụ đơn giản: Hãy tưởng tượng bạn có 1 class cha tên Vịt. Các class VịtBầu, VịtXiêm có thể kế thừa class này, chương trình chạy bình thường. Tuy nhiên nếu ta viết class VịtChạyPin, cần pin mới chạy được. Khi class này kế thừa class Vịt, vì không có pin không chạy được, sẽ gây lỗi. Đó là 1 trường hợp vi phạm nguyên lý này.

I — Interface Segregation

Đây là quy tắc thứ 4. Quy tắc này chỉ ra rằng:

Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể

Tức là việc tách nhỏ interface lớn sẽ giúp cho việc custom trở lên dễ dàng và đơn giản hơn, giảm thiểu những chức năng không cần thiết nhưng vẫn phải implement như khi sử dụng interface tổng.

D — Dependency Inversion

Quy tắc cuối cùng chỉ ra rằng:

1. 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.

2. 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.)

hình ảnh trên có vẻ vẫn chưa diễn tả rõ ràng lắm quy tắc này. Chúng ta cùng đi vào 1 ví dụ: Để dễ hiểu, bạn hãy nhìn vào cái mấy cái đèn điện trong nhà mình. Ở đây, module cấp cao chính là ổ điện, interface chính là đuôi đèn tròn, 2 module cấp thấp là bóng đèn tròn và bóng đèn huỳnh quang.

Hai module này đều kế thừa interface đuổi tròn, Ta có thể dễ dàng thay đổi 2 loại bóng vì module cấp cao (ổ điện) chỉ quan tâm tới interface (đuôi tròn), không quan tâm tới implementation (bóng đèn tròn hay huỳnh quang).

Thông qua những hình ảnh trên chúng ta sẽ có cái nhìn rõ hơn về solid cũng như phần nào hiểu được những nguyên tắc của nó áp dụng trong thực tế như thế nào để từ đó lập trình được tốt hơn. Hi vọng nó sẽ giúp được phần nào thắc mắc của anh em.

Tài liệu tham khảo: https://medium.com/backticks-tildes/the-s-o-l-i-d-principles-in-pictures-b34ce2f1e898

All Rights Reserved