SOLID – Bài 2: Open Closed Principle

List các bài đã viết:

Bài trước bạn đã làm quen với nguyên tắc đầu tiên – Single Responsibility Principle (Đơn Tác Vụ). Hôm nay ta tiếp tục nguyên tắc thứ 2, ứng với chữ cái thứ 2 của SOLID – Open Closed Principle. Tôi tạm dịch là “Nguyên Tắc Đóng và Mở”.

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

“Các software entities (như class, modules, functions …) nên được thiết kế để sẵn sàng mở rộng và hạn chế chỉnh sửa”.

Có nghĩa là, chương trình của bạn khi tuân theo nguyên tắc này, một khi gặp yêu cầu mới, bạn sẽ chỉ cần mở rộng tính năng của nó ra thay vì mở code cũ ra để sửa.

Xin xem một ví dụ dưới đây cho rõ hơn.

Giả sử bạn cần thiết kế một chương trình để tính diện tích của một hình phẳng. Các hình cần tính bao gồm: hình tròn và hình vuông. Chương trình của bạn, ở version đầu sẽ như sau:

Vài hôm sau, gã sếp bảo hắn muốn thêm 1 tính năng mới đó là có thể tính diện tích hình chữ nhật nữa. Thế là bạn phải tạo thêm 1 class Rectangle, rồi lại tạo thêm 1 phương thức mới CalculateRectArea chẳng hạn.

Rồi lại một ngày đẹp trời, hắn lại bảo làm thêm cho hắn 1 chức năng tính tổng diện tích của một số hình bao gồm cả 3 loại trên. Thế là bạn lại sửa:

Và rồi, “hắn” lại muốn chương trình của bạn có thể tính thêm vài loại hình quái quỷ gì nữa, chẳng hạn như hình tam giác. Quá mệt mỏi vì lôi ra lôi vào sửa sửa xóa xóa. Bạn rủa gã sếp thậm tệ vì ko nói trước luôn 1 lần mà cứ chơi trò thêm bớt làm bạn cực nhọc.
Thế nhưng, nếu bạn cảm thấy cực nhọc trong vụ này, thì đó không hoàn toàn lỗi của gã kia mà còn một phần là do lỗi thiết kế của bạn. Tại sao ư? Xin hãy xem thiết kế dưới đây, tận dụng triệt để các tính chất của OOP và giải quyết bài toán một cách đẹp đẽ.

Như vậy, nếu có yêu cầu cần tính thêm diện tích cho 1 hình mới ví dụ như hình tam giác chẳng hạn, bạn ko cần phải sửa code hiện có nữa mà chỉ cần thêm 1 class mới Triangle như sau:

That’s it. Có vậy thôi! Tới đây, chắc bạn đã hiểu tầm quan trọng của nguyên tắc này. Đây là nguyên tắc mà theo mình là quan trọng nhất trong 5 nguyên tắc, vì “sẵn sàng để mở rộng và hạn chế sửa chữa” là mục tiêu cốt yếu trong architectural design. Tuy nhiên, nguyên tắc này khá khái quát và trừu tượng so với các nguyên tắc còn lại. Thưc ra để hiện thực nguyên tắc này này bạn cần phải kết hợp tất cả các nguyên tắc còn lại một cách nhuần nhuyễn và khéo léo.
Mà thôi, chuyện đó để sau nha, còn bây giờ, enjoy coding!

No Comments

Post A Comment