Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ セグメンテーションとアグリゲーション | カプセル化概要
C++オブジェクト指向プログラミング

セグメンテーションとアグリゲーション

メニューを表示するにはスワイプしてください

保守性と柔軟性の高いソフトウェアを作成する際、特にオブジェクト指向プログラミングにおいては、多くの要素を考慮する必要があります。**コンポジション(合成)アグリゲーション(集約)**は、単純なコンポーネントから複雑なシステムを構築するための基本的な概念であり、カプセル化パラダイムの一部です。

コンポジション

コンポジションは、classが他のobjectsclassesをメンバー変数として保持する設計手法です。これらのメンバーは、包含するclassにとって重要な構成要素であり、強い所有関係を持ちます。包含するobjectが破棄されると、その構成要素も同時に破棄されます。例:

Car.h

Car.h

Engine.h

Engine.h

123456789101112
#include "Engine.h" class Car { public: void Start() { engine.Start(); // Start the engine std::cout << "Car started" << std::endl; } private: Engine engine; // Engine object composition };

Car クラスは Engine オブジェクトを構成要素として持つ。Car オブジェクトが生成されると、その構成の一部として自動的に Engine インスタンスが作成される。

集約

集約 は、object が他の classobject を含む、もう一つの classes 構成の形態。ただし、含まれるインスタンスは構成よりも弱い関係性を持つ。集約では、含まれるメンバー classes独立して存在可能であり、複数の classes で共有される場合もある。

Car.h

Car.h

Engine.h

Engine.h

123456789101112131415
#include "Engine.h" class Car { public: Car(Engine* engine) : engine(engine) {} void Start() { engine->Start(); // Start the engine std::cout << "Car started" << std::endl; } private: Engine* engine; // Engine object aggregation };

Car クラスはポインタを使って Engine オブジェクトを集約。Car クラスは Engine オブジェクトを所有せず、単に参照を保持。これにより、Engine インスタンスは Car オブジェクトとは独立して存在でき、必要に応じて複数のインスタンス間で共有可能。

コンポジションと集約の選択

ソフトウェアシステムを設計する際、クラスやオブジェクト間の関係性に基づき、コンポジションと集約のどちらを使用するか慎重に検討することが重要。

Car クラスと Engine クラスの関係においては、コンポジションの使用がより適切。各車両は通常独自のエンジンを持ち、エンジンは車の不可欠な一部。さらに、Engine が複数の車 objects で共有・再利用されることを防ぎ、この点も理にかなっている。

question mark

次のうち、集約(aggregation)の例はどれですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 3.  5

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 3.  5
some-alt