凝集という用語は、元々、モジュールのソースコードが互いにどの程度関連しているかを定性的に測定するものとして、ソースコードのモジュールを説明するために使用されていました。結束の考え方は、さまざまな分野で使用されています。たとえば、軍事ユニットなどの人々のグループはまとまりがある場合があります。つまり、ユニット内の人々は共通の目標に向かって協力します。
ソースコードのまとまりの本質は、モジュール内のソースコードが、明確に定義された共通の目標に向かって連携することです。モジュール出力を作成するために必要な最小限のソースコードはモジュール内にあり、それ以上はありません。インターフェイスは明確に定義されており、入力はインターフェイスを介して流入し、出力はインターフェイスを介して流出します。副作用はなく、ミニマリズムに重点が置かれています。
機能的にまとまりのあるモジュールの利点は、単体テストの開発と自動化が簡単なことです。実際、モジュールのまとまりの良い尺度は、モジュールの完全な単体テストのフルセットを作成することがいかに簡単かということです。
モジュールは、オブジェクト指向言語のクラス、関数型言語、またはCなどの非オブジェクト指向言語の関数です。凝集性の測定に関するこの分野の元の作業の多くは、IBMのCOBOLプログラムでの作業に主に関係していました。 1970年代なので、まとまりはオブジェクト指向の概念だけではありません。
凝集の概念および関連する結合の概念が由来する研究の本来の目的は、理解、維持、および拡張が容易なプログラムの特性がどこにあるかを研究することでした。目標は、プログラミングのベストプラクティスを学び、それらのベストプラクティスを体系化してから、他のプログラマーにそのプラクティスを教えることができるようにすることでした。
優れたプログラマーの目標は、環境と解決されている問題を考慮して、可能な限り凝集性の高いソースコードを作成することです。これは、大規模なアプリケーションでは、ソースコード本体の一部が、そのモジュールまたはクラス内のソースコードのまとまりのレベルに関して他の部分とは異なることを意味します。あなたが得ることができる最高のものについては、あなたが解決しようとしている問題のために、時間的または連続的な結束である場合があります。
最高レベルの凝集度は機能的凝集度です。関数の凝集度を持つモジュールは、入力のセットを提供し、特定の出力を取得するという点で数学関数に似ています。真に機能するモジュールは、出力に加えて副作用がなく、いかなる種類の状態も維持しません。代わりに、モジュールの内部を公開せずにモジュールの機能をカプセル化する明確に定義されたインターフェイスがあり、モジュールを使用する人は特定の入力セットを提供し、代わりに特定の出力を取得します。真に機能するモジュールは、スレッドセーフでもある必要があります。
多くのプログラミング言語ライブラリには、クラス、テンプレート、関数など、機能モジュールの例がいくつか含まれています。最も機能的なまとまりのある例は、sin、余弦、平方根などの数学関数です。
他の機能は、副作用があるか、ある種の状態を維持するため、それらの機能の使用がより複雑になる可能性があります。
たとえば、例外をスローしたり、グローバルエラー変数を設定したり(errno
Cで)、シーケンスで使用する必要があるstrtok()
関数(関数は、内部状態を維持するため、標準Cライブラリの例です)またはポインタを提供します。管理されるか、ログをログユーティリティに発行することはすべて、機能のまとまりがなくなった機能の例です。
YourdonとConstantineの元の本であるStructuredProgrammingの両方を読んだことがあります。ここでは、1980年代に最初に凝集のアイデアに出会い、MeilirPage-Jonesの本PracticalGuide to Structured Systems Designを読みました。そして、Page-Jonesははるかに優れた説明を行いました。結合と凝集の両方。ヨードンとコンスタンティンの本はもう少し学術的なようです。SteveMcConnellの本CodeCompleteは非常に優れており、実用的であり、改訂版には優れたプログラミング手法について多くのことが書かれています。