fbpx
close

SOLID là gì? Tổng quan về 5 nguyên tắc của SOLID

Tác giả: TinoHost Ngày cập nhật: 28/10/2024 Chuyên mục: Webmasters
Disclosure
Website Wiki.tino.org được cung cấp bởi Tino Group. Truy cập và sử dụng website đồng nghĩa với việc bạn đồng ý với các điều khoản và điều kiện trong chính sách bảo mật - điều khoản sử dụng nội dung. Wiki.tino.org có thể thay đổi điều khoản sử dụng bất cứ lúc nào. Việc bạn tiếp tục sử dụng Wiki.tino.org sau khi thay đổi có nghĩa là bạn chấp nhận những thay đổi đó.
Why Trust Us
Các bài viết với hàm lượng tri thức cao tại wiki.tino.org được tạo ra bởi các chuyên viên Marketing vững chuyên môn và được kiểm duyệt nghiêm túc theo chính sách biên tập bởi đội ngũ biên tập viên dày dặn kinh nghiệm. Mọi nỗ lực của chúng tôi đều hướng đến mong muốn mang đến cho cộng đồng nguồn thông tin chất lượng, chính xác, khách quan, đồng thời tuân thủ các tiêu chuẩn cao nhất trong báo cáo và xuất bản.

Trong quá trình phát triển phần mềm, việc tạo ra một hệ thống mã nguồn dễ đọc, dễ hiểu và dễ bảo trì là một trong những mục tiêu quan trọng nhất. SOLID, một tập hợp các nguyên tắc thiết kế phần mềm, ra đời để giúp các nhà phát triển đạt được mục tiêu này. Vậy cụ thể SOLID là gì? Cùng TinoHost tìm hiểu qua bài viết dưới đây nhé!

SOLID là gì?

Trong khi xây dựng một ứng dụng phần mềm, bạn sẽ luôn phải sẵn sàng đối mặt với việc thay đổi code hoặc xây dựng thêm một vài tính năng mới và cả việc bảo trì phần mềm theo một cách định kỳ.

Để đảm bảo được điều này, code của bạn cần phải gọn gàng – ngăn nắp, khi bạn sửa chữa hoặc nâng cấp phần mềm, bạn sẽ không phải “đau khổ” nhớ lại mình đã làm gì, hay loay hoay kiểm tra class nào là của class nào…

solid-la-gi
SOLID là gì?

Nếu bạn thiết kế code của bạn xấu, bạn sẽ nhận lấy “khổ đau” về sau, vì vậy bộ 5 nguyên tắc SOLID ra đời nhằm giúp bạn có thể thiết kế được một phần mềm có cấu trúc tốt hơn.

5 nguyên tắc của SOLID

SOLID là viết tắt của 5 thành phần như sau:

  • S – Single-responsibility Principle – Nguyên tắc trách nhiệm đơn lẻ
  • O – Open-closed Principle – Nguyên tắc đóng mở
  • L – Liskov Substitution Principle – Nguyên tắc phân vùng Liskov
  • I – Interface Segregation Principle – Nguyên tắc phân tách giao diện
  • D – Dependency Inversion Principle – Nguyên tắc đảo ngược phụ thuộc

Được Robert C Martin (hay còn gọi với cái tên thân thương là “Uncle Bob”) đề xuất vào năm 2000, SOLID trở nên phổ biến khi phát hành quyển sách Agile Software Development, Principles, Patterns, and Practices vào năm 2003.

5-nguyen-tac-cua-solid
5 nguyên tắc của SOLID

Tại sao SOLID giúp lập trình trở nên hiệu quả?

Ngay khi bạn đọc 5 nguyên tắc trên, bạn đã có thể hiểu được mình nên làm gì rồi đúng không? Và đây là những lý do tại sao SOLID giúp bạn lập trình trở nên hiệu quả hơn.

Sự rõ ràng và dễ hiểu

Tất nhiên, một phần mềm rất hiếm khi được phát triển độc lập bởi một cá nhân duy nhất, mà đó là kết quả làm việc của cả một nhóm nhiều người. Vì vậy, áp dụng SOLID để khiến code của bạn trở nên gọn gàng, ngăn nắp sẽ tạo được cảm tình với đồng nghiệp, cũng như khiến teamwork trở nên hiệu quả hơn.

