Open closed
Lección 23 de 28 del curso Clean Code - Write better code using Python de Coddy.
"Las entidades de software deben estar abiertas para su extensión, pero cerradas para su modificación."
El principio establece que cualquier función, módulo o clase debe permitir la extensión de su comportamiento sin modificar el código en sí.
Supongamos que tenemos la clase TxtConvertor que convierte un archivo txt a json o 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 estructura viola el principio de Abierto-Cerrado (Open-Closed principle).
¿Por qué?
Por ejemplo, si queremos añadir soporte para la conversión de un archivo txt a html, tendremos que modificar la clase existente (viola el principio de cierre).
Entonces, ¿qué deberíamos hacer?
En este ejemplo, una solución sería crear una clase abstracta que contendrá la función principal,
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.La librería
abcsoporta clases base abstractas para python, puedes leer más aquí
Desafío
IntermedioTu tarea es modificar el ejemplo dado para aplicar el principio de Abierto-Cerrado, y añadir un convertidor para soportar de txt a html.
- crea la clase abstracta
TxtConvertor - crea las clases
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTMLque heredarán deTxtConvertore implementa los convertidores (como en el ejemplo anterior)
Pruébalo tú mismo
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")