コンピュータプログラミングにおいて、凝集度とはモジュール内の要素がどの程度まとまっているかを指します。[1]ある意味では、凝集度はクラスのメソッドとデータの関係の強さと、そのクラスが果たす統一目的や概念の強さを測る尺度です。別の意味では、凝集度はクラスのメソッドとデータの関係の強さを測る尺度です。
凝集度は順序型の測定で、通常は「凝集度が高い」または「凝集度が低い」と表現されます。凝集度が高いモジュールは、堅牢性、信頼性、再利用性、理解しやすさなど、望ましいソフトウェア特性と関連しているため、好まれる傾向があります。対照的に、凝集度が低いと、保守、テスト、再利用、理解が困難になるなど、望ましくない特性と関連します。
凝集性は結合と対比されることが多い。高い凝集性は疎結合と相関関係にあることが多く、逆もまた同様である。[2]結合と凝集性のソフトウェアメトリクスは、保守と変更のコストを削減する「優れた」プログラミング手法の特性に基づき、 1960年代後半に構造化設計の一環としてラリー・コンスタンチンによって発明された。構造化設計、凝集性、結合性は、 Stevens、Myers、Constantine (1974) [3]の論文とYourdon & Constantine (1979)の書籍で発表された。 [1]後者の2つはその後、ソフトウェアエンジニアリングの標準用語となった。
高い凝集性
オブジェクト指向プログラミングでは、クラスが提供するメソッドが多くの点で類似している場合、そのクラスは高い凝集性を持つと言われます。[4]凝集度の高いシステムでは、コードの可読性と再利用性が向上し、複雑さは管理可能な状態に保たれます。

