Открытость/закрытость
Урок 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. Подробнее можно прочитать здесь.
Задание
СреднеВаша задача — изменить приведённый пример, чтобы применить принцип открытости/закрытости и добавить конвертер для поддержки преобразования txt в html.
- создать абстрактный class
TxtConvertor - создать классы
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