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 の class を実装して修正しましょう。FrogGiraffe の 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オンラインコンパイラ