今日学んだこと:凝集度に関して

2025年9月9日

概要

今日は凝集度について学んだ。

ポイント1

凝集度(Cohesion)とは、モジュールの要素がどの程度そのモジュールに収まっているかの度合いを指す。 言い換えれば、凝集度とはモジュール内の要素同士の関連度を示す指標だ。 関連する要素がすべて一箇所にまとまっている状態が、凝集したモジュールの理想だ。 まとまりをそれよりも細かくしてしまうと、 モジュール間の呼び出しによって要素を結合しないと、有益な結果が得られなくなってしまうからだ。

ポイント2

  • 機能的凝集(Functional Cohesion) 関連する要素だけでモジュールが構成され、 モジュールが機能するために必要不可欠なものがすべて含まれている。

  • 逐次的凝集(Sequential Cohesion) 一方が出力したデータを、もう一方が入力とする形で、 2つのモジュールが相互に作用している。

  • 通信的凝集(Communicational Cohesion) 2つのモジュールが通信の連鎖を形成し、それぞれの情報を操作したり、 何らかの出力に貢献したりする。たとえば、データベースにレコードを追加し、 その情報に基づいて電子メールを生成するといった具合だ。

  • 手続き的凝集(Procedural Cohesion) 2つのモジュールは、特定の順序でコードを実行する必要がある。

  • 時間的凝集(Temporal Cohesion) モジュール間に時間的な依存関係がある。 たとえば、多くのシステムには、 システム起動時に初期化しなければならない一見無関係な処理群が存在している。 これらの異なる処理には時間的な凝集があるといえる。

  • 論理的凝集(Logical Cohesion) モジュール内のデータは論理的に関連しているものの、機能的には関連していない。 たとえば、テキストやシリアライズされたオブジェクト、 またはストリームを情報へ変換するモジュールを考えてみよう。 この場合、これらは操作の上では関連があるものの、機能はまったく異なる。 この種の凝集の典型的な例が、 ほぼすべてのJavaプロジェクトに存在するStringUtilsクラスだ。 ほとんどの場合、StringUtilsクラスは、 Stringを操作するということでは関連しているものの、 互いには関連していない静的メソッドの集まりだ。

  • 偶発的凝集(Coincidental Cohesion) モジュール内の要素は、同じソースファイル内にある以外には関連性がない。 これは最も最悪な形での凝集を表している。