概要
集約(Aggregation)は、オブジェクト指向プログラミングにおける関連性の一種です。集約は、複数のオブジェクトのグループを形成し、そのグループ全体を単一のオブジェクトとして扱う方法を提供します。集約は、包含関係を表現するために使用されます。
集約では、次の特徴があります:
- パートと全体の関係:集約は、パート(部分オブジェクト)と全体(含むオブジェクト)との関係を表現します。パートは、全体に属しており、通常、パートは全体なしでは意味を持ちません。
- ライフサイクルの独立性:集約内のパートオブジェクトのライフサイクルは、集約自体のライフサイクルに依存しません。つまり、集約が破棄されても、パートオブジェクトは独立して存在することができます。
- 共有性:集約内のパートオブジェクトは、他のオブジェクトと共有することができます。複数の全体オブジェクトが同じパートオブジェクトを共有することができます。
例えば、自動車を考えてみましょう。自動車はエンジン、タイヤ、ハンドルなどのパートで構成されています。これらのパートは自動車の集約であり、自動車自体が全体オブジェクトです。自動車が破棄されても、エンジンやタイヤは独立して存在できます。また、同じエンジンを共有する複数の自動車が存在することもあります。
集約は、オブジェクト間の関連性を表現するための重要な概念であり、クラスやコンポーネントの設計において広く使用されています。集約を使用することで、オブジェクト間の構造と関係を明確にすることができ、柔軟性と再利用性を向上させることができます。
コード例
以下は、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
クラスを集約していることがわかります。自動車はエンジンの集合体であり、エンジンは自動車と独立して存在することができます。