“は&” vs“持っています&” : どっちがいいですか?
-
06-07-2019 - |
質問
ポートフォリオA→ファンド1
ポートフォリオA→ファンド2
ポートフォリオA→ファンド3
is / hasを使用せずに文章を組み立てることはできませんでした。ただし、1& 2、
1)には:
がありますclass PortfolioA
{
List<Fund> obj;
}
2)は:
class PortfolioA : List<Fund>
{
}
拡張性、使いやすさの点でどちらが良いと思いますか?わずかな構文上の変更はありますが、どちらの方法でも資金にアクセスできます。
解決
この場合、HAS-Aの方が良いと言う他の人々に投票します。コメントをお願いします:
ポートフォリオが単なる 少数の資金のコレクション 独自の属性 TotalPortfolioなど、それを行います 基本的に「is-a」になりませんか?
そうは思いません。 Portfolio
IS-A List&lt; Fund&gt;
と言う場合、ポートフォリオの他のプロパティはどうですか?もちろん、このクラスにプロパティを追加できますが、それらのプロパティをリストのプロパティとしてモデル化するのは正確ですか?それは基本的にあなたがしていることだからです。
また、ポートフォリオが複数の List&lt; Fund&gt;
をサポートする必要がある場合はどうなりますか?たとえば、現在の投資残高を表示するリストと、新しい寄付がどのように投資されているかを表示するリストがあります。そして、いつ資金が打ち切られ、新しい資金のセットがそれらを成功させるために使用されますか?履歴情報は、現在の資金配分と同様に追跡するのに役立ちます。
ポイントは、これらのプロパティはすべてポートフォリオのプロパティである可能性はありますが、リストのプロパティではないことです。
他のヒント
「常に」構成や継承を優先したり、その逆を行わないでください。それらは異なる意味論(意味)を持っています。意味を注意深く見てから決定します-一方が他方よりも「簡単」であるかどうかは関係ありません、寿命のために、セマンティクスを正しく取得することが重要です
覚えておいてください:is-a =タイプ、has-a =封じ込め
したがって、この場合、ポートフォリオは論理的には資金の集まりです。ポートフォリオ自体はファンドのタイプではありませんので、構成は正しい関係です
編集:私はもともと質問を読み違えましたが、答えはまだ同じです。ポートフォリオはリストの一種ではなく、独自のプロパティを持つ個別のエンティティです。たとえば、ポートフォリオは初期投資コスト、合計現在価値、長期にわたる価値の履歴などを含む金融商品の集合体であり、リストはオブジェクトの単純なコレクションです。ポートフォリオは、最も抽象的な意味でのみの「リストのタイプ」です。
編集2:ポートフォリオの定義について考えます-それは例外なく、物の集まりとして特徴付けられます。アーティストのポートフォリオはアートワークのコレクション、WebデザイナーのポートフォリオはWebサイトのコレクション、投資家のポートフォリオは所有するすべての金融商品などで構成されています。したがって、ポートフォリオを表すリスト(または何らかの種類)が必要であることは明らかですが、それはポートフォリオがリストの一種であることを意味するものではありません!
PortfolioにListを継承させることにしたと仮定します。これは、ポートフォリオに株式、債券、または貴金属を追加するまで機能しますが、その後誤った継承が機能しなくなります。または、Bill Gatesのポートフォリオをモデル化し、Listがメモリ不足になることを見つけるように求められたと仮定します;-)より現実的には、将来のリファクタリングの後、Assetのような基本クラスから継承する必要があることがわかりますが、 Listから既に継承しているため、継承できません。
概要:概念を表すために選択したデータ構造と、概念自体のセマンティクス(型階層)を区別します。
1つ目は、可能な場合は継承よりも合成を優先する必要があるためです。
ビジネスがポートフォリオをファンドのグループ(およびグループのみ)として定義するかどうかによって異なります。 「プロパティ」など、他のオブジェクトを含む可能性がほとんどない場合は、オプション1に進みます。ファンドのグループとポートフォリオの概念の間に強いリンクがある場合は、オプション2に進みます。
拡張性と有用性1に関しては、2に比べてわずかに利点があります。どちらか一方を常に優先するという概念には、私は本当に同意しません。それは実際の実際の生活の概念が何であるかに本当に依存しています。いつでもリファクタリングできます。
^ alwaysのほとんどの場合。公開されている場合は、明らかに公開されていません。
オプション(1)-構成を使用します。これは、最終的にはファンドではなくポートフォリオに固有の属性を持つ可能性があるためです。
最初のもの。これは、&quot;からなる&quot; であるためです。 =&gt;構成
一般的な意見と思われるものとは異なります。この場合、ポートフォリオは資金の集まりに過ぎないと思います...継承を使用することにより、次のように複数のコンストラクターの使用を許可します
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();
}
またはそのようなもの
IS-A関係シップは継承を表し、 HAS-A関係シップは構成を表します。上記のシナリオでは、PortfolioAにはリストがあり、リストタイプではないため、構成が優先されます。ポートフォリオAがリストの一種である場合に継承が使用されますが、ここではそうではありません。したがって、このシナリオでは、構成を優先する必要があります。