Design Pattern | Open/Closed Principle

Là một nhà phát triển phần mềm, bạn nên cố gắng tạo ra các hệ thống linh hoạt (flexible) và tái sử dụng (reusable). Cơ sở code linh hoạt cho phép mở rộng hệ thống dễ dàng hơn, Reusable code có nghĩa là bạn không cần phải thực hiện cái gì đó mà đã được thực hiện. Đạt được mục tiêu này sẽ giúp cho code của bạn dễ bảo trì hơn. Các mẫu thiết kế là tất cả các kỹ thuật khác nhau mà bạn có thể sử dụng để giúp bạn viết mã linh hoạt và có thể sử dụng lại.

Tất cả các mẫu thiết kế tuân theo một nguyên tắc thiết kế cơ bàn, giải quyết các vấn đề như tính linh hoạt và khả năng sử dụng lại, một trong những nguyên tắc đó là Open/Closed Principle. Nguyên tắc này nêu rõ, các lớp nên được mở rộng, nhưng đóng để thay đổi. Vậy giờ thì điều đó có nghĩa là gì ?

Như tên của nguyên tắc này cho thấy, có hai phần với nó, open với close. Bạn nên xem xét một lớp là close để chỉnh sửa, một khi nó đã được kiểm tra hoạt động đúng, tất cả thuộc tính và hành vi được gói gọn và được chứng minh là ổn định trong hệ thống của bạn, lớp hoặc bất kỳ trường hợp nào của lớp không được ngăn hệ thống của bạn chạy và gây hại cho nó, phần đóng của nguyên tắc không có nghĩa là bạn không thể quay lại một lớp để thay đổi nó trong quá trình phát triển. Dự kiến mọi thứ sẽ thay đổi trong giai đoạn thiết kế và phân tích chu kỳ phát triển của bạn, thay đổi lớp của bạn được thực hiện ở giai đoạn đó. Khi bạn đã đạt đến một điểm trong chu trình phát triển, nơi bạn hoàn thành hầu hết các thiết kế của mình và đã triển khai hầu hết các hệ thống của mình. Trong suốt vòng đời phần mềm của bạn, một số lớp nhất định phải được đóng lại, để tránh đưa ra các tác dụng phụ không mong muốn. Tất nhiên, bạn vẫn nên sửa một lớp là đóng nếu có bất kỳ lỗi nào, hoặc các hành vi không mong muốn xảy ra. Vì vậy, bạn sẽ làm gì nếu bạn cần thêm nhiều tính năng ? Làm thế nào để bạn mở rộng hệ thống của bạn ? Đây là nơi phần mở (open) của nguyên tắc thiết kế xuất hiện.

Có hai quan điểm khác nhau về phần open (mở) của nguyên tắc, nhưng cả hai đều xem một class sẽ mở nếu bạn vẫn có thể xây dựng dựa trên nó. Cách đầu tiên, là thông qua kế thừa của một superclass, ý tưởng là khi bạn muốn thêm nhiều thuộc tính và hanh vi vào một đối tượng được coi là đóng, bạn chỉ cần sử dụng tính kế thừa để mở rộng nó, bằng cách này, các lớp con của bạn vẫn có tất cả chức năng ban đầu của superclass và bây giờ bạn có thể thêm tính năng bổ sung đối với các lớp con, điều này giúp duy trì tính toàn vẹn của siêu lớp, do đó, nếu bạn không cần lớp con, lớp gốc vẫn có thể sử dụng bình thường. Hãy nhớ rằng các lớp con cũng có thể được mở rộng, vì vậy, bạn có thể sử dụng nguyên tắc Open/Closed liên tục để mở rộng hệ thống của mình theo ý muốn. Bạn có thể đạt đến điểm mà bạn không còn muốn mở rộng được nữa, trong trường hợp đó bạn có thể khai báo một lớp sẽ là cuối cùng, điều này ngăn kế thừa. Từ khóa "final" có thể được sử dụng trên các phương thức.

Cách thứ hai là nếu lớp đó abstract và thực thi nguyên tắc Open/Close thông qua đa hình (Polymorphims). Một lớp có thể khai báo abstract, mỗi lớp con cụ thể phải cung cấp việc thực hiện riêng của chúng về phương pháp này. Các phương thức trong siêu lớp abstract được bảo tồn và bạn có thể mở rộng hệ thống của mình bằng cách cung cấp các triển khai (implement) khác nhau cho mỗi phương thức. Điều này có thể hữu ích cho các hành vi được thực hiện theo nhiều cách khác nhau, như sắp xếp và tìm kiếm. Bạn cũng có thể sử dụng một interface để kích hoạt tính đa hình, nhưng hãy nhớ rằng với interface, bạn không thể xác định một bộ thuộc tính chung.

Nguyên tắc Open/Closed được sử dụng để giữ cho phần ổn định trong hệ thống của bạn tách biệt với các phần khác nhau. Chà, bạn muốn có thêm nhiều tính năng hơn vào hệ thống của mình, bạn không muốn làm điều đó với chi phí phá vỡ một cái gì đó đang hoạt động. Bằng cách sử dụng tiện ích mở rộng thay đổi, bạn có thể làm việc trên các phần khác nhau mà không đưa các tác dụng phụ không mong muốn vào phần ổn định. Các bộ phận khác nhau của một hệ thống được cách ly với nhau, vì các tiện ích mở rộng này cuối cùng sẽ trở nên ổn định và được tích hợp vào sản phẩm của bạn, không có gì đảm bảo tất cả chúng sẽ được hoàn thành cùng lúc. Một số tính năng và hành vi có thể phức tạp hơn những tính năng khác, một số có thể lớn hơn, và tham vọng hơn, hoặc một số có thể bị loại bỏ hoàn toàn, do thời gian hoặc cân nhắc tài chính. Cô lập các hệ thống con khác nhau với nhau cũng có thể ngăn chặn các tác dụng phụ không mong muốn xảy ra khi bạn thực hiện chúng.

Tất cả các mẫu thiết kế sử dụng nguyên tắc này trong một số hình thức. Tất cả đều theo ý tưởng rằng một số phần trong hệ thống của bạn sẽ có thể mở rộng và được xây dựng thông qua một số phương tiện, như kế thừa hoặc thực hiện interface. Open/Closed Principle là một khái niệm, giúp giữ cho hệ thống ổn định, bằng cách đóng các lớp để thay đổi và cho phép hệ thống mở rộng thông qua kế thừa hoặc interface.

Có thể không phải lúc nào cũng thực hành được nguyên tắc này, nhưng đó là điều bạn nên phấn đầu. Có một hệ thống đáng tin cậy và mạnh mẽ là điều bạn muốn có. Bạn muốn xây dựng các tính năng, nhưng bạn cũng muốn chúng có hiệu suất tốt, một cơ sở mã linh hoạt và có thể tái sử dụng đóng một vai trò quan trọng trong việc cung cấp điều đó, mẫu thiết kế được sử dụng để giải quyết các vấn đề phần mềm cụ thể. Nhưng tất cả đều dựa vào một tập hợp các ý tưởng thống nhất.

Nguyên tắc Open/Closed là một trong những ý tưởng được sử dụng bởi Design Pattern. Và cũng là một nguyên tắc bạn nên sử dụng khi thiết kế và xây dựng các giải pháp phần mềm của mình.

Cảm ơn.




Nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Những thuật toán nền tảng trong lĩnh vực Trí tuệ nhân tạo (Artificial Intelligence I)