Categories
ドメイン駆動設計

凝集度

概要

ソフトウェア開発における凝集度(Cohesion)は、モジュールやコンポーネント内の要素(クラス、関数、メソッドなど)が一緒に働いて協力し、同じ目的や責任を持つ度合いを示す概念です。

高い凝集度を持つモジュールやコンポーネントは、特定の機能や責任に集中し、その範囲内で一貫した目的を達成します。これにより、ソフトウェアの保守性、拡張性、再利用性が向上し、コードの理解や変更が容易になります。

一般的に、ソフトウェア開発における凝集度は、以下のようなレベルがあります:

  1. 高い凝集度(High Cohesion):モジュール内の要素が強く関連しており、同じ目的や責任を共有しています。モジュールは独立して機能し、他のモジュールへの依存が最小限です。変更の影響範囲が限定され、再利用性が高まります。
  2. 中程度の凝集度(Medium Cohesion):モジュール内の要素は一部関連していますが、さまざまなタスクや機能を実行する可能性があります。モジュールが複数の責任を持つ場合でも、関連する機能をグループ化し、コードの可読性を向上させることが重要です。
  3. 低い凝集度(Low Cohesion):モジュール内の要素が関連性を持っていないか、ばらばらな責任を持っている場合です。モジュールの目的が明確ではなく、変更が互いに干渉しやすくなります。この場合、モジュールの分割や再設計が必要になることがあります。

ソフトウェア開発における高い凝集度は、保守性や品質の向上、バグの発生リスクの低減など、さまざまな利点をもたらします。そのため、凝集度の考え方は、ソフトウェアの設計やモジュールの構造において重要な指標として活用されています。

コード例

#include <iostream>
#include <cmath>

class Circle {
private:
    double radius;

public:
    Circle(double r) : radius(r) {}

    double calculateArea() const {
        double area = M_PI * radius * radius;
        return area;
    }

    double calculateCircumference() const {
        double circumference = 2 * M_PI * radius;
        return circumference;
    }
};

int main() {
    double radius = 5.0;
    Circle circle(radius);
    double area = circle.calculateArea();
    double circumference = circle.calculateCircumference();
    std::cout << "半径 " << radius << " の円の面積: " << area << std::endl;
    std::cout << "半径 " << radius << " の円の円周: " << circumference << std::endl;

    return 0;
}

このC++のコードでは、Circleクラスが定義されています。このクラスは円の情報と計算メソッドを持ちます。calculateAreaメソッドは円の面積を計算し、calculateCircumferenceメソッドは円の円周を計算します。それぞれのメソッド内では、円周率 M_PI を使用して計算を行っています。

main関数では、半径を指定してCircleクラスのインスタンスを作成し、面積と円周を計算して出力しています。

このコードでは、関連するデータと処理がCircleクラスにカプセル化されており、高い凝集度を持っています。クラスのメンバ関数が特定の責任を持ち、一貫した目的を果たしています。変更が発生した場合にも、関連するクラス内のメソッドのみに影響を与えることができます。

参考資料

https://little-hand-s.notion.site/10-d85b38b1846048cea37a015a52636d53