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, tout module ou toute class devrait permettre d’étendre son comportement sans modifier le code lui-même.  

Supposons que nous ayons la class TxtConvertor qui convertit un fichier txt en json ou en 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é.

Pourquoi ?

Par exemple, si nous voulons ajouter la prise en charge de la conversion d’un fichier txt en html, nous devrons modifier la class existante (ce qui viole le principe « fermé »).

Alors, que devons-nous faire ?

Dans cet exemple, une solution serait de créer une class 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 davantage ici.

challenge icon

Défi

Moyen

Votre tâche consiste à modifier l’exemple donné afin d’appliquer le principe Ouvert-Fermé et à ajouter un convertisseur prenant en charge la conversion de txt vers html.

  1. créer la classe abstraite TxtConvertor
  2. créer 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

Entraînez-vous par vous-même : Compilateur Python en ligne