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