概要
以前、仕事中で「結合度と凝集度を考えながら、作業すると良いです。」と言われました。
大学の時、聞いたことある単語ですが、具体的な内容を忘れたので勉強しました。
結合度???
結合度は、モジュールが他のモジュールに依存している程度を示すものです。
結合度の高いクラスの問題
他の関連クラスが変更されると、加えて変更します。
また、変更するクラスを理解するために、関連する他のクラスを一緒に理解する必要があります。
それで、他のプログラムでは、クラスを再利用することも難しいです。
結合度の程度 【wiki参考】
内容結合(Content coupling)「高」
病理学的結合とも呼ばれ、あるモジュールが別のモジュールの内部動作によって変化したり依存したりする(例えば別のモジュールの内部データを直接参照する)。したがって、あるモジュールのデータを生成する方法(場所、種類、タイミング)を変更することは、依存するモジュールの変更につながる可能性がある。
共通結合(Common coupling)
グローバル結合とも呼ばれ、二つのモジュールが同じグローバルデータ(例えば、グローバル変数)を共有する。共通のリソースを変更すると、それを使用したすべてのモジュールを変更することを意味する。
外部結合(External coupling)
二つのモジュールは、外部から供給されたデータ·フォーマット、通信プロトコル、またはデバイスインターフェイスを共有している場合に起こる。 これは基本的に外部ツールやデバイスへの通信に関連している。
制御結合(Control coupling)
あるモジュールに何をすべきかについての情報(例えば、処理を制御するためのフラグ)を渡すことで、別のモジュール処理の流れを制御する。
スタンプ結合(Stamp coupling)
複数のモジュールが複合データ構造を共有し、その一部のみを使用する(例えば、全レコードの中の1つのフィールドを必要とする関数に全レコードのデータの構造体を渡す)。異なる部分も使用可能。これは、モジュールが必要としないフィールドが変更されることにより、モジュールのレコードを読み取る方法を変更することにつながる可能性がある。
データ結合(Data coupling)
モジュールを介してデータを共有する場合、例えば、引数である。 各データは基本部分であり、これらは単純なデータの受け渡しのみを行う(例えば、数値を渡してその平方根を返す)。
メッセージ結合(Message coupling)「低」
最も結合度が低い結合の種類である。(引数のない)メソッドの呼び出し。メッセージパッシング。
凝集度??
機能を実行するためにどのくらいの関連責任とアイデアが団結しているかどうかを示す程度です。
凝集度が高いプログラムを容易に理解することができますので、メンテナンス性が高くなります。
凝集度が低いクラスの問題
理解するのが難しい
別に再利用が難しい
メンテナンスするのが難しい
他のクラスの変化に敏感である。
凝集度の程度 【wiki参考】
偶発的凝集(Coincidental Cohesion)「最悪」
適当(無作為)に集められたものがモジュールとなっている。モジュール内の各部分には特に関連性はない(例えば、よく使われる関数を集めたモジュールなど)。
論理的凝集(Logical Cohesion)
論理的に似たようなことをするものを集めたモジュール(例えば、全ての入出力ルーチンを集めたモジュールなど)。
時間的凝集(Temporal Cohesion)
動作させたときにモジュール内の各部分が時間的に近く動作する(例えば、ある例外を受けたときに動作するルーチンとして、ファイルをクローズするルーチン、エラーログを作成するルーチン、ユーザーに通知するルーチンなどを集めたモジュール)。
手続き的凝集(Procedural Cohesion)
ある種の処理を行うときに動作する部分を集めたモジュール(例えば、ファイルのパーミッションをチェックするルーチンとファイルをオープンするルーチンなど)。
通信的凝集(Communicational Cohesion)
同じデータを扱う部分を集めたモジュール(例えば、同種のレコードの情報を操作するルーチンを集めたモジュールなど)。
逐次的凝集(Sequential Cohesion)
ある部分の出力が別の部分の入力となるような部分を集めたモジュール(例えば、全体としてあるファイルを読み込んで処理をするモジュール)。
機能的凝集(Functional Cohesion)「最善」
単一のうまく定義されたタスクを実現するモジュール(例えば、角度のサインを計算するモジュール)
メンテナンス性が高いソフトウェアは??
メンテナンス性が高いソフトウェアは、
プログラムの各要素が結合度は低く、凝集度は高く設定する必要があります。