UMLでの依存と集約の違い

UML(Unified Modeling Language)における依存(Dependency)と集約(Aggregation)の違いを説明します。

依存(Dependency)

依存とは

依存は、2つの要素間の関係を表すUMLの関係の一つです。ある要素が他の要素に依存しているときに使用されます。依存は一方的な関係であり、依存する要素が変更された場合、依存される要素にも影響を及ぼす可能性があります。依存関係は、通常、1つの要素が別の要素を使用する場合や、ある要素が別の要素にメッセージを送信する場合に使用されます。

例えば、クラスAがクラスBを使用している場合、クラスAはクラスBに依存しています。この依存関係は、クラスAがクラスBのメソッドを呼び出したり、クラスBのオブジェクトを作成したりする場合に現れるでしょう。

依存のサンプル

// 依存の例
public class ClassA
{
    public void MethodA()
    {
        Console.WriteLine("Method A");
    }
}

public class ClassB
{
    private ClassA classA;

    public ClassB(ClassA a)
    {
        classA = a;
    }

    public void MethodB()
    {
        Console.WriteLine("Method B");
        classA.MethodA(); // ClassAに依存している
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        ClassA a = new ClassA();
        ClassB b = new ClassB(a);
        b.MethodB();
    }
}

上記のコードでは、ClassBがClassAに依存しています。ClassBのインスタンスを作成する際に、ClassAのインスタンスを引数として渡しています。そして、ClassBのMethodBメソッド内で、ClassAのMethodAメソッドを呼び出しています

例えば、車とエンジンの関係を考えてみましょう。車はエンジンを持っており、エンジンは車に搭載されています。この場合、車はエンジンを含んでいると言えます。車が破壊されてもエンジンはまだ存在し続けることができます。

集約

集約とは

集約(Aggregation):は、クラスやオブジェクト間の関係を表すUMLの関係の一つです。集約は、パートと全体の関係を表現します。つまり、一つのオブジェクト(全体)が他のオブジェクト(パート)を含んでいることを示します。集約の特徴は、パートと全体が独立して存在することです。パートは全体から分離して存在できますが、パートが破棄されても全体は存在し続けます。

集約のサンプル

集約は通常、コンポジション(Composition)とも呼ばれ、強い関連性を示す場合に使用されます。つまり、パートと全体のライフサイクルが密接に結びついており、全体が破棄された場合にはパートも破棄されることが想定されます。

// 集約の例
public class Engine
{
    public void Start()
    {
        Console.WriteLine("Engine started");
    }
}

public class Car
{
    private Engine engine;

    public Car()
    {
        engine = new Engine(); // Engineを集約している
    }

    public void StartCar()
    {
        Console.WriteLine("Car started");
        engine.Start(); // Engineを集約している
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        Car car = new Car();
        car.StartCar();
    }
}

上記のコードでは、CarがEngineを集約しています。Carのインスタンスを作成するときに、Carのコンストラクタ内でEngineのインスタンスを作成しています。そして、CarのStartCarメソッド内で、EngineのStartメソッドを呼び出しています。

これらの例は、依存と集約の基本的な概念を示しています。ただし、実際のプログラムでは、依存性注入(Dependency Injection)やデザインパターンなどの考慮が必要な場合があります

まとめ

以上が依存(Dependency)と集約(Aggregation)の違いです。依存は一方的な関係であり、要素間の関連性を示します。一方、集約はパートと全体の関係を示し、パートが全体から独立して存在できる関係です。