Wir entwickeln eine HR-Anwendung, die in Java geschrieben und mit Hibernate gemappt ist; Eines der Merkmale ist die Rekrutierungsphase.
Die Klasse Candidate
wird wie folgt modelliert:
Da wir für einen Markt nur bis jetzt entwickelt haben, hängt der Code sehr von einer bestimmten Gesetzgebung ab, sehen Sie sich die Eigenschaft fiscalCode
an.
Die Anforderung ist, dass wir dieses Konzept verallgemeinern, um auf andere Märkte expandieren zu können, wo zum Beispiel der eindeutige Bezeichner anders sein kann, aus mehreren Strings bestehen kann oder gar nicht vorhanden ist.
Das erste, was mir in den Sinn kam:
1 - Benennen Sie das Feld einfach als "countryIdentifier" um und fügen Sie bei Bedarf weitere Felder für bestimmte Länder hinzu.
%Vor%Dies bedeutet Refactoring des Codes wo benötigt (all das platziert wo der alte italianFiscalCode verwendet wird), umbenennen einer DBMS Spalte (und fügt eventuell weitere hinzu) und modifizieren alle Abfragen, die dieses Feld benutzen.
Das sieht für mich wie eine schlechte Implementierung aus
2 - Unterklasse Candidate
creating ItalianCandidate
und GreekCandidate
und verschiebt das bestimmte Feld in den Unterklassen.
Das Problem ist, dass die Candidate
-Klasse bereits von HeavyCandidate
unterkonstruiert ist, die die einzige Funktion hat, das Hibernate-Mapping zu optimieren, da wir alle "schweren" Eigenschaften (Viele-zu-Einsen und Mengen) im Heavy bewegen Klasse (dies ist ein Ansatz, dem wir mit allen unseren Beans folgen).
Was ist in dieser Situation der richtige Ansatz?
Ich denke, ein guter Weg, dies zu tun, ist eine abstrakte Klasse zu machen. Dadurch stellt es ein generisches Framework für jedes Kandidatenobjekt bereit und impliziert auch, dass bestimmte Methoden in den Erweiterungsklassen enthalten sein müssen. Dies funktioniert auch mit Konstruktoren, und es ist eine gute Möglichkeit, eine generische Gliederung zu erstellen.
%Vor%Das Beste, was ich tun kann, ist, die Klasse zu erweitern und die Unterklassen zu erstellen.
Dann können Sie den Klassen die erforderlichen Felder hinzufügen.
Also
%Vor%Erstellen Sie eine separate Tabelle für die Beziehungszuordnung zwischen Kandidaten und anderen griechischen Kandidaten.
Indem Sie dies übernehmen:
Ich würde eine Schnittstelle Identifier
(nicht sicher über den Namen) erstellen, die von Klassen wie GreekIdentifier
und ItalianIdentifier
implementiert wird. Dann würde ich ein Feld zu Candidate
hinzufügen:
Die Implementierung von GreekIdentifier
würde dann ungefähr so aussehen:
Wenn countryIdentifier
wirklich etwas ist, was alle Bezeichner haben, können Sie es sogar in eine (abstrakte) Basisklasse verschieben.
Tags und Links java hibernate inheritance design-patterns oop