73-単一責任原則

プログラマが知るべき97のこと」の73個目のエピソードは、単一責任原則に関する話です。単一責任原則(Single Responsibility Principle: SRP)は良く知られた良いデザインを行う為の原則の1つです。単一責任原則を簡単に言えば、「あるクラス・モジュール・関数などの責務は唯一であることが望ましく、その原則を守ることで何らかの変更が必要となったときに変更を行うべきクラス・モジュール・関数は1つのみとなる」という事です。

良いシステムデザインとは、システムのコンポーネントがそれぞれ独立してデプロイできるようになっているデザインのことです。独立してデプロイできるというのは、あるコンポーネントに変更を加えたからといって、別のコンポーネントの再デプロイは不要という意味です。

本文にあるEmployeeクラスの例はいささか極端ですが、システムデザインをする時に依存関係が少ない独立したコンポーネント群とする事は重要な事です。可能な限り依存関係を減らしていく事は、まさに単一責任原則に従うという事です。理想的なソフトウェアデザインとなるでしょう。しかし、現実としてはあるクラスが別のクラスに依存するという事は避けることは出来ません。避けることは出来たとしても、かえって複雑な設計となってしまう事もあります。
単一責任原則は重要で基本的な原則です。誰も、なんらかの変更を行うために幾つものクラスを修正したり、逆にどんな修正をするにも同じクラスの修正が必要になるシステムを扱いたくはありません。なので、単一責任ではなくとも依存関係は低く設計しておくことは重要です。
自分がJavaのシステムを開発するときは、第1にクラスの相互依存関係を作りません。あるクラスが別のクラスに依存することは避けられませんが、別のクラスもまたあるクラスに依存する事はたいていの場合は避けられます。相互依存関係を作ってしまうと、それらのクラス同士が強く結びついてしまい、大抵の場合は破綻する運命です。パッケージ間の依存関係も同様です。あるパッケージと別のパッケージが相互に依存する事は避けると良いでしょう。例えば、MVCアーキテクチャを採用したアプリケーションにおいて、Modelを格納したパッケージがあるとします。ModelはViewとControllerから参照されるのは避けられません。しかし、ModelがViewやControllerに依存する事は避けた方が良いですし、避けることができます。しかし、ViewとControllerの関係はどうでしょうか?なるべく依存関係を低くするのであれば、一方からもう一方への依存関係のみでシステムを構築することができます。しかし、現実としてはControllerとViewは密接な関係を持っているため、パッケージ間でも依存しあうことが多くあります。その方が設計がシンプルになり可読性が高くなるからです。
単一責任原則は重要で基本的な原則ですが、適用は慎重に、よりシンプルになるのであれば、原則よりもカンと経験を信じましょう。

プログラマが知るべき97のこと

プログラマが知るべき97のこと