Czy przy podawaniu metody logiki biznesowej w celu uzyskania encji domeny parametr powinien akceptować obiekt lub identyfikator? Na przykład, czy powinniśmy to zrobić:
public Foo GetItem(int id) {}
albo to:
public Foo GetItem(Foo foo) {}
Wierzę w przekazywanie obiektów w całości, ale co z tym przypadkiem, w którym otrzymujemy przedmiot i znamy tylko identyfikator? Czy osoba dzwoniąca powinna utworzyć pusty Foo i ustawić identyfikator, czy też powinna po prostu przekazać identyfikator do metody? Ponieważ przychodzące Foo będzie puste, z wyjątkiem identyfikatora, nie widzę korzyści, że osoba dzwoniąca musi utworzyć Foo i ustawić swój identyfikator, gdy może po prostu wysłać identyfikator do metody GetItem ().
źródło
Czy będzie to miało miejsce w dowolnym momencie (w przyszłości)? Preferuj typ pojedynczego identyfikatora zamiast pełnego obiektu, który wie, jak.
Jeśli szukasz bezpieczeństwa typu identyfikatora dla jego encji, istnieją również rozwiązania kodowe. Daj mi znać, jeśli potrzebujesz przykładu.
Edycja: rozszerzenie na bezpieczeństwo typu ID:
Więc weźmy swoją metodę:
Mamy tylko nadzieję, że przekazana liczba całkowita
id
dotyczyFoo
obiektu. Ktoś mógłby go źle użyć i przekazaćBar
identyfikator obiektu lub nawet ręcznie wpisać812341
. To nie jest bezpieczneFoo
. Po drugie, nawet jeśli użyłeś podania obiektuFoo
, na pewno mamFoo
pole ID,int
które ktoś może ewentualnie zmodyfikować. I wreszcie, nie można użyć przeciążenia metody, jeśli istnieją one razem w klasie, ponieważ zmienia się tylko typ zwracany. Przepiszmy tę metodę trochę, aby wyglądała na bezpieczną dla tekstu w C #:Więc wprowadziłem klasę o nazwie,
IntId
która zawiera ogólny element. W tym konkretnym przypadku chcę tylkoint
skojarzeniaFoo
. Nie mogę po prostu wpaść nagoint
i nie mogęIntId<Bar>
jej przypadkowo przypisać . Poniżej znajduje się sposób, w jaki napisałem te bezpieczne typy. Należy pamiętać, że manipulowanie faktycznym instrumentem bazowymint
odbywa się tylko w warstwie dostępu do danych. Wszystko powyżej, co widzi tylko silny typ i nie ma (bezpośredniego) dostępu do swojego wewnętrznegoint
identyfikatora. To nie powinno mieć żadnego powodu.Interfejs IModelId.cs:
Klasa podstawowa ModelIdBase.cs:
IntId.cs:
i, dla kompletności mojej bazy kodu, napisałem również jeden dla encji GUID, GuidId.cs:
źródło
Origin
właściwości: to bardzo przypomina schemat w języku SQL Server. Możesz mieć taki,Foo
który jest używany w twoim oprogramowaniu księgowym, a drugi,Foo
który dotyczy zasobów ludzkich, i to małe pole istnieje, aby odróżnić je na twojej warstwie dostępu do danych. Lub, jeśli nie masz konfliktów, zignoruj to tak jak ja.Z pewnością zgadzam się z twoim wnioskiem. Przekazywanie identyfikatora jest preferowane z kilku powodów:
Foo
obiektu tylko dla identyfikatora oznacza tworzenie fałszywych wartości. Ktoś może pomylić się i użyć tych wartości.int
ma większą platformę i może być zadeklarowany natywnie we wszystkich nowoczesnych językach. Aby utworzyćFoo
obiekt za pomocą metody wywołującej, prawdopodobnie musisz utworzyć złożoną strukturę danych (np. Obiekt json).źródło
Myślę, że rozsądnie byłoby ustalić wyszukiwanie identyfikatora obiektu, jak zasugerował Ben Voigt.
Pamiętaj jednak, że typ identyfikatora obiektu może ulec zmianie. Jako taki, stworzyłbym klasę identyfikatorów dla każdego z moich przedmiotów i pozwoliłbym na wyszukiwanie przedmiotów tylko poprzez te wystąpienia tych identyfikatorów. Zobacz następujący przykład:
Użyłem enkapsulacji, ale możesz też
Item
odziedziczyć po niejItemId
.W ten sposób, jeśli typ identyfikatora zmienia się po drodze, nie musisz nic zmieniać w
Item
klasie ani w podpisie metody GetItem. Tylko przy wdrażaniu usługi musiałbyś zmienić swój kod (co jest jedyną rzeczą, która zmienia się we wszystkich przypadkach)źródło
To zależy od tego, co robi twoja metoda.
Ogólnie rzecz biorąc
Get methods
, zdrowym rozsądkiem jest przekazywanieid parameter
i odzyskiwanie obiektu. Podczas aktualizacji lubSET methods
wysłałbyś cały obiekt do ustawienia / aktualizacji.W niektórych innych przypadkach, gdy
method is passing search parameters
(jako zbiór pojedynczych typów pierwotnych), aby pobrać zestaw wyników, może być mądre douse a container to hold
parametrów wyszukiwania. Jest to przydatne, jeśli na dłuższą metę zmieni się liczba parametrów. W ten sposób możeszwould not need
zmienićsignature of your method, add or remove parameter in all over the places
.źródło