Menu
Coddy logo textTech

インターフェース分離

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!")

ご覧の通り、このインターフェースは歩くことと泳ぐことの両方ができない動物とは互換性がありません!

challenge icon

チャレンジ

簡単

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")
			

Clean Code - Pythonでより良いコードを書くのすべてのレッスン