Sollte ein Objekt seine eigene ID kennen?

22

obj.idscheint ziemlich verbreitet zu sein und scheint auch in den Bereich von etwas zu fallen, das ein Objekt über sich selbst wissen könnte. Ich frage mich, warum mein Objekt seine eigene ID kennen sollte.

Es scheint keinen Grund zu geben, es zu haben? Einer der Hauptgründe für das Vorhandensein ist das Abrufen. Daher müssen meine Repositorys dies wissen und es daher für die Datenbankinteraktion verwenden.

Ich bin auch einmal auf ein Problem gestoßen, bei dem ich ein Objekt für eine RESTful-API nach JSON serialisieren wollte, bei dem die ID nicht in die Nutzdaten zu passen schien, sondern nur die URI und das Einfügen in das Objekt das erschwerten.

Sollte ein Objekt wissen, dass es eine eigene ID hat? warum oder warum nicht?

Update : AGB

  1. id: Bezeichnerattribut für ein Objekt. In Bezug auf die Datenbank ist ein Ersatzschlüssel kein natürlicher Schlüssel.
  2. Objekt: eine Entität oder ein auf andere Weise eindeutig identifizierbares Objekt innerhalb des Systems.
Xenoterracid
quelle
1
Wenn es keinen Grund gibt, Informationen zu speichern, um abstrakt zu bleiben, speichern Sie sie nicht. Es verursacht nur Kopfschmerzen.
3
Wenn Sie den eindeutigen Schlüssel eines Objekts nicht kennen, wie würden Sie die Daten in einer Datenbank aktualisieren oder den Benutzer ein Vorkommen aus einer Liste auswählen lassen?
NoChance
@EmmadKareem was ich sage ist, dass die Sammlung (Repository) die ID kennt, also warum muss das Objekt selbst. Wenn ich eine Liste rendern würde, würde ich wahrscheinlich die Sammlung rendern, die die IDs kennt.
Xenoterracide
Wenn Sie die mit dem Objekt gespeicherte ID nicht verwenden und sie niemals beabsichtigen oder verwenden möchten, wird sie eindeutig nicht benötigt.
GroßmeisterB
@GrandmasterB natürlich benutzt du die id, die frage ist, ob du die id mit dem objekt im speicher hast und warum.
Xenoterracide

Antworten:

8

Kurze Antwort: Die Angabe einer Objektkennung im Objekt ist ein Muss, wenn auf das Objekt verwiesen werden soll.

In einem Szenario, in dem Sie die Verwendung einer Sammlung von Objekten planen und die Verweisung auf ein einzelnes Objekt / eine einzelne Entität planen, sollte die Kennung enthalten sein. Es kann jedoch Fälle geben, in denen ein natürlicher Schlüssel / eine natürliche Kennung DateTimediesen Bedarf künstlich erfüllen kann.

Darüber hinaus können Sie Ihre DTOs als kompakten Container für Ihr Objekt haben, der die Objektkennung in sich selbst überspringen / einschließen kann. Wirklich all diese Entscheidungen hängen wirklich von Ihren Geschäftsanwendungsfällen und -bedürfnissen ab .

Bearbeiten: Wenn Sie Ihr Objekt identifizieren möchten, benötigen Sie eine Kennung. Dieser Bezeichner kann eine Ersatz-ID, eine Datums- / Uhrzeitangabe, eine Anleitung usw. sein. Dies ist im Grunde alles, was Ihr Objekt auf einzigartige Weise von anderen unterscheidet.

EL Yusubov
quelle
2
Warum sollten sie in das Objekt und nicht nur in die Sammlung aufgenommen werden (vorausgesetzt, die Sammlung ist eine Art Wörterbuch)?
Xenoterracide
Mein Punkt war, dass, wenn Sie Ihr Objekt identifizieren möchten, Sie eine Kennung haben müssen. Es kann sich um ID, Datum und Uhrzeit usw. handeln, um alles, was Ihr Objekt von anderen unterscheidet.
EL Yusubov
1
Natürlich geht es bei meiner Frage mehr darum, warum das Objekt selbst diesen Bezeichner kennen muss.
Xenoterracide
ein bisschen zu klären , meine ich eine Surrogat - ID, in der Regel Dinge wie Datetime ist, oder vin Zahlen sind natürlich und somit ein Teil der Daten, und nicht genannt id(oder zumindest würde ich nicht)
xenoterracide
6

In dem Versuch, meine Antwort so abstrakt wie Ihre Frage zu lassen, haben Sie vermutlich tatsächlich Ihre eigene Frage beantwortet.

