1. 序章

凝集度と結合度は、モジュラーソフトウェアシステムを設計する際の一般的な概念です。 1960年代後半にLarryConstantineによって開発された、ソフトウェア設計からソフトウェアメトリクスに至るまでの分野で基礎となることが証明されています。 その後、それらは標準的な用語になりました。

このチュートリアルでは、凝集度と結合度、およびそれらが互いにどのように相関するかを学習します。

2. 凝集

凝集度は、モジュール内の要素が一緒に属する度合いです。モジュールは、クラス、パッケージ、またはマイクロサービスである可能性があります。 簡単に言えば、「一緒に変化し、一緒にとどまるコード」を意味します。

凝集度の高いモジュールには、相互に密接に関連し、目的が一致する要素が含まれています。 たとえば、 User クラス内のすべてのメソッドは、ユーザーの動作を表す必要があります。

関連のない要素が含まれている場合、モジュールの凝集度は低いと言われます。たとえば、電子メールアドレスの検証方法に関するメソッドを含むUserクラス。 User クラスは、ユーザーの電子メールアドレスの保存を担当できますが、検証や電子メールの送信は担当できません。

これは、Emailのような他のクラスに属している必要があります。

ご覧のとおり、結束の概念は、クラスが1つの責任のみを持つべきであると述べている単一責任原則(SRP、 SOLID原則の1つ)と密接に関連しています。 SRPに続くモジュールは、高い凝集度を持っている可能性があります。

2.1. 高凝集度の利点

明確に定義された単一の目的を持つモジュールは、理解しやすく、はるかに読みやすいです。 そのようなモジュールの名前はそれらの目的を明確に示しており、そのようなモジュールはまさにそれを行います。 これは、読者がモジュール内のすべての行を読むことなく、モジュールが何をしているかについての直感を構築するのに役立ちます。 また、そのようなモジュールのコードを読んでいる間、驚きはありません。

たとえば、 User クラスに電子メールアドレスを検証するためのコードが含まれていると、読者を混乱させる可能性があります。

関連するすべてのコードがモジュール内にあるため、コードの変更が簡単です。 たとえば、開発者がユーザーの動作を変更する必要がある場合、 User クラスにジャンプして、1つのクラスですべての変更を行うことができます。 これにより、影響範囲が制限されます。 これを、ユーザーの動作が複数のクラスに分散していて、目的の変更を実現するためにそれぞれを変更する必要がある設計と比較してください。

コードのテストが簡単です。 このようなモジュールは、その目的のために他のモジュールに依存しないため、単体テストが容易です。 また、変更が1つのモジュールに制限されている場合は、変更を簡単に構築して展開できます。

このようなモジュールを変更すると、バグが発生しにくくなります。 モジュール間で変更を加える場合は、間違いを犯しやすくなります。

最後に、それらは再利用可能です。 このようなモジュールは単一責任を実行するため、そのような必要がある場合はいつでも使用される傾向があります。

全体として、非常にまとまりのあるモジュールは、ソフトウェア設計の品質の向上を反映しています。したがって、主な目的に直接関係しないモジュール内の要素を探します。 それらを目的により適した他のモジュールに移動するか、新しいモジュールを作成します。

3. カップリング

カップリングは、ソフトウェアモジュール間の相互依存の度合いです。モジュールは、クラス、パッケージ、またはマイクロサービスの場合もあります。 事実上、結合とは、あるものを変更するために必要なものを別のものに変更する方法に関するものです。

2つのモジュールは、密接に接続されている場合、高結合(または密結合)になります。 たとえば、相互の参照を格納し、相互のメソッドを呼び出す2つの具象クラス。 下の図に示すように、CustomerOrderは互いに緊密に結合されています。 Customer は顧客からのすべての注文のリストを保存し、OrderCustomerオブジェクトへの参照を保存します。

顧客が新しい注文をするたびに、顧客内にある注文リストにそれを追加する必要があります。 これは不要な依存関係のようです。 また、 Order は顧客IDのみを知っている必要があり、Customerオブジェクトへの参照が必要です。 これらの変更を行うことで、2つのクラスを緩く結合させることができます。

それらの間の結合度が低いモジュールは、ほとんど互いに独立して動作します。

3.1. 低結合の利点

緩く結合されたモジュールは、開発と保守が容易です。 それらは互いに独立しているため、並行して開発およびテストできます。 また、相互に影響を与えることなく変更および更新できます。 このようなモジュールを独自に構築してデプロイできるため、デプロイ時間を大幅に短縮できます。

密結合モジュールは変更が困難です。開発者は、複数のモジュールとそれらが互いにどのように関連しているかを理解する必要があります。 すべてのモジュールに一貫して変更を加える際には注意が必要です。 これにより、エラーが発生しやすくなります。 また、変更された各モジュールをビルド、テスト、および展開する必要があり、開発作業がさらに増加します。

密結合モジュールもテストが困難です。単一モジュールの単体テストは、他のモジュールに大きく依存するため困難です。 モジュールを個別に単体テストできるように、他のモジュールへの呼び出しをモックすることに多大な労力を費やす必要があります。

統合テストも設定が困難です。 1つのモジュールを変更するとテストが失敗する可能性があるため、全体的にテストは脆弱です。 このようなモジュールのデバッグも、すべての依存モジュールを実行する必要があるため、複雑です。

密結合されたモジュールは、再利用される可能性が低くなります。 このようなモジュールは、それ自体では有用なことを何も実行しません。 したがって、他の誰かが再利用する目的に合うことはめったにありません。 また、他の依存モジュールを一緒に取り込むため、依存関係としてプルすることは困難です。

全体的に緩い結合は、ソフトウェア設計の高品質を反映しています。 したがって、可能な限り独立したモジュールの設計を目指す必要があります。

4. 凝集力対。 カップリング

凝集度と結合度は相互に関連しています。 それぞれが他のレベルに影響を与える可能性があります。

高い凝集度は、緩い結合と相関します。 要素が互いに密接に関連し、単一の目的を果たすモジュールは、控えめに相互作用し、他のモジュールに依存します。 したがって、他のモジュールとの結合が緩くなります。

同様に、密結合は凝集度が低いことを示している可能性があります。 2つのモジュールに要素が分散しているため、モジュールは相互に大きく依存している可能性があります。 したがって、凝集度が低くなります。

凝集度と結合度の簡単な比較表を次に示します。

5. 結論

このチュートリアルでは、凝集度と結合度、およびそれらが互いにどのように相関するかを学習しました。