インターフェース分離
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 の class を実装して修正しましょう。Frog と Giraffe の class が与えられており、これらは新しい class を実装します
タスク:
- 抽象 class
Walkableを作成します。この class には抽象関数walk(self)が1つだけあります - 抽象 class
Swimableを作成します。この class には抽象関数swim(self)が1つだけあります
与えられたコードを変更しないでください!
ここで、各インターフェースは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")
Clean Code - Pythonでより良いコードを書くのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