Open closed
Lección 23 de 28 del curso Clean Code - Write better code using Python de Coddy.
"Las entidades de software deberían estar abiertas a la extensión, pero cerradas a la modificación."
El principio establece que cualquier función, módulo o clase debería 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 abierto-cerrado.
¿Por qué?
Por ejemplo, si queremos añadir compatibilidad con la conversión de un archivo txt a html, tendremos que modificar la clase existente (viola el principio cerrado).
Entonces, ¿qué deberíamos hacer?
En este ejemplo, una solución sería crear una clase abstracta que contenga la función principal:
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.La biblioteca
abcadmite clases base abstractas para Python; puedes leer más aquí.
Desafío
IntermedioTu tarea consiste en modificar el ejemplo proporcionado para aplicar el principio abierto-cerrado y añadir un convertidor compatible con txt a html.
- crea la clase abstracta
TxtConvertor - crea las clases
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTML, que heredarán deTxtConvertore implementarán 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")Todas las lecciones de Clean Code - Write better code using Python
Practica por tu cuenta: Compilador de Python online