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.

0voto

cherouvim Punkte 31201

Zunächst würde ich alle Getter dieser Art in ein DAO (und nicht im Modell) platzieren. Dann würde ich die Entität selbst als Parameter verwenden, und was im Inneren der Methode passiert, ist ein Implementierungsdetail.

0voto

user372388 Punkte 56

Es sei denn, es gibt einen bedeutenden Nutzen an anderer Stelle, dann könnte man sagen, dass Schlüssel in der Map im Idealfall eindeutige Werte sein sollten. Trotzdem können Sie durch die Beachtung von equals() und hashCode() jedes Objekt als Schlüssel verwenden, aber equals() und hashCode() sind keine sehr angenehmen Dinge, auf die man achten muss. Sie werden glücklicher sein, sich an IDs als Schlüssel zu halten.

0voto

Pau Punkte 777

Eigentlich würde ich es nach der ID aufrufen, aber das ursprüngliche Design etwas umstrukturieren:

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

public class Verein {
    private String name; // Primärschlüssel
    private Collection memberships;
    public Membership getMembershipByPersonId(int id);
}

public class Mitgliedschaft {
    private Date läuft ab;
    private Person person;
}

oder

public class Person {
    private int id; // Primärschlüssel
    private String name;
    private Membership membership;
    public Membership getMembership();
}

public class Verein {
    private String name; // Primärschlüssel
    private Collection persons;
    public Person getPersonById(int id);
}

public class Mitgliedschaft {
    private Date läuft ab;
}

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