Frage "Ist ein" vs "Has a": welcher ist besser?


Portfolio A → Fonds 1

Portfolio A → Fonds 2

Portfolio A → Fonds 3

Ich konnte meinen Satz nicht einrahmen, ohne ihn zu benutzen. Aber zwischen 1 und 2,

1) hat eine:

class PortfolioA
{
    List<Fund> obj;
}

2) ist ein:

class PortfolioA : List<Fund>
{

}

Was denkst du, ist besser unter dem Gesichtspunkt der Erweiterbarkeit, Benutzerfreundlichkeit? Ich kann immer noch auf meine Mittel zugreifen, wenn auch mit einem kleinen syntaktischen Wechsel.


8
2017-11-04 20:43


Ursprung


Antworten:


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

wenn ich sage, dass ein Portfolio nur ein   Sammlung von Fonds, mit ein paar   eigene Attribute mögen   TotalPortfolio usw. macht das   grundsätzlich nicht zu einem "ist-a"?

Ich denke nicht. Wenn du sagst Portfolio IST EIN 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 wenn ein Portfolio mehrere unterstützen muss List<Fund>? 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 all diese Eigenschaften nicht korrekt Eigenschaften einer Liste sind, obwohl sie Eigenschaften des Portfolios sein können.


16
2017-11-04 21:03



Begünstige nicht immer "Komposition" oder "Vererbung" oder umgekehrt; 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 machst

Erinnere dich: is-a = Typ, has-a = Eindämmung

In diesem Fall ist ein Portfolio logisch eine Sammlung von Fonds; ein Portfolio selbst ist kein Art von Fonds, so ist die Zusammensetzung die richtige Beziehung

EDIT: Ich habe die Frage ursprünglich falsch gelesen, aber die Antwort ist immer noch die gleiche. 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 an die Definition des Portfolios - 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!

Nehmen wir an, wir beschließen, 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.


8
2017-11-04 20:49



Die erste, weil Sie versuchen sollten, die Komposition gegenüber der Vererbung zu bevorzugen, wenn Sie es können.


7
2017-11-04 20:46



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 Nützlichkeit 1 hat den leichten Vorteil gegenüber 2. Ich stimme wirklich nicht mit dem Konzept, dass Sie immer eine gegenüber der anderen bevorzugen sollten. 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.


4
2017-11-04 20:53



Ich würde mit der Option (1) - Zusammensetzung gehen, da Sie möglicherweise eher spezifische Merkmale für das Portfolio als die Fonds haben.


2
2017-11-04 20:46



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


2
2017-11-04 20:48



Ich werde mich von dem unterscheiden, was die allgemeine Meinung zu sein scheint. In diesem Fall denke ich, dass ein Portfolio sehr wenig mehr als eine Sammlung von Fonds ist ... Durch die Verwendung der Vererbung erlauben Sie die Verwendung mehrerer Konstruktoren, 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 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 solche Sachen


1
2017-11-04 21:58



IS-A-Beziehungsschiff repräsentiert Erbschaften und HAS-A-Beziehung Schiff stellt Zusammensetzung dar. 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.


0
2017-08-08 08:48