obj.id
scheint 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
- id: Bezeichnerattribut für ein Objekt. In Bezug auf die Datenbank ist ein Ersatzschlüssel kein natürlicher Schlüssel.
- Objekt: eine Entität oder ein auf andere Weise eindeutig identifizierbares Objekt innerhalb des Systems.
object-oriented
object-oriented-design
Xenoterracid
quelle
quelle
Antworten:
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
DateTime
diesen 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.
quelle
id
(oder zumindest würde ich nicht)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
obj.id
die Sammlung selbst zu rendern .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:
http://api.example.com/products/
Lädt die Liste der IDs von Produkten.
http://api.example.com/product/452/
Lädt ein Produkt mit der ID 452.
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.
quelle
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
Person
Objekt. 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,
id
sondern die Daten, die sie darstellen, zSSN
. Manchmal kann sogar das vollständig zusammengesetzte Objekt enthalten sein, z. B. ein Objekt,DriversLicense
das 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
id
nicht 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.
quelle
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.
quelle
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.
quelle