Ein Objekt sollte bei Bedarf seine eigene ID kennen.

Ein Objekt sollte seine ID nicht kennen (oder dass es sogar eine hat), wenn es nicht muss.

Wie Sie bereits betont haben, gibt es Fälle, in denen es für das Objekt entweder unpraktisch oder unnötig ist, seine ID beizubehalten oder zu ermitteln. Es gibt jedoch auch andere Fälle, in denen es für das Objekt praktischer ist, seine ID zu kennen. Codieren Sie Ihre Objekte entsprechend ihrer Verwendung.


quelle
In welchen Fällen ist es bequem, sich seiner Identität bewusst zu sein? Ich habe darüber nachgedacht und gedacht, dass die meisten von ihnen nur auf der Art und Weise basieren könnten, wie sie codiert wurden, vielleicht eine for-Schleife, die zum Rendern verwendet wird, anstatt obj.iddie Sammlung selbst zu rendern .
Xenoterracide
1
@xenoterracide - asynchrone Anzeige und Aktualisierung von DB-Datensätzen ist ein Beispiel. In einigen Fällen habe ich nicht genügend Informationen, um einen Datensatz mit Ausnahme seiner ID eindeutig zu identifizieren. Daher ist es sinnvoll, die ID mit dem Datensatzobjekt zu belassen.
aber ist das eine ursache oder eine wirkung? ist es eine Anforderung? Wenn Ihr Repository / Ihre Sammlung / Ihr Datamapper (oder eine Kette davon) dafür verantwortlich ist, die Aktualisierungen fortzusetzen, und die ID kennt und weitergeben kann ... Ich versuche zu verstehen, ob es einen Grund dafür gibt, oder ob Es ist da, weil viele Leute ein aktives Aufzeichnungsmuster verwenden.
Xenoterracide
@xenoterracide - in den Fällen, an die ich denke, war es definitiv ein kausales Bedürfnis. In einigen Fällen war es viel praktischer, die mit dem Objekt verknüpfte ID beizubehalten. Ihre Frage war gut, weil sie eine Grundannahme in Frage stellte, die von vielen Leuten gemacht wurde. Wir neigen dazu zu lernen, wenn wir uns auf solche Annahmen einlassen. Auf der anderen Seite nicht zu analysieren und in die entgegengesetzte Richtung gehen. Andernfalls werden Sie in der gleichen Zeit unantastbare Erklärungen abgeben, die Sie an erster Stelle abgebrochen haben.
4

Es ist ziemlich üblich, die ID einzuschließen, aber es ist auch üblich, Wörterbücher zu verwenden, dh die Datenstrukturen, in denen jedes Objekt seiner ID so zugeordnet ist, dass Sie dieses Objekt leicht abrufen können, wenn Sie die entsprechende ID kennen, das Objekt dies jedoch nicht weiß es.

Wenn Sie beispielsweise eine API mit zwei Methoden erstellen:

Dann müssen Sie die ID 452 in der JSON-Antwort der zweiten Anforderung nicht erneut senden. Der Benutzer der API kennt die ID bereits.

Arseni Mourzenko
quelle
4

Ich denke, dass dies subjektiv ist und von Ihrem Design abhängt.

Meistens scheint dies ein Entwurf zu sein, der aus einem aktiven Datensatz stammt . In einem aktiven Datensatz verfügt Ihre Entität über Methoden zum Ausführen von Datenbankoperationen und muss daher auch die Datenbankkennung kennen.

Wenn Sie andere Muster verwenden, z. B. ein Repository mit einem Daten-Mapper, der diese Daten im Objekt speichert, wird dies unnötig und möglicherweise unangemessen.

Nehmen Sie zum Beispiel ein PersonObjekt. Mir wird ein Name gegeben, der innerhalb einer Familie eindeutig sein kann oder nicht. Da die Bevölkerung gewachsen ist, sind größere Namen nicht mehr eindeutig und wir haben Ersatzkennungen für immer größere Systeme entwickelt. Beispiele hierfür sind: mein Führerschein und die Sozialversicherungsnummer. Mir wurde keine ID zugewiesen, alle diese IDs müssen beantragt werden.

Die meisten davon sind keine guten Primärschlüssel / IDs für Software, da sie nicht universell sind. Zumindest nicht außerhalb ihres spezifischen Systems ist eine SSN eindeutig und für die Verwaltung der sozialen Sicherheit einheitlich. Da wir in der Regel nicht die Anbieter dieser Informationen sind, würden Sie sie nicht anrufen, idsondern die Daten, die sie darstellen, z SSN. Manchmal kann sogar das vollständig zusammengesetzte Objekt enthalten sein, z. B. ein Objekt, DriversLicensedas alle Informationen enthalten kann, die der Führerschein enthält.

