🍯
【SOLID原則】インタフェース分離の原則 - ISP
SOLID原則とは、ソフトウェア設計の5つの原則の頭字語を取ったものです。ソフトウェアをより理解しやすく、より柔軟に、よりメンテナナンス性の高いものにするために考案されました。
- 単一責任の原則(Single Responsibility Principle)
- オープン・クローズドの原則(Open/closed principle)
- リスコフの置換原則(Liskov substitution principle)
- インターフェース分離の原則(Interface segregation principle)
- 依存性逆転の原則(Dependency inversion principle)
今回はSOLID原則のひとつ、インタフェース分離の原則についてです。
インタフェース分離の原則
インタフェース分離の原則について、書籍「アジャイルソフトウェア開発の奥義」では、このように書かれています。
クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない。[1]
つまり、クライアントは使わないインタフェースの実装を強制されるべきではないという事です。
インタフェースを小さい単位に分離することで、各クライアントは実際に自分が利用するメソッドだけに依存するようになり、他のクライアントの変更の影響を最小限に抑えることが出来ます。
次のサンプルコードは、Crow(カラス)クラスと、Turtle(カメ)クラスがあります。カラスとカメは動物です。そのため、動物を抽象化したIAnimalインターフェースを実装しています。
interface IAnimal {
sleep(): void
fly(): void
swim(): void
}
class Crow implements IAnimal {
sleep = () => {}
fly = () => {}
swim = () => {}
}
class Turtle implements IAnimal {
sleep = () => {}
fly = () => {}
swim = () => {}
}
しかし、コードをよく見るとCrow(カラス)クラスにswimメソッドがあり、Turtle(カメ)クラスにはflyメソッドが存在しています。そもそもカラスは水中を泳げないですし、亀は空を飛びません。
この状態を解消するには、細かい単位でインタフェースを分離し、それぞれのクラスに必要なインターフェースだけを実装します。
interface ISeep {
sleep(): void
}
interface IFly {
fly(): void
}
interface ISwim {
swim(): void
}
class Crow implements ISeep, IFly {
sleep = () => {}
fly = () => {}
}
class Turtle implements ISeep, ISwim {
sleep = () => {}
swim = () => {}
}
インタフェースを小さい単位に分離したことにより、それを使うクライアントは自分の関心ごとのみを扱えるようになりました。これがインタフェース分離の原則です。
-
Robert C. Martin. アジャイルソフトウェア開発の奥義 ↩︎
Discussion