Menu
Coddy logo textTech

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 abc suporta classes base abstratas para python, você pode ler mais aqui

challenge icon

Desafio

Médio

Sua tarefa é modificar o exemplo fornecido para aplicar o princípio do Aberto-Fechado e adicionar um conversor para suportar txt para html.

  1. crie a classe abstrata TxtConvertor
  2. crie as classes TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML que herdarão de TxtConvertor e 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")

Todas as lições de Clean Code - Escreva códigos melhores com Python