Categories
ドメイン駆動設計

集約

概要

 集約(Aggregation)は、オブジェクト指向プログラミングにおける関連性の一種です。集約は、複数のオブジェクトのグループを形成し、そのグループ全体を単一のオブジェクトとして扱う方法を提供します。集約は、包含関係を表現するために使用されます。

集約では、次の特徴があります:

  1. パートと全体の関係:集約は、パート(部分オブジェクト)と全体(含むオブジェクト)との関係を表現します。パートは、全体に属しており、通常、パートは全体なしでは意味を持ちません。
  2. ライフサイクルの独立性:集約内のパートオブジェクトのライフサイクルは、集約自体のライフサイクルに依存しません。つまり、集約が破棄されても、パートオブジェクトは独立して存在することができます。
  3. 共有性:集約内のパートオブジェクトは、他のオブジェクトと共有することができます。複数の全体オブジェクトが同じパートオブジェクトを共有することができます。

例えば、自動車を考えてみましょう。自動車はエンジン、タイヤ、ハンドルなどのパートで構成されています。これらのパートは自動車の集約であり、自動車自体が全体オブジェクトです。自動車が破棄されても、エンジンやタイヤは独立して存在できます。また、同じエンジンを共有する複数の自動車が存在することもあります。

集約は、オブジェクト間の関連性を表現するための重要な概念であり、クラスやコンポーネントの設計において広く使用されています。集約を使用することで、オブジェクト間の構造と関係を明確にすることができ、柔軟性と再利用性を向上させることができます。

コード例

以下は、C++での集約(Aggregation)のコード例です。自動車を表す Car クラスと、その中に含まれるエンジンを表す Engine クラスを考えます。

#include <iostream>
#include <string>
#include <vector>

class Engine {
private:
    std::string model;

public:
    Engine(const std::string& model) : model(model) {}

    std::string getModel() const {
        return model;
    }
};

class Car {
private:
    std::string brand;
    std::vector<Engine*> engines;

public:
    Car(const std::string& brand) : brand(brand) {}

    void addEngine(Engine* engine) {
        engines.push_back(engine);
    }

    void printEngines() const {
        std::cout << "Engines in the car:" << std::endl;
        for (const auto& engine : engines) {
            std::cout << "- " << engine->getModel() << std::endl;
        }
    }
};

int main() {
    Engine engine1("V6");
    Engine engine2("V8");

    Car car("Toyota");
    car.addEngine(&engine1);
    car.addEngine(&engine2);

    car.printEngines();

    return 0;
}

このコードでは、Engine クラスはエンジンを表し、Car クラスは自動車を表します。Car クラスは Engine オブジェクトへのポインタを保持するため、エンジンの集約を表現しています。

Engine クラスは単純なモデル名を持ち、Car クラスはブランド名とエンジンの集約を持ちます。Car クラスには addEngine メソッドがあり、エンジンを追加するために使用されます。printEngines メソッドは、自動車に含まれるエンジンのモデルを表示します。

main 関数では、Engine オブジェクトを作成し、それらを Car オブジェクトに追加しています。そして、Car オブジェクトの printEngines メソッドを呼び出して、自動車に含まれるエンジンの情報を表示しています。

この例では、Car クラスが Engine クラスを集約していることがわかります。自動車はエンジンの集合体であり、エンジンは自動車と独立して存在することができます。

参考資料

https://www.notion.so/91dec09e1416416bb87594d79e06f592