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 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 abc soporta clases base abstractas para python, puedes leer más aquí

challenge icon

Desafío

Intermedio

Tu tarea es modificar el ejemplo dado para aplicar el principio de Abierto-Cerrado, y añadir un convertidor para soportar de txt a html.

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

Todas las lecciones de Clean Code - Write better code using Python