- Nguyên lí SOLID là gì ? Để trở thành 1 developer giỏi thì phải thành thục nguyên lí này
- Single Responsibility Principle – Nguyên lí đơn trách nhiệm
- Open/Closed Principle – Nguyên lí đóng mở thế giới
- Liskov Substitution principle – Nguyên lí thay thế Liskow
- Interface Segregation Principle – Nguyên lí phân biệt interface
- Dependency inversion principle – Nguyên lí nghịch đảo phụ thuộc
Nguyên lí Open/Closed Principle là gì ?
Tiếp tục với series nguyên lí SOLID chúng ta đến với nguyên lí thứ hai đó là Open/Closed Principle – Nguyên lí đóng mở. Nhắc lại một tí, nguyên lí này có nghĩa là: Một class, moldule, function… chỉ được phép mở rộng chứ không được sửa xóa, hoặc theo cách khác, một class, module, function chỉ được phép mở rộng các hoạt động của nó mà không chỉnh sửa mã nguồn có sẵn.
Một module được gọi là mở nếu nó còn khả năng mở rộng thêm. Ví dụ như có thể thêm một biến, một hàm hay một tham số vào hàm bên trong nó.
Một modunle được gọi là đóng nếu nó đang được sử dụng bởi module khác. Ví dụ như khi thêm biến, hàm, hay tham số thì vẫn không thể thay đổi được điều gì, khi đó modunle đang ở trạng thái ổn định.
Nếu một class được “đóng”, từ khi nó được biên dịch, chứa trong các thư viện và được sử dụng bởi người dùng. Nhưng class đó cũng có thể “mở”, nếu bất kỳ class nào khác thừa kế nó hoặc sử dụng nó và thêm một vài hàm mới, tính năng mới. Khi class con mới được định nghĩa thì nó không cần thiết phải thay đổi ở class cha mà chỉ cần viết thêm, những người dùng khác đang sử dụng class cha thì cũng không hề bị ảnh hướng. Bạn xem ảnh dưới đây để hiểu rõ hơn.
Mình lấy một ví dụ đơn giản nhưng vẫn được gọi là huyền thoại như thế này: Chúng ta vẫn có class SinhVien và đã có chức năng đọc dữ liệu sinh viên từ file Database.
public class SinhVien { // chưa thông tin sinh viên protected String maSV; protected String tenSV; // constructer, get and set ở đây }
public class DocSinhVien { public ArrayList<SinhVien> readFromDatabase() { ArrayList<SinhVien> data; data = new ArrayList<>(); // code tai day return data; } }
Bây giờ chúng ta cần thêm chứ năng nữa là đọc dữ liệu từ file excel và file text, không cần sửa code cũ, chỉ cần thêm hàm vào bên dưới.
public class DocSinhVien { public ArrayList<SinhVien> readSinhVienFromDatabase() { ArrayList<SinhVien> data; data = new ArrayList<>(); // code tai day return data; } public ArrayList<SinhVien> readSinhVienFromExcel(File file) { ArrayList<SinhVien> data; data = new ArrayList<>(); // code tai day return data; } public ArrayList<SinhVien> readSinhVienFromTextFile(File file) { ArrayList<SinhVien> data; data = new ArrayList<>(); // code tai day return data; } }
Nếu ở một hàm khác đang sử dụng hàm readFromDatabase() thì vẫn hoàn toàn không bị ảnh hưởng gì cả, toàn bộ code mới không làm thay đổi các thành phần khác của chương trình.
Một ví dụ khác thể hiện Open/Closed Principle được sử dụng rất nhiều đó là ở các extension, module ở các framework, phần mềm. Chẳng hạn như Chrome, bạn tải thêm extension thì chúng chỉ đơn giản thêm các chức năng mới mà không làm thay đổi mã nguồn của chương trình, tương tự với các thứ khác như plugin wordpress, plugin netbean, android studio, sublime… đều được sử dụng dựa vào nguyên lí này.