Menu
Coddy logo textTech

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 abc admite clases base abstractas para Python; puedes leer más aquí.

challenge icon

Desafío

Intermedio

Tu tarea consiste en modificar el ejemplo proporcionado para aplicar el principio abierto-cerrado y añadir un convertidor compatible con txt a html.

  1. crea la clase abstracta TxtConvertor
  2. crea las clases TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML, que heredarán de TxtConvertor e 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