Interface Segregation
Lektion 25 von 28 im Kurs Clean Code - Schreibe besseren Code mit Python von Coddy.
"Viele client-spezifische Schnittstellen sind besser als eine Allzweck-Schnittstelle."
Ein Interface ist eine Beschreibung von Verhaltensweisen, die ein Objekt ausführen kann.
Das Interface-Segregation-Prinzip besagt, dass ein Interface im Hinblick auf die Kohäsion so klein wie möglich sein sollte. Mit anderen Worten, es sollte nur EINE Sache tun.
Schauen wir uns ein schlechtes Beispiel an und wir werden es beheben,
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
passDies ist ein Interface mit mehreren Verantwortlichkeiten!
Und wir werden ein Problem haben, wenn wir dies implementieren,
class Frog(Animal):
def walk(self):
print("Walking")
def swim(self):
print("Swimming")
class Giraffe(Animal):
def walk(self):
print("Walking")
def swim(self):
raise Exception("Girrafe cannot swim!")Wie Sie sehen, ist dieses Interface nicht kompatibel mit Tieren, die nicht laufen und schwimmen können!
Aufgabe
EinfachLassen Sie uns das obige Beispiel korrigieren, indem wir die Klassen Walkable und Swimable implementieren. Ihnen werden die Klassen Frog und Giraffe gegeben, welche die neuen Klassen implementieren.
Aufgaben:
- Erstellen Sie die abstrakte Klasse
Walkable, die nur eine abstrakte Funktionwalk(self)hat. - Erstellen Sie die abstrakte Klasse
Swimable, die nur eine abstrakte Funktionswim(self)hat.
Ändern Sie den vorgegebenen Code nicht!
Beachten Sie, dass nun jedes Interface nur eine Verantwortung hat und dem Prinzip folgt
Probier es selbst
from abc import ABC, abstractmethod
# Enter you code here
class Frog(Walkable, Swimable):
def walk(self):
print("Walking")
def swim(self):
print("Swimming")
class Giraffe(Walkable):
def walk(self):
print("Walking")
if __name__ == "__main__":
animal_type = input()
if animal_type == "frog":
animal = Frog()
animal.walk()
animal.swim()
elif animal_type == "giraffe":
animal = Giraffe()
animal.walk()
print("not Swimming")