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

Задание

Средне

Ваша задача — изменить приведённый пример, чтобы применить принцип открытости/закрытости и добавить конвертер для поддержки преобразования txt в html.

  1. создать абстрактный class 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

Потренируйтесь самостоятельно: Онлайн-компилятор Python