Soll der Parameter beim Bereitstellen einer Geschäftslogikmethode zum Abrufen einer Domänenentität ein Objekt oder eine ID akzeptieren? Zum Beispiel sollten wir dies tun:
public Foo GetItem(int id) {}
oder dieses:
public Foo GetItem(Foo foo) {}
Ich glaube an die Weitergabe von Objekten in ihrer Gesamtheit, aber was ist mit diesem Fall, in dem wir ein Objekt erhalten und nur die ID kennen? Sollte der Anrufer ein leeres Foo erstellen und die ID festlegen, oder sollte er die ID einfach an die Methode übergeben? Da das eingehende Foo bis auf die ID leer ist, sehe ich keinen Vorteil darin, dass der Anrufer ein Foo erstellen und seine ID festlegen muss, wenn er die ID einfach an die GetItem () -Methode senden kann.
quelle
Wird dies jetzt oder in Zukunft über den Draht gehen (serialisiert / deserialisiert)? Bevorzugen Sie den Single-ID-Typ gegenüber dem Who-Know-How-Large-Full-Objekt.
Wenn Sie nach der Typensicherheit der ID für ihre Entität suchen, gibt es auch Codelösungen. Lassen Sie mich wissen, wenn Sie ein Beispiel benötigen.
Edit: Erweiterung der Typensicherheit von ID:
Nehmen wir also Ihre Methode:
Wir hoffen nur , dass die übergebene Ganzzahl
id
für einFoo
Objekt ist. Jemand könnte es missbrauchen undBar
die Ganzzahl-ID eines Objekts eingeben oder es einfach von Hand eingeben812341
. Es ist nicht typsicherFoo
. ZweitensFoo
habe ich sicherFoo
ein ID-Feld, dasint
möglicherweise von jemandem geändert werden kann , selbst wenn Sie die Übergabe einer Objektversion verwendet haben . Und schließlich können Sie keine Methodenüberladung verwenden, wenn diese in einer Klasse zusammen existieren, da nur der Rückgabetyp variiert. Lassen Sie uns diese Methode etwas umschreiben, damit sie in C # typsicher aussieht:Also habe ich eine Klasse mit dem Namen eingeführt,
IntId
die ein generisches Stück enthält. In diesem speziellen Fall möchte ich eineint
, dieFoo
nur zugeordnet ist. Ich kann nicht einfach nacktint
vorbeigehenIntId<Bar>
und es auch nicht versehentlich zuweisen . Im Folgenden habe ich diese typsicheren Bezeichner geschrieben. Nehmen Sie zur Kenntnis , dass die Manipulation der tatsächlichen zugrundeliegendenint
ist nur bei Datenzugriffsschicht. Alles darüber sieht nur den starken Typ und hat keinen (direkten) Zugriff auf seine interneint
ID. Es sollte keinen Grund dazu geben.IModelId.cs-Schnittstelle:
ModelIdBase.cs-Basisklasse:
IntId.cs:
und der Vollständigkeit halber habe ich auch eine für GUID-Entitäten, GuidId.cs, geschrieben:
quelle
Origin
Eigenschaft nicht erklärt : Sie ähnelt einem Schema in der SQL Server-Sprache. Möglicherweise haben Sie eineFoo
, die in Ihrer Buchhaltungssoftware verwendet wird, und eine andereFoo
, die für die Personalabteilung bestimmt ist, und ein kleines Feld, in dem Sie sie auf Ihrer Datenzugriffsebene unterscheiden können. Oder, wenn Sie keine Konflikte haben, ignorieren Sie es wie ich.Ich stimme Ihrer Schlussfolgerung mit Sicherheit zu. Das Übergeben eines Ausweises wird aus folgenden Gründen bevorzugt:
Foo
Objekt nur für die ID zu erstellen, bedeutet, falsche Werte zu erstellen. Jemand kann einen Fehler machen und diese Werte verwenden.int
ist plattformübergreifender und kann in allen modernen Sprachen deklariert werden. Um einFoo
Objekt mit dem Methodenaufrufer zu erstellen, müssen Sie wahrscheinlich eine komplexe Datenstruktur erstellen (z. B. ein json-Objekt).quelle
Ich denke, Sie wären klug, die Suche nach der Kennung des Objekts durchzuführen, wie von Ben Voigt vorgeschlagen.
Denken Sie jedoch daran, dass sich der Typ der Objektkennung möglicherweise ändert. Aus diesem Grund würde ich für jeden meiner Artikel eine Identifikatorklasse erstellen und das Nachschlagen der Artikel nur über diese Instanzen dieser Identifikatoren zulassen. Siehe folgendes Beispiel:
Ich habe Kapselung verwendet, aber Sie können auch von
Item
erben lassenItemId
.Auf diese Weise müssen Sie nichts an der
Item
Klasse oder an der Signatur der GetItem-Methode ändern, wenn sich der Typ Ihrer ID entlang der Straße ändert . Nur bei der Implementierung des Dienstes müssten Sie Ihren Code ändern (das ist das einzige, was sich in jedem Fall ändert)quelle
Es hängt davon ab, was Ihre Methode tut.
Im Allgemeinen
Get methods
ist es sinnvollid parameter
, das Objekt zu übergeben und zurückzugewinnen. Während für die Aktualisierung oderSET methods
Sie würden das gesamte Objekt gesetzt / aktualisiert werden.In einigen anderen Fällen, in denen Sie
method is passing search parameters
(als Sammlung einzelner primitiver Typen) eine Reihe von Ergebnissen abrufen möchten, ist es möglicherweise sinnvoll, nachuse a container to hold
Ihren Suchparametern zu suchen. Dies ist nützlich, wenn sich die Anzahl der Parameter langfristig ändert. So können Siewould not need
das ändernsignature of your method, add or remove parameter in all over the places
.quelle