Dễ dàng sửa đổi và nâng cấp

Khi nhìn vào code và nhân ra ngay vai trò của từng class hoặc vị trí của từng hàm, bạn sẽ dễ dàng sửa đổi hoặc nâng cấp chương trình phần mềm mình đã viết. Bạn cũng sẽ đỡ tốn thời gian để tìm hiểu lại chính code của mình và giúp những người khác có được bổ sung để chữa cháy, họ cũng có thể hiểu code của bạn có ý nghĩa như thế nào và giúp bạn.

tai-sao-solid-giup-lap-trinh-tro-nen-hieu-qua
Tại sao SOLID giúp lập trình trở nên hiệu quả?

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

Nếu chọn đi theo con đường lập trình, chắc chắn trong suốt cuộc đời bạn sẽ tham gia không biết bao nhiêu dự án. Vì thế, bạn làm code của bạn trở nên ngăn nắp và có ghi chú rõ ràng thành từng module tách biệt, bạn có thể mở dự án cũ lên copy và sử dụng lại lần nữa. Điều này sẽ khiến thời gian của bạn được tiết kiệm rất nhiều đấy!

Giải thích chi tiết 5 nguyên tắc SOLID

S – Single-responsibility Principle – Nguyên tắc trách nhiệm đơn lẻ

Giải thích một cách đơn giản hơn, Single-responsibility Principle là “mỗi người 1 việc”.

Khi thiết kế phần mềm, bạn chỉ nên để mỗi lớp – class chỉ có một trách nhiệm/ một chức năng nhằm để:

  • Khả năng kiểm thử: trong trường hợp bạn kiểm thử, bạn sẽ phải suy nghĩ ít hơn để test class, vì class đó chỉ có 1 chức năng xác định duy nhất.
  • Tạo ít mối quan hệ phụ thuộc: chỉ một chức năng cho một class sẽ giảm thiểu các phụ thuộc qua lại lẫn nhau giữa các chức năng.
  • Tính lớp lang: bạn làm một lớp nhỏ, sau đó bạn có thể tìm đến lớp lớn hơn. Việc này sẽ giúp bạn sắp xếp phần mềm của mình hiệu quả hơn.
S-Single-responsibility-Principle
S – Single-responsibility Principle

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

public class Book {
 private String name;
 private String author;
 private String text;
 public String replaceWordInText(String word){
 return text.replaceAll(word, text);
 }
 public boolean isWordInText(String word){
 return text.contains(word);
 }
public class Book {
 void printTextToConsole(){
 }
}

Điều này vi phạm nguyên tắc trách nhiệm đơn lẻ. Vì thế, bạn sẽ phải tách chức năng lưu trữ và chức năng in sách ra thành 2 class khác nhau.

Lớp xử lý sách bạn có thể tạo ra class mới như sau:

public class BookPrinter {
 void printTextToConsole(String text){
 }
 void printTextToAnotherMedium(String text){
 }
}

Để tránh việc sau này bạn sẽ phải “mệt” với việc kiểm thử và sắp xếp sửa đổi chức năng.

O – Open-closed Principle – Nguyên tắc đóng mở

Thay vì bạn sửa đổi trực tiếp những dòng code hiện có và tạo ra nguy cơ tiềm ẩn cho lỗi hỏng cả phần mềm. Bạn chỉ cần sử dụng phương thức mở rộng và kế thừa class trước đó là ổn.

O-Open-closed-Principle
O – Open-closed Principle

Ví dụ bạn code ra một cây đàn Guitar có luôn 1 nút vặn âm lượng như sau:

public class Guitar {
 private String make;
 private String model;
 private int volume;
}

Giờ đây, bạn thấy cây đàn Guitar của mình hơi bình thường quá, bạn muốn đốt cháy cây đàn để khán giả của bạn phấn khích hơn. Nếu bạn thêm thẳng thuộc tính: private String flameColor; vào bên trong class Guitar, khả năng cao cây đàn của bạn sẽ bị hỏng thật sự.

Thay vì như thế, bạn chỉ cần mở rộng thêm một class GuitarCoolNgauBungLua kế thừa từ Guitar như sau để cây đàn của bạn không bị hỏng:

public class GuitarCoolNgauBungLua extends Guitar {

