2016-07-11 5 views
2

Nachdem ich gelesen habe, wie man UML-Klassendiagramme erstellt und SOLID principles verwendet, habe ich versucht, ein UML-Klassendiagramm zusammenzustellen, mit dem ich für ein neues Symfony-Projekt, das ich starten werde, zufrieden bin.Wie sollten Symfony-Projekte UML2-Klassenschnittstellen in ihren Entitätsklassen implementieren?

jedoch mit den Schnittstellen I definiert haben - zum Beispiel:

example UML class diagram with Interface

Ich bin unklar, ob/wie sollten sie als Symfony abstrakten Einheiten umgesetzt werden. Von dem, was ich gelesen habe, scheint es widersprüchliche Meinungen zu sein:

  1. Symfony Docs: How to Define Relationships with Abstract Classes and Interfaces, aber dies scheint nur zu sein, wenn sie von anderen Bundles abstrakte Klassen zugreifen?

  2. Questions such as this wo Menschen davon abraten, abstrakte Klassen zu verwenden und stattdessen "normale" Entitäten (dh Professor und Student) zu schaffen - obwohl das dann nicht die Vorteile von SOLID ignoriert?

+0

Ich denke, das ist Quatsch (Entschuldigung für die harten Worte). Person ist keine Schnittstelle. Es ist eine einfache (vielleicht abstrakte) Klasse. Eine Schnittstelle benötigt Methoden, keine Attribute, da sie Funktionalität bietet. –

+0

Danke für die Klarstellung, die hilfreich ist. Es war nur ein einfaches Diagramm, um die Idee zu vermitteln, aber in meinem tatsächlichen Fall habe ich auch Methoden in "Person". Also ist es richtig zu sagen, dass eine Schnittstelle eine "abstrakte Klasse + Methoden" wäre? – Bendy

+0

Ich denke du kannst das sagen :-) –

Antwort

1

Sie am Inheritance Mapping Abschnitt von Lehre Dokumentation aussehen sollte ... Es erlaubt Ihnen, eine abstrakte „Person“ Klasse zu haben und dann verlängern sie es ein „Student“ oder ein „Lehrer“ dort zu machen sind Es gibt ein paar verschiedene Möglichkeiten, wie Sie das erreichen können ... die einfachste ist die SINGLE_TABLE Vererbung, die einen "Diskriminator" in der Datenbank verwendet, um zu wissen, um welchen Typ einer Entität es sich handelt.

+0

Danke - die abgebildete Superklasse sieht im Hinblick auf das Datenmodell korrekt aus - aber wie @Thomas Kilian darauf hingewiesen hat, war meine Bildauswahl nicht die beste, da sie keine Methoden zeigt (mit dem ich mich befassen muss). Sollten diese Methoden in einer neuen Datei 'person.php' spezifiziert werden, die meine abstrakte Klasse spezifiziert - und dann die tatsächlichen Entitäten (zB Professor & Student) als getrennte Dateien haben, zB' professor.php' mit 'class Professor extends Person {.. .} ' – Bendy

+0

@Bendy das ist richtig ... die Personenklasse ist eine abstrakte Klasse ... sie kann nicht instanziiert werden ... also müssen Sie sie immer erweitern, damit Sie sie benutzen können ... also werden Sie 3 haben Dateien ... Person.php Professor.php und Student.php ... – Drmjo

1

Ihre Klassen scheinen normale (geschäftliche) Objekttypen darzustellen, wie sie in einem UML-Klassendiagramm definiert sind, das ein Datenmodell für eine App darstellt. In Ihrem Beispiel ist es natürlich, die Klassenhierarchie zu betrachten, die durch die Stammklasse Person mit zwei Unterklassen Professor und Student im Datenmodell gebildet wird. Wenn nun ein solches Datenmodell (mit Unterklassen und/oder Beziehungen/Assoziationen zwischen Klassen) in einem Framework implementiert werden soll, stellt sich die Frage, wie entsprechende Modellklassen (auch "Entitätsklassen" genannt) definiert werden und die Antwort davon abhängt die Unterstützung des Frameworks für diese Konzepte.

Wenn Sie in Ihrer App mit einer Klassenhierarchie umgehen müssen und Ihr OO-Framework die Vererbung/Spezialisierung zwischen Modell-/Entitätsklassen unterstützt, besteht die Hauptproblematik darin, die Klassenhierarchie einer Reihe von Tabellen zuzuordnen das zugrundeliegende SQL DBMS als Teil des Object-Relational Mapping (ORM).

Im Datenmodell würden Sie keine Schnittstellen verwenden, da sie ein OO-Programmierkonzept und kein Datensemantikkonzept sind. Im Datenmodell können Sie jedoch Person als abstrakte Klasse definieren, was bedeutet, dass sie keine direkte Instanz hat und nur dazu dient, Merkmale (Eigenschaften, Methoden und Einschränkungen) zu definieren, die von Unterklassen geerbt werden. Übrigens würde diese Annahme/Entscheidung bedeuten, dass es keine anderen Instanzen von Person gibt, mit Ausnahme von Studenten und Professoren.

Wenn Ihr Rahmen (zum Beispiel Symfony) unterstützt keine Vererbung von abstrakten Klassen, aber eine gewisse Form von Schnittstellen, dann können Sie eine Schnittstelle verwenden, so etwas wie eine abstrakte Klasse definiert, abstrakte Methoden nur zu bekommen. Eine Schnittstelle Person würde Getter/Setter für firstname und lastName definieren.

Da in vielen Fällen, und auch bei Ihrem einfachen Beispiel, die gegebene Klassenhierarchie ziemlich einfach ist, ist es vorzuziehen, die Sublinkbeziehungen zu eliminieren und die konzeptionelle Klassenhierarchie des Datenmodells auf eine einfache Menge von Klassen zu reduzieren Verwenden Sie die class hierarchy merge design pattern. Dies vermeidet den gesamten Overhead, der beim Definieren von Schnittstellen und bei der Pflege der Beziehungen zwischen ihnen und den Klassen, die sie implementieren, erforderlich ist. Dies entspricht der Beibehaltung der Klassenhierarchie in Ihren Modell-/Entitätsklassen und der Verwendung des ORM-Schemas für die Ein-Tabellen-Vererbung.

Verwandte Themen