16

コード内の集約と構成の違いを完全に理解できないようです。

クライアント <.>---->BankAccount

(これは Client - BankAccount 構成クラス図のはずです)。

この例では、クライアントは銀行口座を持っています。つまり、クライアント オブジェクトが死ぬと、彼の銀行口座オブジェクトも死ぬということです。これは、 Client クラス内に BankAccount オブジェクトを持たなければならないということですか?

Class Client
{

    BankAccount acc = new BankAccount();

    public void addMoneyToBankAccount(decimal amount)
    {         
        acc.AddMoney(amount);
    }

    public decimal CheckBalance()
    {
        return acc.CheckAccountBalance();
    }

}

それで、この構成はコードですか?この例では、集計はどのようになりますか? 初心者の質問で申し訳ありませんが、コードが間違っていた場合は修正してください。前もって感謝します。

4

4 に答える 4

15

はい、あなたがしているのは、合成を呼び出すことです。集計を行いたい場合は、次のようにします。

Class Client
{

    BankAccount acc;

    public Client(BankAccount p_acc)
    {
      acc=p_acc;
    }

    public void addMoneyToBankAccount(decimal amount)
    {         
        acc.AddMoney(amount);
    }

    public decimal CheckBalance()
    {
        return acc.CheckAccountBalance();
    }

}

集計:

継承によって「is-a」が得られ、構成によって「part-of」が得られる場合、集約によって「has-a」関係が得られると主張できます。集約内では、部分の寿命は全体では管理されません。これを明確にするために、例が必要です。過去 12 か月以上、CRM システムの実装に携わってきたので、例としてその一部を使用します。

CRM システムには、顧客のデータベースと、地理的領域内のすべての住所を保持する別のデータベースがあります。この状況では、Customer が「has-a」アドレスであるため、集約は理にかなっています。Address が Customer の「一部」であると言うのは意味がありません。このように考えてみてください。顧客が存在しなくなった場合、住所はどうなるでしょうか。私はそれが存在しなくなることはないと主張します。集計は、塗りつぶされていない菱形として UML ダイアグラムに表示されます。

回答の冒頭で述べたように、これは構成と集計に関する私の見解です。コンポジションとアグリゲーションのどちらを使用するかを決定するのは難しいことではありません。オブジェクト モデリングでは、これが「一部」なのか、それとも「持っている」のか、という問題になるはずです。

于 2013-01-27T15:06:58.973 に答える
8

お客様の BankAccount コードはcomposition関係です

あなたのコードは合成のすべての特性を満たしています

-> 部分分類子 ( BankAccount) の存続期間は、分類子 ( ) 全体の存続期間に依存しClientます。

→通常、データは一方向にのみ流れます (つまり、classifier( Client) 全体から part classifier( ) へBankAccount)。


集計は、 BankAccount をメソッドの引数としてクライアントに渡すことで表すことができます

したがって、このコードは集約です

class client
{
    public bool updateAccount(BankAccount ba){....}
}

ご覧のとおり、Aggregation のすべてのプロパティを満たしています。

→独立して存在できるclient

client→分類器全体( )から部分( )へのBankAccountデータの流れ

于 2013-01-27T15:04:59.050 に答える
1

はい、あなたは正しいです。シンプルな構図です。

集計の場合、 Client クラスは BankAccount クラスの参照を保持する必要がありますが、オブジェクトの有効期間を制御するべきではありません。

class Client
{
     private readonly BankAccount _account;

     public Client(BankAccount account)
     {
         _account = account;
     }

     //...
}

Client オブジェクトが破棄された後、その中で使用されている BankAccount オブジェクトを別の Client に割り当てることができます。

于 2013-01-27T15:02:59.137 に答える