9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

なぜクラスを変更する理由は1つ以上存在してはいけないのか?

Posted at

単一責任の原則とは?

クラスを変更する理由は1つ以上存在してはならない
単一責任の原則(SRP)では、「役割(責任) = 変更理由」と定義している。
クラスを変更するのに2つ以上の理由がある場合、そのクラスには2つ以上の役割があることになる。

なぜクラスを変更する理由は1つ以上存在してはいけないのか?

このなぜが今回の一番のポイントになってくるかと思います。それでは説明していきます。

発表資料【Clean Architectへの道】-依存AからB (2).jpg

まず依存と変更の関係を再確認します。この図はAがBに依存している図です。
AがBを利用しているので、Bを変更すれば、利用しているAの修正が必要になります。

発表資料【Clean Architectへの道】-ページ11.jpg

User1はcalculatePayをUser2はreportHoursをUser3はSave()のみを利用しているとします。
calculatePayのみを変更した場合でも、「依存と変更の関係」で説明したように利用者であるUser2、User3の修正が必要になってきてしまいます。

発表資料【Clean Architectへの道】-ページ11 (3).jpg

このようにすることで、calculatePayの変更の影響はUser1のみなります。

**なぜクラスを変更する理由は1つ以上存在してはいけないのか?**の理由がわかってきたかと思います。
一つのクラスに変更理由が複数あると、関係ない箇所にまで修正の影響が出てしまうからです。

つまり変更する理由が同じものは集め、変更する理由が違うものは分けるというのが、この原理原則の本質となる部分です。

どのようなプロセスでこの原則を守るか?

変更する理由ってどんな理由でしょうか?ちょっと考えてみてください。

先ほどの図のようにEmployeeを使うのはUserです。
つまり変更する理由というのは、Userにあります。
Userを洗い出すことで、共通の利用理由を持っているアクター(Userのグループ)がわかってきます。
例えば、経理部門の人、人事部門の人、データベース管理者などがアクターとして挙がってくるかと思います。

単一責任の原則を実現する方法が見えてきました。
以下の手順で考えてみると良いかもしれません。
1.そのモジュール(Employeeとか)を使用するアクターを定義
 例:経理部門の人
2.アクターの責務を洗い出す
 例:給与計算(calculatePay)、etc...
3.アクターの責務のみを持つモジュールを作成

発表資料【Clean Architectへの道】-ページ12.jpg

少し話がそれますが、モジュールを別けることによって、全く共通の処理が見えてくると思います。
それは継承を持ちいて対応することが、解決策になるかと思います。

単一責任の原則が満たせているか確認するための質問

・その振る舞いを利用するアクターは誰か?
 →アクターが一人ならば問題ありません。
・その振る舞いは、どのアクターによって利用されるのか?
 →アクターが違うと変更理由も違うのでモジュールを別ける必要がわかります。
・その振る舞いはそのクラスが行うべきことか?
 →そのクラスが持つ必要のない振る舞いがあることで、アクターが複数になる可能性があります。振る舞いが違うならば、別けることで利用するアクターも分かれます。

最後に

SOLIDの原則の一つである単一責任の原則について説明しました。
業務を理解していないとアクターがわからないので、業務理解の必要もあるなと感じました。

他にもSOLIDの原則をまとめていきます。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?