Menu
Coddy logo textTech

Aberto/fechado

Lição 23 de 28 do curso Clean Code - Escreva códigos melhores com Python da Coddy.

"As entidades de software devem estar abertas para extensão, mas fechadas para modificação."

O princípio afirma 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")

Essa estrutura viola o princípio Aberto-Fechado.

Por quê?

Por exemplo, se quisermos adicionar suporte à conversão de um arquivo txt para html, teremos que modificar a classe existente (viola o princípio fechado)

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 oferece suporte a 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 Aberto-Fechado e adicionar um conversor para oferecer suporte à conversão de 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

Pratique por conta própria: Compilador de Python online