The Open closed principle là gì?

Năm 1988, Bertrand Meyer phát biểu nguyên tắc The Open-Closed Principle (OCP) như sau:

“Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.”

Các lớp modules nên được thiết kế cho việc mở rộng, nhưng đóng cho việc thay đổi.

Tức là bạn phải viết mã sao cho có thể mở rộng chức năng của hệ thống, nhưng không thay đổi hệ thống hiện hành.

Để hiểu rõ hơn về nguyên tắc này, hãy xem ví dụ sau.

Hiện nay, bạn đang viết phần report cho website. Module View Report lấy dữ liệu từ Module Report Presenter đã được hoàn thành. Sau đó khách hàng yêu cầu viết thêm một module in report, bạn sẽ làm gì?

Mở rộng module report

Phương án 1: Viết thêm code cho View Report bằng các dòng lệnh if, khi là máy in, sẽ hiển thị chức năng in, khi là trình duyệt, sẽ hiển thị website đầy đủ.

Khi chọn phương án này, thì View Report module sẽ bị thay đổi, khi xuất hiện bug ở PrintReport hoặc ViewReport, bạn sẽ phải đọc code cho cả 2 bên. Đồng thời bạn vi phạm luôn nguyên tắc OCP, đó là thay đổi module View Report thay vì mở rộng nó.

Phương án 2: Viết một module để hiện việc Print Report.

Đây là phương án khả thi nhất, bạn viết một module Print Report, dùng chung dữ liệu với module View Report. Do vậy bạn đã tách bạch hai module. Không vi phạm nguyên tắc OCP. Với cách này, việc bảo trì code cũng dễ dàng hơn, vì bug chỗ nào, mình sẽ sửa chỗ ấy.

Mở rộng như thế nào?

Khi cần mở rộng, bạn sẽ cần sự trợ giúp của interface. Interface sẽ cung cấp các mô tả hàm, khi đó các class sẽ mở rộng tùy ý phụ thuộc vào nhu cầu sử dụng. Khi thực thi câu lệnh ở RunTime, ta sẽ lấy ra class phù hợp với nhu cầu.

interface IReportViewer
{
    void View();
}

public class ViewReport : IReportViewer
{
    void View()
    {
        // Code Goes here
    }
}

public class PrintReport : IReportViewer
{
    void View()
    {
        // Code Goes here
    }
}

Thông qua việc mở rộng interface bạn không cần phải thêm code mới vào class ViewReport. Code trở nên gọn gàng, tách bạch giữa các class.

Tầm quan trọng của The Open Closed principle!

OPC là nguyên tắc tối quan trọng với các lập trình viên, nó được mọi người sử dụng rộng rãi hằng ngày tuy nhiên ít được để ý đến. Đó là việc sử dụng các thư viện của bên thứ ba cung cấp. Nếu không áp dụng OCP, họ sẽ tạo ra thư viện không ổn định, các hàm trong thư viện bị thay đổi xoành xoạch qua mỗi đợt nâng cấp thì bạn có muốn sử dụng các thư viện đó không? Dĩ nhiên là không rồi.

Khi viết mã, hãy nghĩ đến nguyên tắc OCP dù cả trong app nhỏ, nó sẽ giúp bạn tạo ra các phần mềm ổn định hơn. Nên nhớ Interface là một thành phần rất quan trọng để thực hiện nguyên tắc OCP. Ở những bài viết sau tôi sẽ hướng dẫn kĩ hơn về cách thiết kế các interface.

Các môn học khác

SQL là ngôn ngữ truy vấn mang tính cấu trúc, nó cho phép bạn truy cập và sử dụng database.

Khoa học về dinh dưỡng, giáo trình giảm cân cho mọi người.

HTTP giúp kết nối các máy tính trên mạng Internet thông qua TCP/IP