単一責任の原則について誤解していた話

2025/01/01に公開

自分の誤解

単一責任の原則と聞いて「モジュールは1つのことだけをやるべきだ」と単純に思っていました。
しかし、今回調べてみるとそうではないことに気づきました。

改めて単一責任の原則とは

Clean Architecture では次のように述べられています。

モジュールを変更する理由はたったひとつだけであるべきである
モジュールはたった1つのアクターに対して責務を負うべきである
— 81ページ

アクターとは

アクターとは、そのモジュールに変更を求める人や仕組みのことです。
たとえば、モジュールの機能を使うユーザーや、そのモジュールを利用する他のプログラムがアクターにあたります。

つまりどういうこと?

一見すると複数の処理を持っているように見えるモジュールでも、アクターが1つならば単一責任とみなせるということです。
ただし、やっていることが似ていても、アクターが異なる場合はモジュールを分ける必要があります

具体例で考えてみる

モジュールを分けなくていい場合

例えば、ユーザー情報をアップデートする機能について考えてみましょう。
このモジュールは以下のような処理を含んでいます。

  • データベースから対象のユーザーを取得する
  • 対象のユーザー情報を更新する

一見、「ユーザーの取得」と「ユーザーの更新」は別の処理に見えますが、どちらも「ユーザー情報をアップデートしたい」という単一のアクターの要求を満たすための一連の処理です。
変更理由が「アップデート機能の仕様変更」という1つに集約されるため、単一責任の原則に反していません。

モジュールを分けるべき場合

一方で、共通の処理でもアクターが異なる場合にはモジュールを分けるべきです。

例えば、同じ「ユーザー情報を扱う」機能でも、以下のような状況を考えます。

  • ユーザー自身がプロフィールを編集する機能
  • 管理者がユーザーの情報を編集する機能

これらは「ユーザー情報を更新する」という共通点がありますが、アクター(管理者と一般ユーザー)が異なります。
それぞれのアクターが異なる変更理由を持つ可能性が高いため、1つのモジュールにまとめると管理や変更が複雑になり、単一責任の原則に反する設計となります。

結論

  • 単一責任の原則は「モジュールが1つの変更理由だけを持つこと」が大事。
  • 処理が複数あっても、対象が1つのアクターであれば分ける必要はない。
  • アクターが違えば、モジュールを分けるべき。
  • 「何のため」「誰のため」にモジュールがあるのかを考えるのが重要。

最後まで読んでいただきありがとうございました!

参考

単一責任原則についての読書メモ
SOLID原則完全に理解した!になるための本

Discussion