Menu
Coddy logo textTech

Aperto/chiuso

Lezione 23 di 28 del corso Codice pulito - Scrivi codice migliore con Python di Coddy.

"Le entità software dovrebbero essere aperte all'estensione, ma chiuse alla modifica."

Il principio afferma che qualsiasi funzione, modulo o classe dovrebbe consentire di estenderne il comportamento senza modificare il codice stesso.  

Supponiamo di avere la classe TxtConvertor che converte un file txt in 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")

Questa struttura viola il principio Open-Closed.

Perché?

Per esempio, se vogliamo aggiungere il supporto per la conversione da un file txt a html, dovremo modificare la classe esistente (violando il principio di chiusura)

Quindi, cosa dovremmo fare?

In questo esempio, una soluzione potrebbe essere creare una classe astratta che contenga la funzione principale,

from abc import ABC, abstractmethod

class TxtConvertor(ABC):
	@abstractmethod
	def convert(self, file):
		pass

class TxtConvertorToJson(TxtConvertor):
	...

.
.
.

La libreria abc supporta le classi base astratte in Python. Puoi leggere di più qui

challenge icon

Sfida

Medio

Il tuo compito è modificare l’esempio fornito per applicare il principio Open-Closed e aggiungere un convertitore per supportare la conversione da txt a html.

  1. crea la classe astratta TxtConvertor
  2. crea le classi TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML, che erediteranno da TxtConvertor e implementeranno i convertitori (come nell’esempio precedente)

Provalo tu

class TxtConvertor:
	def convert_to_json(self, file):
		print("converts file to json")
	
	def convert_to_xml(self, file):
		print("converts file to xml")

Tutte le lezioni di Codice pulito - Scrivi codice migliore con Python

Esercitati da solo: Compilatore Python online