2008-11-04 8 views
8

Portfolio A - Fonds> 1"Ist ein" vs "Has a": welcher ist besser?

Portfolio A -> Fund 2

Portfolio A -> Fonds 3

ich meinen Satz ohne nicht verwendet, wird ihr/Rahmen könnte. Aber zwischen 1 & 2,

1) ein:

class PortfolioA 
{ 
    List<Fund> obj; 
} 

2) ist a:

class PortfolioA : List<Fund> 
{ 

} 

die man denken Sie, ist besser vom Punkt der Erweiterbarkeit, Benutzerfreundlichkeit? Ich kann immer noch auf meine Mittel zugreifen, wenn auch mit einem kleinen syntaktischen Wechsel.

+1

Siehe auch [prefer-composition-over-vererbung?] (Http://stackoverflow.com/questions/49002/prefer-composition-over-herheritance?rq=1) – nawfal

Antwort

15

Ich stimme mit den anderen Leuten, die sagen, HAS-A ist in diesem Fall besser. Sie fragen in einem Kommentar:

, wenn ich sage, dass ein Portfolio nur eine Sammlung von Geldern ist, mit ein paar Attribute der eigenen wie TotalPortfolio usw., bedeutet das grundsätzlich nicht geworden ein „is-a "?

Ich glaube nicht. Wenn Sie sagen, Portfolio IS-A List<Fund>, was ist mit anderen Eigenschaften des Portfolios? Natürlich können Sie dieser Klasse Eigenschaften hinzufügen, aber ist es korrekt, diese Eigenschaften als Eigenschaften der Liste zu modellieren? Denn das ist im Grunde das, was du tust.

Auch was ist, wenn ein Portfolio mehr als eine List<Fund> unterstützen muss? Zum Beispiel haben Sie vielleicht eine Liste, die das aktuelle Guthaben der Investitionen anzeigt, aber eine andere Liste, die zeigt, wie neue Beiträge investiert werden. Und was ist, wenn Fonds eingestellt werden und eine neue Reihe von Fonds verwendet wird, um ihnen zu folgen? Historische Informationen sind ebenso nützlich wie die aktuelle Fondsallokation.

Der Punkt ist, dass alle diese Eigenschaften nicht korrekt Eigenschaften einer Liste sind, obwohl sie Eigenschaften des Portfolios sein können.

+1

Absolut! Sie könnten sogar noch stärker dafür plädieren: Selbst die niedrige 'Liste' hat zusätzliche Eigenschaften (z. B. Länge), die nichts mit * einem * der Elemente zu tun haben. Daher ist "Liste " auch eine "[Liste] has-a [Fund]" -Beziehung. – jpaugh

7

Die erste, weil Sie versuchen sollten, Zusammensetzung über Vererbung zu bevorzugen, wenn Sie können.

+4

Können Sie diese Aussage rechtfertigen? – Blorgbeard

+0

Ich würde es nicht so sagen. –

+1

Er hat Recht, immer wenn du kannst. Vielleicht nicht immer, aber es ist ziemlich immer vorzuziehen, es sei denn, es ist ein Kinderspiel. Google "Extends ist böse" für weitere Informationen. –

2

Ich würde mit Option (1) - Zusammensetzung gehen, da Sie möglicherweise Attribute spezifisch für das Portfolio haben, anstatt die Mittel.

2

Die erste, weil es ist "besteht aus". => Zusammensetzung

8

nicht 'immer' die Zusammensetzung oder Vererbung oder umgekehrt bevorzugen; sie haben unterschiedliche Semantiken (Bedeutungen); schaue genau auf die Bedeutungen, dann entscheide - es ist egal, ob einer 'leichter' ist als der andere, für Langlebigkeit ist es wichtig, dass du die Semantik richtig bekommst

erinnern: is-a = type, has-a = containment

so ist in diesem Fall ein Portfolio logisch eine Sammlung von Fonds; ein Portfolio selbst ist kein Typ Fonds, so Zusammensetzung das richtige Verhältnis

EDIT ist: ich falsch verstanden ursprünglich die Frage, aber die Antwort ist immer noch die gleichen. Ein Portfolio ist kein Listentyp, sondern eine eigenständige Entität mit eigenen Eigenschaften. Ein Portfolio ist beispielsweise ein Aggregat von Finanzinstrumenten mit anfänglichen Investitionskosten, einem aktuellen Gesamtwert, einer Historie von Werten im Zeitverlauf usw., während eine Liste eine einfache Sammlung von Objekten darstellt. Ein Portfolio ist eine "Art von Liste" nur im abstraktesten Sinne.

EDIT 2: Denken Sie über die Definition von Portfolio - es wird ohne Ausnahme als eine Sammlung von Dingen charakterisiert. Das Portfolio eines Künstlers ist eine Sammlung seiner Kunstwerke, das Portfolio eines Webdesigners ist eine Sammlung seiner Websites, das Portfolio eines Investors besteht aus allen Finanzinstrumenten, die ihm gehören, und so weiter. Wir brauchen also ganz klar eine Liste (oder eine Art), um ein Portfolio zu repräsentieren, aber das bedeutet keinesfalls, dass ein Portfolio eine Art Liste ist!

Angenommen, wir entscheiden, Portfolio von List erben zu lassen. Dies funktioniert so lange, bis wir dem Portfolio eine Aktie, eine Anleihe oder ein Edelmetall hinzufügen, und plötzlich funktioniert die falsche Vererbung nicht mehr. Oder angenommen, wir werden gebeten, Bill Gates 'Portfolio zu modellieren und zu finden, dass List keinen Speicher mehr hat ;-) Realistischer werden wir nach zukünftigem Refactoring wahrscheinlich feststellen, dass wir von einer Basisklasse wie Asset übernehmen sollten, aber wenn Wir haben bereits von List geerbt, dann können wir nicht.

Zusammenfassung: Unterscheiden Sie zwischen den Datenstrukturen, die wir wählen, um ein Konzept darzustellen, und der Semantik (Typhierarchie) des Konzepts selbst.

+0

Richtig, hatte Portfolio eine Art von Fonds gewesen, wäre-a hätte Sinn gemacht. Hier ist das Portfolio eine Liste der Fonds mit einer Reihe von Eigenschaften, die für alle Fonds gelten. Ich sehe immer noch nicht, wie es nicht als ein ist-a bezeichnet werden kann. Oder ist es nur, wie Sie Ihren Satz in diesem Fall einrahmen? – aliensurfer

+0

@Prakashr: Ich habe die Frage falsch verstanden und dachte, Sie wollten Portfolio zu einer Unterklasse des Fonds machen ;-) Es wäre noch schlimmer, Portfolio zu einer Unterklasse von List zu machen, weil List eine generische Sammlung ist und ein Portfolio eine juristische Person. Portfolios haben einen Gesamtwert zur Zeit t, Listen nicht usw. –