凝集性は次のような場合に高まります:
- クラスに埋め込まれ、そのメソッドを通じてアクセスされる機能には多くの共通点があります。
- メソッドは、粗粒度または関連のないデータセットを回避して 、少数の関連するアクティビティを実行します。
- 関連するメソッドは同じソース ファイル内にあるか、またはグループ化されています (たとえば、別々のファイル内ですが同じサブディレクトリ/フォルダー内にあります)。
高い凝集性(または「強い凝集性」)の利点は次のとおりです。
- 操作が少なくなり、モジュールの複雑さが軽減されました。
- ドメイン内の論理的な変更が影響を与えるモジュールが少なくなり、1 つのモジュールの変更によって他のモジュールに必要な変更が少なくなるため、システムの保守性が向上します。
- アプリケーション開発者は、モジュールによって提供される一連の操作の中から必要なコンポーネントをより簡単に見つけられるため、モジュールの再利用性が向上します。
原理的には、モジュールは単一の原子要素 (たとえば、単一の機能を持つ要素) のみで構成することで完全な凝集性を持つことができますが、実際には、複雑なタスクは単一の単純な要素では表現できません。したがって、単一要素のモジュールには、タスクを実行するには複雑すぎる要素、または狭すぎて他のモジュールと 密に結合されている要素が含まれます。したがって、凝集性は、ユニットの複雑さと結合の両方でバランスが取れています。
凝集性の種類
凝集度は定性的な尺度であり、分類を決定するために基準を使用してソース コードが検査されます。凝集度タイプは、最悪から最良まで次のとおりです。
- 偶然の結束(最悪)
- 偶然の凝集とは、モジュールのパーツが任意にグループ化されていることです。パーツ間の唯一の関係は、一緒にグループ化されていることです (例: 「ユーティリティ」クラス)。例:
/* グループ: 関数の定義 パーツ: 各関数の項 */ モジュールA { /* r(x) = 5x + 3 の実装 このように関数をグループ化する特別な理由はない ので、モジュールは偶然の結合性を持つと言われています。 */ r ( x ) = a ( x ) + b ( x ) a ( x ) = 2 x + 1 b ( x ) = 3 x + 2 }
- 論理的結束
- 論理的な凝集性とは、モジュールの各部分が本質的に異なっていても、論理的に同じことを行うように分類されているためグループ化されていることです (たとえば、すべてのマウスとキーボードの入力処理ルーチンをグループ化したり、すべてのモデル、ビュー、コントローラーをMVC パターンの別々のフォルダーにバンドルしたりするなど)。
- 時間的結合
- 時間的凝集性とは、モジュールの各部分が処理される時間に従ってグループ化されることです。各部分は、プログラム実行の特定の時間に処理されます (例: 例外をキャッチした後に呼び出され、開いているファイルを閉じ、エラー ログを作成し、ユーザーに通知する関数)。
- 手続きの一貫性
- 手続き的凝集性とは、モジュールの各部分が常に特定の実行シーケンスに従うためグループ化されることです (たとえば、ファイルの権限をチェックしてからファイルを開く関数など)。
- コミュニケーションと情報の結束
- 通信の凝集性とは、モジュールの各部分が同じデータに対して動作するためグループ化されることです (たとえば、同じ情報レコードに対して動作するモジュール)。
- 連続的な結合
- 順次結合とは、ある部分からの出力が組立ラインのように別の部分への入力となるため、モジュールの各部分がグループ化されることです (たとえば、ファイルからデータを読み取ってデータを処理する関数)。
- 機能的結合(最良)
- 機能的凝集性とは、モジュールの各部分が、モジュールの明確に定義された単一のタスク (例: XML 文字列の
字句解析) に貢献するためグループ化されることです。例:
/* グループ: 関数の定義 パーツ: 各関数の用語 */ モジュールA { /* 算術演算の実装 このモジュールは、 単純な算術演算をグループ化する意図があるため、機能的凝集性があると言われています 。 */ a ( x , y ) = x + y b ( x , y ) = x * y } モジュールB { /* モジュール B: r(x) = 5x + 3 を実装します 。このモジュールは、原子凝集性を持っていると言えます。 システム全体 (モジュール A と B をパーツとして含む) は、そのパーツの両方が特定の個別の目的を持っているため、機能凝集性を持っているとも言えます 。 */ r ( x ) = [モジュールA ]. a ([モジュールA ]. b ( 5 , x ), 3 ) }
- 完全な凝集力(原子)
- 例。
/* グループ: 関数の定義 パーツ: 各関数の項 */ モジュールA { /* r(x) = 2x + 1 + 3x + 2 の実装 これ以上縮約できないため、完全な結合性があると言われています。 */ r ( x ) = 2 x + 1 + 3 x + 2 }
凝集性は順位付け型の尺度ではあるが、順位付けは凝集性が着実に向上していくことを示すものではない。ラリー・コンスタンティン、エドワード・ヨードン、スティーブ・マッコーネルによる研究[5]によると、最初の2つのタイプの凝集性は劣っており、コミュニケーションと連続的な凝集性は非常に優れており、機能的な凝集性は優れていることがわかっている。
参照
参考文献
- ^ ab エドワード・ユアドン、ラリー・ルロイ・コンスタンティン(1979) [1975]。構造化設計:コンピュータプログラムとシステム設計の分野の基礎。ユアドン・プレス。Bibcode : 1979sdfd.book ..... Y。ISBN 978-0-13-854471-3。
- ^ ジョゼフ・インジェノ (2018).ソフトウェアアーキテクトハンドブック。パックト出版。 p. 175.ISBN 978-178862406-0。
- ^ Stevens, Wayne P. ; Myers, Glenford J. ; Constantine, Larry LeRoy (1974 年 6 月)。「構造化設計」。IBM Systems Journal。13 ( 2): 115–139。doi :10.1147/sj.132.0115 。
- ^ Marsic, Ivan (2012).ソフトウェアエンジニアリング.ラトガース大学.
- ^ McConnell, Steve (2004年6月) [1993]. Code Complete (第2版). Pearson Education. pp. 168-171. ISBN 978-0-7356-1967-8。
外部リンク
- 凝集性指標の定義
- 凝集性指標
- Python での凝集度の測定
