Das Klasse design ist besser?
Welche Klasse design ist besser und warum?
public class User
{
public String UserName;
public String Password;
public String FirstName;
public String LastName;
}
public class Employee : User
{
public String EmployeeId;
public String EmployeeCode;
public String DepartmentId;
}
public class Member : User
{
public String MemberId;
public String JoinDate;
public String ExpiryDate;
}
ODER
public class User
{
public String UserId;
public String UserName;
public String Password;
public String FirstName;
public String LastName;
}
public class Employee
{
public User UserInfo;
public String EmployeeId;
public String EmployeeCode;
public String DepartmentId;
}
public class Member
{
public User UserInfo;
public String MemberId;
public String JoinDate;
public String ExpiryDate;
}
- Ich denke, dass die Menschen mit niedrigeren Bewertungen, sollten Sie nicht in der Lage sein, zu schließen, Fragen von Personen mit höheren scores. Das war ein schlechter call.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage ist einfach beantwortet, indem man erkennt, dass die Vererbung Modelle eine "IST-EIN" - Beziehung, während die Mitgliedschaft Modellen eine "HAT-EIN" - Beziehung.
Welches ist das richtige? Dies ist Ihre Antwort.
employee
HAT eineuserinfo
im Zusammenhang mit dieser domain. Wenn Sie feststellen, dass Ihreemployee
hat einepostcode
einfach, weil eineuser
tut, sondern auch für die geschäftlichen Zwecke desemployee
, diepostcode
ist nicht nötig (es ist gezwungen, auf Sie durch den Vertrag von einemuser
), dann Komposition besser geeignet sein können als inheritence in einem solchen Fall.Ich weiß nicht, wie entweder ein. Was passiert, wenn jemand sowohl ein Mitglied und ein Mitarbeiter?
public class EmployedMember: Employee, Member
- vorausgesetzt, Ihre Sprache unterstützt mehrere Vorfahren. Natürlich ärger beginnt, wenn beide Klassen verwendenId
stattEmployeeId
undMemberId
jeweils...Stellen Sie sich folgende Fragen:
Im Allgemeinen, bemühen sich um ein Modell der Realität Ihr Programm simuliert, unter die Zwänge der Komplexität des Codes und die erforderliche Effizienz.
Ich glaube nicht, dass Komposition ist besser als Vererbung (nur Regel). Wenn Mitarbeiter und Mitglied sind wirklich Benutzer, und Sie schließen sich gegenseitig aus, dann ist die erste design besser ist. Betrachten Sie das Szenario, wo Sie brauchen, um Zugriff auf den Benutzernamen des Mitarbeiters. Mit dem zweiten Entwurf, den Sie haben würde:
ist schlecht (law of Demeter), so würden Sie umgestalten zu:
erfordert eine kleine Methode, die auf Mitarbeiter zu delegieren, um das User-Objekt. All das wird vermieden, indem der erste Entwurf.
Schöne Frage, obwohl, um Ablenkungen zu vermeiden über Recht und falsch ich würde prüfen, ob Sie für die vor-und Nachteile der einzelnen Ansatz-ich denke, das ist, was Sie bedeutet, was besser ist oder schlechter ist und warum. Sowieso ....
Der Erste Ansatz aka Vererbung
Vorteile:
Nachteile:
Der Zweite Ansatz aka Zusammensetzung
Vorteile:
Nachteile:
Listen wie diese + die Fragen Jon Limjap erwähnt wird Ihnen helfen, Entscheidungen zu treffen und loszulegen-dann können Sie finden, was die Recht Antworten sollte 😉
Können Sie auch das denken der Mitarbeiter als Rolle der Benutzer (Person). Die Rolle, die ein Benutzer kann sich mit der Zeit ändern (user kann arbeitslos werden) oder ein Benutzer kann mehrere Rollen gleichzeitig.
Vererbung ist viel besser, wenn es real "ist ein" Beziehung, zum Beispiel Apfel - Frucht. Aber sehr vorsichtig sein: - Kreis - Ellipse ist nicht real "ist ein" Beziehung, weil Kreises hat weniger "Freiheit" als ellipse (circle ist ein Zustand der ellipse) - siehe: Kreis-Ellipse-problem.
Die wirklichen Fragen sind:
Können diese drei vollkommen unzusammenhängende Entitäten oder nicht, und das wird bestimmen, ob Sie Ihre erste oder zweite design-arbeiten, oder wenn völlig anderen design ist in Ordnung.
Weder das eine ist gut. Zu viel änderbarer Zustand. Sollten Sie nicht in der Lage, erstellen Sie eine Instanz einer Klasse, die in einer ungültigen oder teilweise initialisierten Zustand.
Sagte, die zweite ist besser, denn es begünstigt die Komposition über Vererbung.
Unter Angabe Ihrer Anforderung/spec könnte helfen, kommen an der 'best design'.
Ihre Frage zu "subject-to-reader-interpretation' im moment.
Hier ist ein Szenario, das Sie denken sollten:
Zusammensetzung (2. Beispiel) ist vorzuziehen, wenn der gleiche Benutzer kann ein Mitarbeiter und ein Mitglied. Warum? Denn für zwei Instanzen (Mitarbeiter und Mitglieder) vertreten, dass die gleichen Benutzer, wenn der Benutzer Daten ändert, werden Sie nicht haben, um es zu aktualisieren, in zwei Orten. Nur die Benutzer-Instanz enthält alle Informationen für den Benutzer, und nur Sie aktualisiert werden. Da beide-Mitarbeiter und Mitglied-Klassen enthalten, die die gleiche Benutzer-Instanz, wird man automatisch beide enthalten die aktualisierten Informationen.
Drei weitere Optionen:
Haben die
User
Klasse enthalten, die Ergänzende Informationen für Mitarbeiter und Mitglieder, mit der nicht verwendete Felder leer (ID
einer bestimmtenUser
geben würde, ob der Benutzer ein Mitarbeiter, Mitglied oder was auch immer).Haben eine
User
Klasse enthält eine Referenz auf einISupplementalInfo
, woISupplementalInfo
ist vererbtISupplementalEmployeeInfo
,ISupplementalMemberInfo
usw. - Codes, die für alle Benutzer gelten, könnte die Arbeit mitUser
class-Objekte und code hatte eineUser
Referenz kann ein Zugang für einen Nutzer zusätzliche Informationen, aber dieser Ansatz würde verhindern, dass änderungenUser
wenn verschiedene Kombinationen von zusätzlichen Informationen erforderlich sind, in der Zukunft.Wie oben, aber die
User
Klasse enthalten eine Art Sammlung vonISupplementalInfo
. Dieser Ansatz hätte den Vorteil der Erleichterung der run-time-Ergänzung von Eigenschaften, die zu einem Benutzer (z.B. weil einMember
bekam gemietet). Wenn mit dem vorherigen Ansatz, man müsste definieren Sie verschiedene Klassen für unterschiedliche Kombinationen von Eigenschaften; Sie dreht ... ein "Mitglied" in "Mitglied+Kunden" benötigen würde anderen code aus, der aus einer "Mitarbeiter" in einen "Mitarbeiter+Kunden". Der Nachteil der letzteren Methode ist, dass Sie würde es schwieriger machen, zum Schutz gegen redundante oder inkonsistente Attribute (mit so etwas wie einemDictionary<Type, ISupplementalInfo>
zu halten, zusätzliche Informationen, die funktionieren könnte, aber scheint ein wenig "sperrig").Ich würde eher zu Gunsten der zweiten Methode, die es ermöglicht für zukünftige expansion besser als die direkte Vererbung. Arbeiten Sie mit einer Sammlung von Objekten und nicht als ein einzelnes Objekt möglicherweise etwas beschwerlich, aber das Konzept möglicherweise besser in der Lage als die anderen zu behandeln wechselnde Anforderungen.