Giới Thiệu Nguyên Tắc SOLID
Nguyên tắc SOLID, được phát triển bởi Robert C. Martin vào năm 2000, là một bộ quy tắc thiết yếu cho lập trình hướng đối tượng (OOP). SOLID là từ viết tắt của năm nguyên tắc chủ đạo, góp phần tạo ra những hệ thống lập trình linh hoạt, dễ dàng bảo trì và hiểu rõ hơn khi có vấn đề phát sinh.
Nội Dung Nguyên Tắc SOLID
Nguyên tắc SOLID bao gồm:
- Single Responsibility Principle (SRP)
- Open/Closed Principle (OCP)
- Liskov Substitution Principle (LSP)
- Interface Segregation Principle (ISP)
- Dependency Inversion Principle (DIP)
1. Nguyên Tắc Trách Nhiệm Đơn (Single Responsibility)
"Mỗi lớp chỉ nên có một lý do để thay đổi."
Điều này có nghĩa là mỗi lớp trong chương trình chỉ nên đảm nhận một trách nhiệm duy nhất. Ví dụ:
java
public class A {
public void doSomeThing1() {
// code
}
public void doSomeThing2() {
// code
}
}
Ở trên, lớp A đã vi phạm nguyên tắc này vì thực hiện hai nhiệm vụ cùng một lúc. Để cải thiện, hãy tách A thành hai lớp riêng biệt:
java
public class A1 {
public void doSomeThing1() {
// code
}
}
public class A2 {
public void doSomeThing2() {
// code
}
}
2. Nguyên Tắc Mở/Đóng (Open/Closed)
"Các thực thể phần mềm phải mở để mở rộng nhưng đóng để sửa đổi."
Thay vì sửa đổi lớp hiện tại khi thêm các phép toán mới, chúng ta có thể xây dựng một interface như sau:
java
public interface Calculator {
double result();
}
public class Add implements Calculator {
@Override
public double result() {
// Tính cộng
}
}
3. Nguyên Tắc Thay Thế Liskov (Liskov Substitution)
"Các hàm sử dụng con trỏ hoặc tham chiếu đến lớp cơ sở phải có khả năng sử dụng các đối tượng của lớp dẫn xuất mà không cần biết điều đó."
Khi một lớp A tham chiếu đến lớp B, thì A cũng có thể thay thế cho B mà không gây ra lỗi. Ví dụ về lớp A và các lớp con B, C:
java
public abstract class A {
abstract Object task(Data data);
}
Khi lớp X sử dụng lớp A để xử lý dữ liệu, nếu không có sự tương thích, hãy xem xét lại việc kế thừa.
4. Nguyên Tắc Phân Tách Giao Diện (Interface Segregation)
"Khách hàng không nên bị ép buộc phụ thuộc vào các giao diện mà họ không sử dụng."
Các interface nên được chia nhỏ thành nhiều phần, giúp các lớp chỉ sử dụng những phương thức cần thiết. Ví dụ:
java
public interface ICalculatorArea {
double calculatorArea();
}
5. Nguyên Tắc Đảo Ngược Phụ Thuộc (Dependency Inversion)
"Các module cấp cao không nên nhập phụ thuộc từ các module cấp thấp. Cả hai nên phụ thuộc vào các trừu tượng."
Việc xây dựng ứng dụng với mục tiêu tối thiểu hóa phụ thuộc giữa các lớp nên được xem xét. Ví dụ như:
java
public interface FileContent {
String export();
}
Kết Luận
SOLID không chỉ là một thứ cần thiết trong lập trình hướng đối tượng mà còn trở thành cơ sở để xây dựng các hệ thống phát triển bền vững, dễ bảo trì. Bài viết này hy vọng đã cung cấp cái nhìn sâu sắc về những nguyên tắc mà lập trình viên nên theo đuổi trong sự nghiệp của họ.
source: viblo