 private String flameColor;

}

L – Liskov Substitution Principle – Nguyên tắc phân vùng Liskov

Một trong những nguyên tắc khá phức tạp và khó để hiểu… Nguyên tắc phân vùng Liskov: nếu class A là con/class dẫn xuất của class B, class A phải có thể thay thế vị trí của class B mà không làm chương trình bị lỗi.

L-Liskov-Substitution-Principle
L – Liskov Substitution Principle

TinoHost sẽ giải thích dễ hiểu nhất như sau:

Một con vịt giả có bề ngoài giống hệt con vịt thật. Tuy nhiên, con vịt giả cần pin để kêu “cạp cạp” => bạn không có một con vịt thật.

Hoặc một ví dụ khác như sau:

Ta sẽ đặt điều kiện như sau: nhân viên chính thức sẽ được điểm danh vào buổi sáng, bạn thêm class checkAttendance(). Tuy nhiên, nhân viên lao công tạp vụ tạm thời không được điểm danh nhưng lại trỏ vào class Employee trở nên sai nguyên tắc phân vùng Liskov.

Cách giải quyết: bạn có thể tách checkAttendance() ra một lớp khác và trỏ các nhân viên ở các bộ phận khác nằm dưới lớp checkAttendance() và trỏ ngược lên lớp Employee.

I – Interface Segregation Principle – Nguyên tắc phân tách giao diện

Nguyên tắc phân tách giao diện dễ hiểu hơn nguyên tắc phân vùng Liskov rất nhiều. Với nguyên tắc phân tách giao diện, bạn chỉ cần phân nhỏ giao diện lớn thành nhiều giao diện nhỏ hơn phù hợp hơn.

I-Interface-Segregation-Principle
I – Interface Segregation Principle

Ví dụ:

Bạn là một người một người nuôi gấu trong sở thú. Bạn sẽ được lập trình với nhiệm vụ như sau:

public interface NguoinuoiGau{
 void washTheBear();
 void feedTheBear();
 void petTheBear();
}

Tuy nhiên, việc chăm sóc 1 con gấu cho chúng ăn và vuốt ve chúng là 2 công việc tách biệt nhau, chưa kể, việc vuốt ve gấu là rất nguy hiểm. Vì thế, bạn sẽ cần phải tách việc nuôi gấu thành 3 thành phần tách biệt như sau để giao đúng người hơn.

public interface BearCleaner {
 void washTheBear();
}
public interface BearFeeder {
 void feedTheBear();
}
public interface BearPetter {
 void petTheBear();
}

Đối với nhân viên thông thường, bạn có thể giao nhiệm vụ tắm rửa và cho gấu ăn. Bằng dòng code sau:

public class BearCarer implements BearCleaner, BearFeeder {
 public void washTheBear() {
 }
 public void feedTheBear() {
 }
}

Còn công việc nguy hiểm hơn, “điên hơn” bạn có thể gửi gắm cho một người có bản lĩnh hơn như sau:

public class NguoiBanLinh implements BearPetter {
 public void petTheBear() {
 }
}

D – Dependency Inversion Principle – Nguyên tắc đảo ngược phụ thuộc

Bạn có thể hiểu nguyên tắc này như sau: 1 thành phần trong một chương trình chỉ nên phụ thuộc vào một giá trị trừu tượng – abstraction chứ không nên phụ thuộc vào một giá trị nào cụ thể cả.

Ví dụ: Khi mua một laptop đời mới, nhà phát hành bo mạch chủ không nhất thiết phải biết bạn muốn gắn ổ cứng SSD hay HDD, họ chỉ cần phát triển ra một bo mạch chủ có thể gắn cả 2 loại ổ dựa trên của giao tiếp SATA để bạn có thể gắn vào.

D-Dependency-Inversion-Principle
D – Dependency Inversion Principle

Kết luận

Qua bài viết, TinoHost hi vọng bạn đã hiểu hơn về SOLID là gì cũng như 5 nguyên tắc SOLID. Chúc bạn áp dụng nguyên tắc SOLID vào công việc lập trình của mình một cách hiệu quả nhất!

Những câu hỏi thường gặp

Nguyên tắc nào trong SOLID quan trọng nhất?

Tất cả các nguyên tắc SOLID đều quan trọng và bổ trợ cho nhau. Tuy nhiên, nguyên tắc SRP (Single Responsibility Principle) thường được coi là cơ bản nhất vì nếu một lớp không được thiết kế với trách nhiệm đơn, các nguyên tắc khác cũng sẽ khó áp dụng hiệu quả.

SOLID có áp dụng được cho tất cả các dự án không?

SOLID phù hợp nhất với các dự án có quy mô trung bình đến lớn, đặc biệt là khi làm việc nhóm hoặc các dự án có yêu cầu mở rộng trong tương lai. Đối với các dự án nhỏ hoặc đơn giản, việc áp dụng toàn bộ SOLID có thể khiến mã trở nên phức tạp không cần thiết.

Áp dụng SOLID trong thực tế có khó không?

Việc áp dụng SOLID yêu cầu người phát triển có tư duy thiết kế tốt và kinh nghiệm với lập trình hướng đối tượng. Ban đầu có thể khó khăn, nhưng khi đã quen, việc tuân theo các nguyên tắc này sẽ giúp tiết kiệm thời gian trong dài hạn và giảm rủi ro phát sinh lỗi.

Khi nào cần ưu tiên áp dụng nguyên tắc OCP (Open/Closed Principle)?

OCP đặc biệt quan trọng khi xây dựng các hệ thống cần mở rộng tính năng trong tương lai. Khi dự án cần thêm các module mới mà không muốn làm gián đoạn hệ thống hiện tại, việc áp dụng OCP sẽ giúp dễ dàng thêm chức năng mới mà không phải chỉnh sửa mã cũ.

Áp dụng SOLID có làm tăng độ phức tạp của mã không?

Ban đầu có thể khiến mã trở nên phức tạp hơn do phải tách các lớp và giao diện, nhưng về lâu dài, mã sẽ dễ bảo trì và mở rộng hơn. Khi áp dụng SOLID đúng cách, bạn sẽ tránh được nhiều lỗi tiềm ẩn và giúp dự án phát triển ổn định.

Chia sẻ một chút thông tin về bạn. Những thông tin này có thể được công khai.

Xem thêm bài viết

Bài viết liên quan

Xem nhiều

giá tốt, chất lượng cao mình rất hài lòng
chất lượng dịch vụ tốt lắm...á
chất lượng dịch vụ rất tốt.
giá tốt, chất lượng cao mình rất hài lòng
Dịch vụ chăm sóc khách hàng tốt
Dùng rất oke nha mọi người
Dịch vụ chăm sóc khách hàng tốt, mình rất hài lòng về dịch vụ của TINOHOST
Đã mua rất nhiều tên miền tại Tinohost. Chất lượng tốt
dịch vụ và chăm sóc khách hàng rất tốt , mình rất thích tinohost , mình đã sử dụng nhiều dịch vụ của tinohost rồi
tuyệt vời chăm sóc khách hàng quá tốt
dịch vụ và chăm sóc khách hàng rất tốt , mình rất thích tinohost , mình đã sử dụng nhiều dịch vụ của tinohost rồi
Quá tốt - Quá xuất sắc và tuyệt
Hỗ trợ nhiệt tình. dịch vụ chất lượng
Đội ngũ support rất nhiệt tình.
Sử dụng dịch vụ của bạn Tinohost 2 3 năm nay chưa khi nào phải thất vọng.
host dùng chất lượng, miền giá rẻ
dịch vụ hỗ trợ rất nhanh, tốc độ hosting tốt
Hộ trợ tốt, nhanh. Tuyệt vời 🥰
tuyệt vời, dịch vụ cực tốt và hỗ trợ siêu nhanh
Làm việc nhanh chóng, giá thành hợp lí.
Hosting rẻ và nhanh thích hợp cho học sinh sinh viên như mình
dịch vu tốt ! Sẽ sử dụng thưởng xuyên !
Mỗi lần cần gì, nhắn Tino là được hỗ trợ ngay. Nên một đứa không biết gì về web như mình cũng tạo được blog. Cơ bản mình chỉ lo viết, mọi thứ có anh IT của Tino lo hết.
Nhìn chung thì Tino xứng đáng là một trong những nhà cung cấp host giá rẻ #1 tại VN. Bên này support khá nhanh và nhiệt tình nên quá trình sử dụng diễn ra tương đối trơn tru.
Chất lượng quá ok so với mức giá. Các SME có thể tham khảo để dựng web nhé.
uy tín chất lượng chuẩn cho 5 sao
Dịch vụ nhanh chóng thanh toán tiện lợi
Dịch vụ nhanh chóng, giá cả hợp lý
Chất lượng phục vụ ok, support khá nhanh chóng và chất lượng gói lớn tốt, gói nhỏ cần tốt hơn.
Dịch vụ tốt, giá cả hợp lý👍
Rất hay, rất tốt, rất hữu ích
Hỗ trợ rất nhanh và nhiệt tình
Chất lượng phục vụ ok, support khá nhanh chóng và chất lượng gói lớn tốt, gói nhỏ cần tốt hơn.
dịch vụ tốt, thanh toán nhanh chống
Hài lòng dịch vụ của tinohost
Sau khi sử dụng dịch vụ của TinoHost. Mình thấy website load nhanh hơn hẳn so với sử dụng ở nhà cung cấp cũ. Giá cả do mình đc mua với giá sale 99% của TinoHost nên rất là rẻ. Gói mình mua là gòi Hosting Bussiness 20GB. Thông số cấu hình cao nên web load khá mượt
Chúc TinoHost phát triển!
domain rẻ, có nhiều gói hữu ích thích hợp cho sinh viên
Hài lòng về dịch vụ và tư vấn
Dịch vụ tốt . Support nhiệt tình
Chất lượng OK
Nhanh chóng
dịch vụ rất tốt
Nhân viên support nhanh, hỗ trợ nhiệt tình, giao dịch tự động nên khá tiện
Đã dùng nhiều dịch vụ tại Tinohost, chất lượng tốt, rất hài lòng ...😀
Sự dụng rất hài lòng với các dịch vụ của tinohost
Dịch vụ tốt, uy tín chất lượng
Tino dịch vụ quá tuyệt vời
Giá rẻ, dịch vụ tốt, hỗ trợ nhanh chóng
dịch vụ rất tốt rất tuyệt vời
Giá hợp lý cho người mới dùng
Mình thấy Tinohost có giao diện thân thiện, dễ đăng ký sử dụng cho người mới tập tành làm web như mình. Hosting hỗ trợ có nhiều lựa chọn về dung lượng và giá cả! Thanh toán qua momo thuận tiện. Recommended!
wed quá ok làm việc nhanh ngọn
Dịch vụ tốt. Khá hài lòng vì support nhiệt tình
Dịch vụ quá tuyệt vời danh cho các bạn
Xin cảm ơn đội ngủ kỹ thuật. Các bạn rất chuyên nghiệp và thân thiện. Tôi sẽ giới thiệu các bạn cho bạn bè của mình.
Dịch vụ hỗ trợ tốt, ổn định, thanh toán dễ dàng.
Mình từng dùng VPS bên Vietel IDC, hay gặp lỗi vặt và bảo trì liên tục. Nhưng Tino thì rất ok
dùng tốt, nhanh, dễ sử dụng
Giao diện đẹp mắt, dễ sử dụng
Đề nghị xem lại vấn đề phục vụ khách hàng (livchat)!
Good. Tốc độ cao. Tùy chỉnh nhiều trên shared hosting.
hosting ngon, giá luôn rẻ, tôi làm code nhưng rất thích sài host tino
Tino cung cấp host rất chuyên nghiệp. Đội ngũ kỹ thuật hỗ trợ rất tận tâm và nhiệt tình. Mình sẽ tiếp tục ủng hộ Tino 🥰.
Rất tuyệt vời🙆🙆🙆🙆🙆🙆🙆🙆🙆
Xét về tầm giá thì TinoHost rất đáng để mua và sử dụng lâu dài.
Dịch vụ chất lượng, ủng hộ 1 năm nay rồi
tuyệt vời quá đi,tuyệt vời quá đi
Tốc độ ổn định, tư vấn nhiệt tình
mới tham gia, mong mọi người hỗ trợ thêm
Tốc độ khá tốt với gói rẻ nhất 9k
Giao dịch nhanh,support nhanh và tận tình,chuyển miền nhanh,Hosting Ok
mua sản phẩm dịch vụ tinhot rất tốt tặng ad 5tr ** luon nè🥰🥰🥰
tinohost
một truong những nơi bán hosting rẻ, chất lượng dành cho anh em nào cần để làm web
mua tại : tinohost.com
mình đã mua 2 tên miền + hosting của Tino Host . quả nhiên hiệu quả SEO cải thiện đáng kể và chứng chỉ bảo mật HTTPS miễn phí của Tino Host cũng ko kém phần quang trọng cho việc SEO website của mình
Tino host là một trong nhà cung cấp tốt nhất mình từng sử dụng. Với ưu đãi khuyến mại nhiều, giá thành rẻ kèm theo đó là sự support tuyệt vời của các admin. Nếu ai chưa lựa chọn được nhà cung cấp cho bản thân mình thì Tinohost sẽ là câu trả lời tốt nhất.
dịch vụ tốt, đội ngũ support nhiệt tình, cảm ơn #tinohost
Uy tín, chất lượng, nhân viên hỗ trợ nhiệt tình
mua 2 domain tại tinohost dùng rất chất lượng
Đã mua 02 domain và hosting tại TinoHost, hài lòng cách tư vấn và chăm sóc khách hàng của TinoHost :)
Giá rẻ cấu hình mạnh, black friday là sự bùng nổ của Tino
Hay web bán tài nguyên rất ngon
dịch vụ tốt, mua luôn host chất lượng cao của công ty nhân dịp blackfriday, cảm ơn #tinohost
Dịch vụ rất tốt, nhân viên tận tình.
Hỗ trợ nhiệt tình nhất trong các nhà cung cấp mih từng dùng. Không những server mạnh, ưu đãi có 1 không 2 mà còn nhiều plugin pro bản quyền đính kèm nữa. Quyết định gắn bó "Lifetime" với tino 😁
Dịch vụ tốt hỗ trợ nhanh chóng
Thích cách tư vấn tận tình và nhanh gọn của Tino mỗi khi có vấn đề trục trặc. Hosting ổn định, giá rẻ tốt lắm nhé mọi người
mình có mua 2 tên msiền của tino, mình rât thích cách tư vấn và chăm sóc khách hàng tại đây. Ngoài ra giá domain khá rẻ, phù hợp cho mọi người. 5 sao
Dịch vụ tốt, support nhiệt tình
tinohost tuyệt vời giá cả hợp lý
domain mua rất rẻ :))))
tốt, chất lượng, hostingok
Hosting tốt, giá cả cạnh tranh
Tuyệt vời , Hosting quá ổn
Chất lượng lắm ạ. Domain mua rẻ nhất thị trường
Dịch vụ tốt và chất lượng
Chất lượng lắm ạ. Domain mua rẻ nhất thị trường
Tino Host dùng quá ngon đi !💥💥💥💥💥
Tôi đã mua domain và hosting của các nhà cung cấp khác rồi, nhưng thực sự thấy không tốt bằng Tino, ngoài ra còn hỗ trợ rất tốt. Cảm ơn tino nhiều!
Next Reviews
CÔNG TY CỔ PHẦN TẬP ĐOÀN TINO
Trụ sở chính: L17-11, Tầng 17, Tòa nhà Vincom Center, Số 72 Lê Thánh Tôn,  Phường Bến Nghé, Q. 1, TP. Hồ Chí Minh

Văn phòng kinh doanh: Số 42 Trần Phú, Phường 4, Quận 5, TP HCM
GPKD số 0315679836 do Sở KH và ĐT TP Hồ Chí Minh cấp
Hotline: 0364 333 333
Góp ý/Phản ánh dịch vụ: 0933 000 886