Mam starą układankę, więc pomyślałem, że podzielę się nią z tobą, może uda się uzyskać właściwy kierunek. Rzecz w tym, że niektóre z naszych jednostek w bazie danych są dość duże (read ma wiele właściwości), a rzadko logika biznesowa używa wszystkich właściwości encji, więc za każdym razem muszę myśleć, jakie właściwości muszą być załadowane, aby logika biznesowa działała poprawnie. Bardzo hipotetyczny przykład:Podmioty za dużo?
public class Product
{
public string Title {get;set;}
public string Description {get;set;}
public string RetailPrice {get;set;}
public string SupplierId {get;set;}
public Supplier Supplier { get;set;}
// many other properties
}
public class ProductDiscountService
{
public decimal Get(Product product)
{
// use only RetailPrice and Supplier code
return discount;
}
}
public class ProductDescriptionService
{
public string GetSearchResultHtml(Product product)
{
// use only Title and Description
return html;
}
}
Wygląda mogłem wydobyć interfejsy IDiscountProduct i ISearchResultProduct, Wyrób oznakowany jako wdrożenie tych interfejsów, a następnie utworzyć mniejsze DTOs wykonawczych każdej z tych interfejsów, ale to wygląda w tej chwili jak Overkill (przynajmniej Nie widziałem nikogo grupującego właściwości za pomocą interfejsów).
Rozdzielenie obiektu w bazie danych na mniejsze obiekty również nie wygląda rozsądnie, ponieważ wszystkie te właściwości należą do produktu i obawiam się, że będę zmuszony użyć wielu sprzężeń, aby wybrać coś i jeśli zdecyduję, że jakaś własność należy do innego podmiotu, ten ruch będzie trudny do zrealizowania.
Aby każda właściwość używana w logice biznesowej danej metody jako parametr metody również wyglądała na niewłaściwą.
Ile właściwości mówimy? – walther
zwykle więcej niż 10, mniej niż 20. – Giedrius
Powiedziałbym: jeśli twoja metoda wie z góry, które właściwości użyć i to pozostaje ustalone, to używanie parametrów może być dobrym rozwiązaniem. Łatwe do przetestowania i łatwe do ponownego wykorzystania. Jeśli jednak implementacja jest niezdefiniowana w sygnaturze metody (bieżąca implementacja używa 2 właściwości, ale jutro może się to stać 3), chcesz skonsumować całą rzecz produktu ze wszystkimi dostępnymi właściwościami. Mówi to konsekwentnie: ta metoda wymaga tych parametrów, a ta metoda wymaga produktu. – Polity