Menu
CoddyTech

Mở rộng, đóng sửa đổi

Bài học 23 trên 28 trong khóa học Clean Code: viết code tốt hơn với Python của Coddy.

“Các thực thể phần mềm nên mở để mở rộng, nhưng đóng để sửa đổi.”

Nguyên tắc này nêu rằng mọi hàm, module hoặc lớp đều nên cho phép mở rộng hành vi mà không cần sửa đổi chính code.  

Giả sử ta có lớp TxtConvertor để chuyển đổi tệp txt sang json hoặc xml,

class TxtConvertor:
	def convert_to_json(self, file):
		print("converts file to json")
	
	def convert_to_xml(self, file):
		print("converts file to xml")

Cấu trúc này vi phạm nguyên tắc Mở-Đóng.

Tại sao?

Ví dụ, nếu muốn bổ sung khả năng chuyển đổi tệp txt sang html, ta sẽ phải sửa đổi lớp hiện có (vi phạm nguyên tắc đóng)

Vậy ta nên làm gì?

Trong ví dụ này, một lời giải là tạo lớp trừu tượng chứa hàm chính,

from abc import ABC, abstractmethod

class TxtConvertor(ABC):
	@abstractmethod
	def convert(self, file):
		pass

class TxtConvertorToJson(TxtConvertor):
	...

.
.
.

Thư viện abc hỗ trợ các lớp cơ sở trừu tượng trong Python. Bạn có thể đọc thêm tại đây

challenge icon

Thử thách

Trung bình

Nhiệm vụ của bạn là chỉnh sửa ví dụ đã cho để áp dụng nguyên tắc Open-Closed (Open-Closed principle) và thêm bộ chuyển đổi từ txt sang html.

  1. tạo lớp trừu tượng TxtConvertor
  2. tạo các lớp TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML, kế thừa từ TxtConvertor và triển khai các bộ chuyển đổi (như trong ví dụ trên)

Tự làm thử

class TxtConvertor:
	def convert_to_json(self, file):
		print("converts file to json")
	
	def convert_to_xml(self, file):
		print("converts file to xml")

Tất cả bài học trong Clean Code: viết code tốt hơn với Python

Tự luyện tập: Trình biên dịch Python online