インターフェース分離
Coddyの「Clean Code - Pythonでより良いコードを書く」コースのレッスン 25/28。
「多くのクライアントに特化したインターフェースは、1つの汎用的なインターフェースよりも優れている。」
インターフェースとは、オブジェクトができる振る舞いの記述です。
インターフェース分離の原則は、インターフェースは凝集度の観点から可能な限り小さくあるべきだと述べています。言い換えれば、それは1つのことだけを行うべきです。
悪い例を見て、それを修正してみましょう。
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def walk(self):
pass
@abstractmethod
def swim(self):
passこれは複数の責任を持つインターフェースです!
そして、これを実装する際に問題が発生します。
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!")ご覧の通り、このインターフェースは歩くことと泳ぐことの両方ができない動物とは互換性がありません!
チャレンジ
簡単WalkableクラスとSwimableクラスを実装して、上記の例を修正しましょう。新しいクラスを実装するFrogクラスとGiraffeクラスが提供されています。
タスク:
- 1つの抽象関数
walk(self)のみを持つ抽象クラスWalkableを作成してください。 - 1つの抽象関数
swim(self)のみを持つ抽象クラスSwimableを作成してください。
与えられたコードを変更しないでください!
各インターフェースが1つの責任のみを持ち、原則に従っていることに注目してください。
自分で試してみよう
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")