Menu
Coddy logo textTech

Открытость/закрытость

Урок 23 из 28 курса Clean Code — пишите код лучше на Python на Coddy.

"Программные сущности должны быть открыты для расширения, но закрыты для модификации."

Принцип гласит, что любая функция, модуль или класс должны позволять расширять свое поведение без изменения самого кода.  

Допустим, у нас есть класс TxtConvertor, который конвертирует txt-файл в json или 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")

Эта структура нарушает принцип открытости-закрытости.

Почему?

Например, если мы захотим добавить поддержку конвертации из txt-файла в html, нам придется изменить существующий класс (что нарушает принцип закрытости)

Так что же нам делать?

В данном примере одним из решений будет создание абстрактного класса, который будет содержать основную функцию,

from abc import ABC, abstractmethod

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

class TxtConvertorToJson(TxtConvertor):
	...

.
.
.

Библиотека abc поддерживает абстрактные базовые классы для python, подробнее можно прочитать здесь

challenge icon

Задание

Средне

Ваша задача — изменить приведенный пример, чтобы применить принцип открытости-закрытости (Open-Closed principle), и добавить конвертер для поддержки txt в html.

  1. создайте абстрактный класс TxtConvertor
  2. создайте классы TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML, которые будут наследоваться от TxtConvertor и реализовывать конвертеры (как в примере выше)

Попробуйте сами

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

Все уроки раздела Clean Code — пишите код лучше на Python