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
abcprend en charge les classes de base abstraites pour Python ; vous pouvez en lire davantage ici.
Défi
MoyenVotre 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.
- créer la classe abstraite
TxtConvertor - créer les classes
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTMLqui hériteront deTxtConvertoret 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