Otwarte-zamknięte
Lekcja 23 z 28 w kursie Czysty kod — pisz lepszy kod w Pythonie w Coddy.
„Elementy oprogramowania powinny być otwarte na rozszerzenia, ale zamknięte na modyfikacje”.
Zasada ta mówi, że każda funkcja, moduł lub klasa powinny umożliwiać rozszerzanie swojego działania bez modyfikowania samego kodu.
Załóżmy, że mamy klasę TxtConvertor, która konwertuje plik txt do formatu json lub 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")Taka struktura narusza zasadę otwarte-zamknięte.
Dlaczego?
Na przykład, jeśli chcemy dodać obsługę konwersji pliku txt do formatu html, będziemy musieli zmodyfikować istniejącą klasę (narusza to zasadę zamknięcia).
Co więc powinniśmy zrobić?
W tym przykładzie jednym z rozwiązań byłoby utworzenie klasy abstrakcyjnej, która będzie zawierać główną funkcję,
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.Biblioteka
abcobsługuje abstrakcyjne klasy bazowe w Pythonie. Więcej informacji znajdziesz tutaj.
Wyzwanie
ŚredniTwoim zadaniem jest zmodyfikować podany przykład, aby zastosować zasadę otwarte-zamknięte i dodać konwerter obsługujący konwersję plików txt do html.
- utwórz klasę abstrakcyjną
TxtConvertor - utwórz klasy
TxtConvertorToJson,TxtConvertorToXML,TxtConvertorToHTML, które będą dziedziczyć poTxtConvertori implementować konwertery (jak w powyższym przykładzie)
Spróbuj swoich sił
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")Wszystkie lekcje w sekcji Czysty kod — pisz lepszy kod w Pythonie
Poćwicz samodzielnie: Kompilator Python online