17 Stimmen

Ist es eine gute Praxis, Domain-Objekte als Schlüssel zu verwenden?

Ist es eine gute Praxis, Domänenobjekte als Schlüssel für Maps (oder "get"-Methoden) zu verwenden, oder ist es besser, nur die id des Domänenobjekts zu verwenden?

Es ist einfacher, dies anhand eines Beispiels zu erklären. Nehmen wir an, ich habe eine Person-Klasse, eine Club-Klasse und eine Membership-Klasse (die die anderen beiden verbindet). D.h.,

public class Person {
    private int id; // Primärschlüssel
    private String name;
}

public class Club {
    private String name; // Primärschlüssel
}

public class Membership {
    private Person person;
    private Club club;
    private Date expires;
}

Oder so ähnlich. Jetzt möchte ich eine Methode getMembership zu Club hinzufügen. Die Frage ist, sollte diese Methode ein Person-Objekt übergeben:

public Membership getMembership(Person person);

oder die id einer Person:

public Membership getMembership(int personId);

Was ist am idiomatischsten, was ist am bequemsten, was ist am passendsten?

Edit: Viele sehr gute Antworten. Ich habe mich dafür entschieden, die id nicht zu offenbaren, da die "Person" (wie Sie vielleicht gemerkt haben, hat meine eigentliche Domäne nichts mit Personen und Clubs zu tun...) Instanzen leicht verfügbar sind, aber vorerst intern in einem HashMap gespeichert werden, gehasht auf der id - aber zumindest ich offenbare sie korrekt in der Schnittstelle.

1voto

John Punkte 59

Halt mal einen Moment. Die Methode getMembership() gehört nicht zum Club. Sie gehört zum Satz aller Mitgliedschaften, die du nicht implementiert hast.

1voto

Frank Schwieterman Punkte 23718

Ich würde wahrscheinlich IDs verwenden. Warum? Indem ich IDs übernehme, treffe ich sicherere Annahmen über den Aufrufer.

Wenn ich eine ID habe, wie viel Aufwand ist es, um die Person zu erhalten? Es könnte 'einfach' sein, erfordert aber den Zugriff auf einen Datenspeicher, was langsam ist...

Wenn ich ein Person-Objekt habe, wie viel Aufwand ist es, um die ID zu erhalten? Einfacher Zugriff auf ein Element. Schnell und verfügbar.

1voto

Fortyrunner Punkte 12559

Wie von anderen beschrieben: Verwenden Sie das Objekt.

Ich arbeite an einem System, in dem wir alten Code hatten, der int verwendete, um Transaktions-IDs darzustellen. Rate mal? Uns gingen die IDs aus, weil wir int verwendet haben.

Die Umstellung auf long oder BigNumber gestaltete sich schwierig, da die Leute sehr erfinderisch bei der Namensgebung geworden waren. Einige verwendeten

int tranNum

einige verwendeten

int transactionNumber

einige verwendeten

int trannNum

(inklusive Rechtschreibfehler).

Einige Leute wurden wirklich erfinderisch...

Es war ein Durcheinander und das Aufräumen war ein Albtraum. Ich musste schließlich den gesamten Code manuell durchgehen und zu einem TransactionNumber-Objekt konvertieren.

Verbergen Sie die Details so weit wie möglich.

0voto

Nate Punkte 29413

Normalerweise würde ich mich an das Motto weniger ist mehr halten. Je weniger Informationen erforderlich sind, um Ihre Methode aufzurufen, desto besser. Wenn Sie die ID kennen, benötigen Sie nur die ID.

Wenn Sie möchten, können Sie zusätzliche Überladungen bereitstellen, die zusätzliche Parameter akzeptieren, wie z.B. die gesamte Klasse.

0voto

Dean J Punkte 37317

Wenn Sie das Objekt bereits haben, gibt es keinen Grund, die ID herauszuziehen, um einen Hash-Schlüssel zu erhalten.

Solange die IDs immer eindeutig sind, implementieren Sie hashCode(), um die ID zurückzugeben, und implementieren Sie auch equals().

Die Wahrscheinlichkeit ist groß, dass Sie jedes Mal, wenn Sie die Mitgliedschaft benötigen, bereits die Person haben, daher spart es später Code und Verwirrung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X