Aberto/fechado
Lição 23 de 28 do curso Clean Code - Escreva códigos melhores com Python da Coddy.
"Entidades de software devem estar abertas para extensão, mas fechadas para modificação."
O princípio estabelece que qualquer função, módulo ou classe deve permitir a extensão de seu comportamento sem modificar o próprio código.
Digamos que temos a classe TxtConvertor que converte um arquivo txt para json ou 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")Esta estrutura viola o princípio Aberto-Fechado (Open-Closed).
Por quê?
Por exemplo, se quisermos adicionar suporte para conversão de arquivo txt para html, teremos que modificar a classe existente (viola o princípio de fechamento)
Então, o que devemos fazer?
Neste exemplo, uma solução seria criar uma classe abstrata que conterá a função principal,
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.A biblioteca
abcsuporta classes base abstratas para python, você pode ler mais aqui
Desafio
MédioSua tarefa é modificar o exemplo fornecido para aplicar o princípio do Aberto-Fechado e adicionar um conversor para suportar txt para html.
- crie a classe abstrata
TxtConvertor - crie as classes
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTMLque herdarão deTxtConvertore implementarão os conversores (como no exemplo acima)
Experimente você mesmo
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")