Open Closed
Lektion 23 von 28 im Kurs Clean Code - Schreibe besseren Code mit Python von Coddy.
"Software-Einheiten sollten offen für Erweiterungen, aber geschlossen für Modifikationen sein."
Das Prinzip besagt, dass jede Funktion, jedes Modul oder jede Klasse die Erweiterung ihres Verhaltens ermöglichen sollte, ohne den Code selbst zu ändern.
Nehmen wir an, wir haben die Klasse TxtConvertor, die eine txt-Datei in json oder xml konvertiert,
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")Diese Struktur verletzt das Open-Closed-Prinzip.
Warum?
Wenn wir zum Beispiel Unterstützung für die Konvertierung von einer txt-Datei in html hinzufügen möchten, müssten wir die bestehende Klasse ändern (verletzt das "Closed"-Prinzip).
Was sollten wir also tun?
In diesem Beispiel wäre eine Lösung, eine abstrakte Klasse zu erstellen, welche die Hauptfunktion enthält,
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.Die
abc-Bibliothek unterstützt abstrakte Basisklassen für Python. Mehr dazu können Sie hier lesen.
Aufgabe
MittelIhre Aufgabe ist es, das gegebene Beispiel zu modifizieren, um das Open-Closed-Prinzip anzuwenden und einen Konverter hinzuzufügen, der txt zu html unterstützt.
- Erstellen Sie die abstrakte Klasse
TxtConvertor - Erstellen Sie die Klassen
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTML, die vonTxtConvertorerben und die Konverter implementieren (wie im obigen Beispiel)
Probier es selbst
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")