Menu
Coddy logo textTech

Ouvert-fermé

Leçon 23 sur 28 du cours Clean Code - Écrire un meilleur code avec Python de Coddy.

"Les entités logicielles devraient être ouvertes à l'extension, mais fermées à la modification."

Le principe stipule que toute fonction, module ou classe doit permettre l'extension de son comportement sans modifier le code lui-même.  

Supposons que nous ayons une classe TxtConvertor qui convertit un fichier txt en 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")

Cette structure viole le principe Ouvert-Fermé (Open-Closed).

Pourquoi ?

Par exemple, si nous voulons ajouter la prise en charge de la conversion d'un fichier txt en html, nous devrons modifier la classe existante (ce qui viole le principe de fermeture).

Alors, que devrions-nous faire ?

Dans cet exemple, une solution serait de créer une classe abstraite qui contiendra la fonction principale,

from abc import ABC, abstractmethod

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

class TxtConvertorToJson(TxtConvertor):
	...

.
.
.

La bibliothèque abc prend en charge les classes de base abstraites pour python, vous pouvez en lire plus ici

challenge icon

Défi

Moyen

Votre tâche consiste à modifier l'exemple donné pour appliquer le principe Ouvert-Fermé, et d'ajouter un convertisseur pour prendre en charge le passage de txt à html.

  1. créez la classe abstraite TxtConvertor
  2. créez les classes TxtConvertorToJson, TxtConvertorToXML, TxtConvertorToHTML qui hériteront de TxtConvertor et implémenteront les convertisseurs (comme dans l'exemple ci-dessus)

Essayez vous-même

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

Toutes les leçons de Clean Code - Écrire un meilleur code avec Python