[S.O.L.I.D] – Open closed principle

Open closed principle là gì? 

Phát biểu: Một software entities(class, modules, functions, etc..) không nên chỉnh sửa thay vào đó hãy mở rộng chúng.

Mình xét ví dụ nhỏ nhé.

Chúng ta có class Rectangle 

Bây giờ chúng ta muốn tính tổng các Rectangle

Mình chỉ cần loop trên mảng input và cộng dồn diện tích lại thôi, ok tới đây vẫn ổn, không có vấn đề gì. Sau đó application mình cần mở rộng, mình muốn tính thêm cả hình tròn nữa. Chuyện nhỏ mình chỉ cần làm đơn giản như sau

Truyền vào một mảng các hình Rectangle và Cricle, kiếm tra nó là gì rồi apply công thức tương ứng với hình là xong. Nhưng nếu bạn cần mở rộng cho hình tam giác, lục giác …. Thì bạn phải làm sao ạ? =)) Tất nhiên là phải đập câu lệnh if else bên trên và thay thế bằng switch case hoặc if else if ….. Lúc này code của mình trông như một đống shit vậy á. Thêm nữa, nếu như mảng chứa 1 triệu record thì mỗi lần nó điều phải kiểm tra như vậy sẽ làm giảm peroformance đáng kể.

Đến dây mình mới thấm cái câu “Một software entities(class, modules, functions, etc..) không nên chỉnh sửa thay vào đó hãy mở rộng chúng”, khi mình viết 1 class, method mà mỗi lần có change request mình đều phải đi sửa những class func mà mình đã viết là thôi xong rồi, thằng mình viết ra nó đã xem vào quá nhiều công việc(hóng chuyện) dẫn đến việc nó phải thay đổi quá nhiều khi mà có change request. Một ngày đẹp trời tự nhiên mình thêm chức năng mới, và mình bay vào class method đã có sẵn để modify cho chức năng mới của mình, sau đó các chức năng trước đây nó chết tưoi =)) đó là vì trong quá trình bạn modify class, method cũ đã vô tình thay đổi logic của những chức năng trước.

Thấy không, nếu mình không apply Open closed principle thì code project mình vừa xấu vừa khó đọc lại khí bảo trì, mở rộng nữa. Mở rộng thì sợ hư máy cái cũ, bảo trì thì code như giun bò rồi sữa cái này cái kia hư,,. cuối cùng dự án sẽ fail thôi.

Quay trở lại, rõ ràng là sửa class, method .. đã có sẵn từ trước nó sẽ rất nguy hiểm so với việc bạn thêm một cái gì đó mới thì chắc chắn nó vừa đảm bảo cover chức năng mới, mà lại không ảnh hưởng đến cái cũ.

Để apply Open closed principle, mình có những cách cụ thể như sau

  • Sử dụng cơ chế thừa kế 
  • Sử dụng Composition technique
  • Áp dụng Dependency Injection patten
  • Áp dụng Decorator pattern
  • Áp dụng Strategy pattern

Trong blog này mình sẽ hướng dẫn các bạn cơ chế thừa kế để giải quyết problem này nha

Mình sẽ có class Abstract là Shape

Rectangle, Cricle extends Shape và implement method area()


Bây giờ hàm tính tổng diện tích các hình chỉ đơn giản là loop qua các hình và cộng dồn lại từ kết quả trả về của func area()

Sau này nếu muốn mở rộng thêm hình tam giác chẳng hạn chúng ra chỉ cần khai báo class tamgiac extends Shape và implement func area() cho tamgiac vậy là xong. 

Please follow and like us:
error

1 thought on “[S.O.L.I.D] – Open closed principle

Leave a Reply

Your email address will not be published. Required fields are marked *