8

ポートフォリオA → ファンド1

ポートフォリオA → ファンド2

ポートフォリオA → ファンド3

is/has を使わずに文章を構成することはできませんでした。しかし、1と2の間では、

1) 次のものがあります。

class PortfolioA
{
    List<Fund> obj;
}

2) は:

class PortfolioA : List<Fund>
{

}

拡張性、使い勝手の点でどちらが優れていると思いますか?多少の構文変更はありますが、どちらの方法でも資金にアクセスできます。

4

8 に答える 8

17

この場合、HAS-Aの方が優れていると言う他の人々と一緒に投票します. あなたはコメントで尋ねます:

ポートフォリオは資金の集まりであり、TotalPortfolio などの独自の属性がいくつかあると私が言うとき、それは基本的に「is-a」にはなりませんか?

私はそうは思わない。PortfolioIS-Aと言う場合List<Fund>、ポートフォリオの他のプロパティはどうですか? もちろん、このクラスにプロパティを追加することはできますが、それらのプロパティをリストのプロパティとしてモデル化することは正確でしょうか? それは基本的にあなたがしていることだからです。

また、ポートフォリオが複数の をサポートする必要がある場合はどうなりList<Fund>ますか? たとえば、現在の投資残高を示す 1 つのリストと、新しい寄付がどのように投資されているかを示す別のリストがあるとします。また、ファンドが廃止され、その後を引き継ぐために新しい一連のファンドが使用される場合はどうなるでしょうか? 履歴情報は、現在の資金配分と同様に追跡するのに役立ちます。

ポイントは、ポートフォリオのプロパティである可能性がありますが、これらすべてのプロパティが正しくリストのプロパティではないということです。

于 2008-11-04T21:03:21.843 に答える
8

合成や継承を「常に」支持するわけではなく、その逆もありません。それらは異なるセマンティクス (意味) を持っています。意味を注意深く見てから決定してください - 一方が他方より「簡単」かどうかは問題ではありません。長寿のためには、セマンティクスを正しく理解することが重要です

覚えておいてください: is-a = タイプ、has-a = 包含

したがって、この場合、ポートフォリオは論理的には資金の集まりです。ポートフォリオ自体はファンドの一種ではないため、構成は正しい関係です

編集:私はもともと質問を読み違えましたが、答えは同じです。ポートフォリオはリストの一種ではなく、独自のプロパティを持つ個別のエンティティです。たとえば、ポートフォリオは、初期投資コスト、現在の合計価値、時間の経過に伴う価値の履歴などを含む金融商品の集合体ですが、リストはオブジェクトの単純なコレクションです。ポートフォリオは、最も抽象的な意味でのみ「リストのタイプ」です。

編集 2: ポートフォリオの定義について考えてみてください。ポートフォリオは、例外なく、物の集まりとして特徴付けられます。アーティストのポートフォリオはアートワークのコレクションであり、Web デザイナーのポートフォリオは Web サイトのコレクションであり、投資家のポートフォリオは所有するすべての金融商品で構成されています。明らかに、ポートフォリオを表すリスト (または何らかの種類) が必要ですが、それはポートフォリオがリストの一種であることを意味するものではありません!

Portfolio に List から継承させることにしたとします。これは、株式、債券、または貴金属をポートフォリオに追加するまで機能し、その後突然、誤った継承が機能しなくなります。あるいは、たとえばビル・ゲイツのポートフォリオをモデル化するように求められ、List がメモリ不足になることがわかったとします ;-) より現実的には、将来のリファクタリングの後、おそらく Asset のような基本クラスから継承する必要があることに気付くでしょう。 List から既に継承している場合は継承できません。

まとめ: 概念を表すために選択するデータ構造と、概念自体のセマンティクス (型階層) を区別します。

于 2008-11-04T20:49:07.597 に答える
7

最初のものは、可能な場合は継承よりも構成を優先するようにする必要があるためです。

于 2008-11-04T20:46:14.717 に答える
4

ビジネスがポートフォリオをファンドのグループ (およびグループのみ) として定義しているかどうかによって異なります。「財産」などの他のオブジェクトが含まれている可能性がほとんどない場合は、オプション 1 を使用します。ファンドのグループとポートフォリオの概念との間に強い関連がある場合は、オプション 2 を使用します。

拡張性と有用性に関しては、1 は 2 よりもわずかに有利です。常にどちらかを優先すべきだという考え方にはまったく同意できません。それは、実際の現実の概念が何であるかに大きく依存します。いつでも^リファクタリングできることを覚えておいてください。

^ always のほとんどの場合。それが公に公開されている場合、明らかにそうではありません。

于 2008-11-04T20:53:44.903 に答える
2

最終的にはファンドではなくポートフォリオに固有の属性を持つ可能性があるため、オプション (1) の構成を使用します。

于 2008-11-04T20:46:50.517 に答える
2

最初のものは、「consists of」であるためです。=>構成

于 2008-11-04T20:48:29.033 に答える
1

一般的な意見と思われるものとは異なります。この場合、ポートフォリオは資金の集まりにすぎないと思います...継承を使用することで、次のように複数のコンストラクタを使用できます。

public Portfolio(CLient client) {};
public Portfolio(Branch branch, bool Active, decimal valueThreshold)
{
    // code to populate collection with all active portfolios at the specified branch whose total vlaue exceeds specified threshold 
}

およびインデクサーは次のようになります。

public Fund this[int fundId] { get { return this.fundList[fundId]; } }

などなど

タイプ Portfolio の変数を、関連する構文を使用して資金のコレクションとして扱うことができるようにしたい場合は、これがより良いアプローチです。

Portfolio BobsPortfolio = new Portfolio(Bob); 

foreach (Fund fund in BobsPortfolio)
{
    fund.SendStatement();
}

またはそのようなもの

于 2008-11-04T21:58:59.513 に答える
0

IS-A 関係は継承を表し、HAS-A 関係は合成を表します。上記のシナリオでは、PortfolioA にはリストがあり、リスト タイプではないため、構成を優先します。ポートフォリオ A がリストのタイプである場合に継承が使用されますが、ここではそうではありません。したがって、このシナリオでは、コンポジションを優先する必要があります。

于 2017-08-08T08:48:20.300 に答える