Alle allgemeinen IDs sind daher Ersatzschlüssel im System und können durch Speicherreferenzen ersetzt werden, die nur IDs enthalten, um das Nachschlagen und die Speicherung von Datensätzen zu vereinfachen.

Da es sich bei an idnicht um konzeptuelle Daten handelt, bezweifle ich, dass sie (allgemein) zum Objekt gehören, da sie nicht aus der Domäne stammen. Vielmehr sollte es zu seinem Zweck erhalten bleiben, ein Objekt zu identifizieren, das keine andere Möglichkeit hat, eine eindeutige Identität darzustellen. Dies könnte mit easy in einem Repository / einer Sammlung geschehen.

Wenn Sie das Objekt in der Software als Liste darstellen oder beibehalten müssen, können Sie dies einfach über das Repository / Collection-Objekt oder ein anderes damit verbundenes Objekt tun. Bei der Weitergabe an den Data Mapper (falls dieser separat ist) können Sie einfach weitergeben .update( id, obj ).

Haftungsausschluss : Ich habe noch nicht versucht, ein System zu erstellen, das die ID nicht in der Entität enthält, und kann mich daher als falsch erweisen.

Xenoterracid
quelle
2

Wie GlenH7 in einem Kommentar feststellte, ist dies eine gute Frage, da sie das in Frage stellt, was viele Menschen für selbstverständlich halten. Ich gehe jedoch davon aus, dass es pragmatisch ist, die ID über so viele Ebenen des Systems wie möglich mit dem Objekt zu verbinden, auch wenn das Auslassen der ID konzeptionell rein erscheint. Es kostet wenig, kann sich aber als nützlich erweisen, wenn die Dinge zusammenbrechen.

Eine Entität muss möglicherweise nicht wissen, dass es sich um eine ID handelt. Ebenso wenig muss eine Person ihre persönliche Identifikationsnummer, ihre Führerscheinnummer oder eine andere an Ihrem Standort möglicherweise verwendete Kennung kennen. Sie könnten sicherlich die meiste Zeit darauf verzichten. Es ist jedoch ratsam, für alle Fälle einen Ausweis bei sich zu haben.

Gleiches gilt für ein Objekt. Unabhängig von den Feinheiten der Datenzugriffsebene wird das Objekt letztendlich einem bestimmten Datenbankeintrag zugeordnet. Dieser Eintrag kann möglicherweise nur anhand der Objekt-ID eindeutig identifiziert werden. In diesem Fall würde ich es vorziehen, diese Informationen jederzeit zur Verfügung zu haben, unabhängig davon, ob ich einen UI-Code debugge, die Anzahl in der Business-Schicht festlegt, das Repository selbst oder ein abhängiges System über einen Webservice. Oder ob ich für diese Angelegenheit Fehlerprotokolle durchstöbere.

In Ihrem Fall ist es möglicherweise richtig, die ID wegzulassen, wenn Sie nur Daten von der Datenbank abrufen und über den Webservice übertragen. Ich glaube einfach nicht, dass es sinnvoller ist, als es im allgemeinen Fall beizubehalten.

scrwtp
quelle
2

Sie haben Recht, Sie müssen die ID nicht im Objekt speichern, solange Sie sie nur in Ihrem Repository-Kontext kennen müssen.

Die Situation ändert sich, wenn Sie das Objekt an einen Code außerhalb dieses Kontexts übergeben. Dieser Code hat das Objekt nicht anhand der ID angefordert (und kennt es daher noch nicht), sondern benötigt die ID für einen beliebigen Zweck (z. B. um es in eine Liste aufzunehmen) von IDs, die später von einem weiteren Code aus dem Repository angefordert werden).

In dieser Situation haben Sie zwei Möglichkeiten:

  • Fügen Sie ein neues Funktionsargument 'id' in die gesamte Funktionskette zwischen dem Repository-Kontext und der Funktion ein, für die die ID benötigt wird

  • Fügen Sie die ID in das Objekt ein

In den meisten Fällen ist das Speichern der ID im Objekt die bessere Lösung. Außerdem werden Codeänderungen reduziert, wenn die ID an unvorhergesehenen Orten benötigt wird. Außerdem kann dies manchmal beim Debuggen hilfreich sein.

Deshalb mache ich es, wenn ich es mache.

Paul Thomann
quelle