4

Es hängt davon ab, ob das Unternehmen ein Portfolio als eine Gruppe (und nur eine Gruppe) von Fonds definiert. Wenn es sogar die entfernte Möglichkeit gibt, dass es andere Objekte enthalten könnte, sagen wir "Eigentum", dann gehen Sie zu Option 1. Gehen Sie zu Option 2, wenn es eine starke Verbindung zwischen einer Gruppe von Fonds und dem Konzept von Portfolio gibt.

Soweit Erweiterbarkeit und usefullness 1 hat den leichten Vorteil gegenüber 2. ich wirklich mit dem Konzept nicht zustimmen, dass Sie immer einen über den anderen begünstigen sollte. Es hängt wirklich davon ab, was die wirklichen realen Konzepte sind. Denken Sie daran, Sie können jederzeit umgestalten.

^Für die meisten Fälle von immer. Wenn es öffentlich ausgestellt wird, dann offensichtlich nicht.

+0

Ich stimme Rob hier zu. Ich besitze eine Anleihen und Aktien und IRAs, daher ist mein Portfolio keine Liste meiner Fonds. Ich stimme auch mit dem nicht eins über dem anderen überein. Wenn es "ein" ist, dann ist es. Wenn es "hat ein" dann tut es .. – baash05

1

Ich werde mit der scheinbar üblichen Meinung abweichen. In diesem Fall denke ich, ein Portfolio sehr wenig ist mehr als eine Sammlung von Geldern ... Durch Vererbung Sie die Verwendung von mehreren Konstrukteuren ermöglichen, wie in

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 
} 

und Indexer wie in:

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

usw. usw.

Wenn Sie Variablen des Typs Portfolio als eine Sammlung von Fonds mit der zugehörigen Syntax behandeln möchten, ist dies der bessere Ansatz.

Portfolio BobsPortfolio = new Portfolio(Bob); 

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

oder Sachen wie die

+0

Ich bezog mich auf diese Art von Zugänglichkeitsnutzen. Aber aus puristischer Perspektive klingt ein "has-a" passender. Ich stimme einer Antwort von oben zu. Im Wesentlichen ist es, wie das Geschäft (und Sie) es wahrnehmen. – aliensurfer

+0

In gewissem Sinne sind Sammlungsklassen für mich die Ausnahme vom puristischen Ansatz, denn per definitionem ist eine Sammlung von Dingen "Hat ein" Bündel von diesen Dingen ... Es ist das Wesen einer Sammlung ... –

+0

Ich würde die Linie zeichnen, wenn das Elternobjekt mehr als eine Sammlung verschiedener Klassen untergeordneter Objekte enthält ... wie wenn Sie ein Sportteam modellieren, mit einer internen Sammlung von Spielern und einer anderen internen Sammlung von geplanten Spielen und einer anderen Sammlung von Coaches, etc ... –

0

IS-A Beziehung Schiff stellt Erbschaften und HAS-A-Beziehung Schiff Zusammensetzung darstellt. Für das oben erwähnte Szenario bevorzugen wir die Zusammensetzung, da PortfolioA eine Liste hat und es sich nicht um den List-Typ handelt.Inheritances werden verwendet, wenn Portfolio A ein Listentyp ist, hier jedoch nicht. Daher sollten wir für dieses Szenario Komposition bevorzugen.