C#におけるコンポジション(構成)とアグリゲーション(集約)の違いをコード例で解説
C#のオブジェクト指向設計では、クラス同士の関係を正しくモデル化することが重要です。その代表的な関係として「コンポジション(構成)」と「アグリゲーション(集約)」があります。どちらも「has-a(〜を持つ)」関係を表しますが、子オブジェクトのライフサイクルへの依存度が大きく異なります。
コンポジション(Composition:構成)とは
コンポジションでは、親オブジェクトが削除されると、子オブジェクトもその存在を失います。つまり、子オブジェクトのライフサイクルは完全に親に依存します。コンポジションはアグリゲーションの特殊な形であり、「part-of(部分と全体)」の関係を表します。
分かりやすい例として、「車はエンジンを持つ」という関係が挙げられます。車が破壊・廃棄されれば、そのエンジンも一緒に破壊されるというイメージです。
コード例
public class Engine {
. . .
}
public class Car {
// Car の内部で Engine を生成するため、Car と運命を共にする
private Engine eng = new Engine();
. . .
}
アグリゲーション(Aggregation:集約)とは
アグリゲーションは、C#におけるオブジェクト間の方向性のある関係です。オブジェクト同士が関連付けられる点はコンポジションと共通していますが、親オブジェクトが削除されても子オブジェクトは独立して存在し続けられる点が大きく異なります。
典型的な例として「従業員(Employee)と住所(Address)」の関係があります。1人の従業員は1つの部署に所属しますが、1つの部署には複数の従業員が属することもあります。ここでは、Employee クラスと Address クラスを使った例を見てみましょう。
コード例
public class Address {
. . .
}
public class Employee {
private Address addr;
public Employee(Address addr) {
this.addr = addr;
}
. . .
}
両者の違いのまとめ
コンポジションは、親が子を内部で生成し、親の削除とともに子も消える強い結びつきです。一方、アグリゲーションは、外部で生成したオブジェクトをコンストラクタ経由で受け取る緩い結びつきであり、親がなくなっても子は独立して存続できます。設計の際には、オブジェクトの寿命を共有すべきかどうかを基準に、両者を使い分けるとよいでしょう。
-
Microsoft EdgeとGoogle Chrome徹底比較!どちらのブラウザを選ぶべきか
Google Chromeはブラウザ界の王者として、PCでもモバイルデバイスでも圧倒的な使用率を誇っています。一方、Microsoft EdgeはWindows搭載デバイスに標準でインストールされているため、多くのマシンですぐに使える状態になっています。本記事では、両ブラウザの主な違いを詳しく検証し、どちらを選ぶべきか判断するための情報をお届けします。 総合評価 Microsoft Edge Windows搭載デバイスに標準でインストール済み。 Internet Explorerよりも高速で改善されたレンダリング性能。 Windowsアプリケーションとしても、Webアプリの表示時にも
-
Pythonのnamedtuple(ネームドタプル)とは?使い方をサンプルコード付きで解説
Pythonのnamedtuple(ネームドタプル)とは namedtupleは、Pythonの標準ライブラリ「collections」モジュールに含まれるクラスの一つです。辞書型オブジェクトと同様にキーと値を持ちますが、タプルの特性も併せ持っているため、インデックスとキーの両方で要素にアクセスできるのが大きな特徴です。 namedtupleを使用するには、まずcollectionsモジュールをインポートする必要があります。 import collections 以下では、namedtupleクラスの主な機能と使い方を詳しく見ていきましょう。 namedtupleの要素へのアクセス方法 n