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
abcprend en charge les classes de base abstraites pour python, vous pouvez en lire plus ici
Défi
MoyenVotre 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.
- créez la classe abstraite
TxtConvertor - créez 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")