Pracuję nad aplikacją RCP, jestem nowy w tej aplikacji.
Fasolka szparagowa służy do pisania logiki biznesowej w celu zapisywania / pobierania jednostek.
Ale zamiast wysyłać jednostki bezpośrednio do klienta , przechodzimy na DTO i zapełniamy klientów. Podczas oszczędzania ponownie przekształcamy DTO w encję i oszczędzamy.
Jakie są korzyści z tych konwersji? Czy ktoś może wyjaśnić?
What's the benefit of these conversions?
oddzielenie modelu danych trwałości od modelu danych (reprezentacji) oferowanego konsumentom. Korzyści z oddzielania płatności zostały szeroko omówione w SE Jednak celem pod DTO jest zebranie w jednej odpowiedzi tylu informacji, ile uzna za konieczne, aby klienci mogli zapisać połączenia z serwerem. Co sprawia, że komunikacja klient-serwer jest płynniejsza.Odpowiedzi:
Za każdym razem, gdy programista pyta „po co to robić?”, Tak naprawdę ma na myśli „nie widzę przypadku, w którym robienie tego przynosi korzyść”. W tym celu przedstawię kilka przykładów.
Wszystkie przykłady będą oparte na tym prostym modelu danych:
Możesz założyć, że aplikacja korzysta z tych danych na wiele różnych sposobów (raporty, formularze, wyskakujące okienka ...).
Cała aplikacja już istnieje. Wszystko, o czym wspominam, to zmiana istniejącej bazy kodu. Należy o tym pamiętać.
Przykład 1 - Zmiana podstawowej struktury danych - Bez DTO
Wymagania się zmieniły. Wiek osoby musi być dynamicznie pobierany z rządowej bazy danych (załóżmy na podstawie imienia i nazwiska).
Ponieważ nie musisz już przechowywać
Age
wartości lokalnie, dlatego należy ją usunąć zPerson
encji. Ważne jest, aby zdać sobie sprawę, że jednostka reprezentuje dane bazy danych i nic więcej. Jeśli nie ma go w bazie danych, nie ma go w encji.Gdy pobierzesz wiek z rządowego serwisu internetowego, będzie on przechowywany w innym obiekcie (lub int).
Ale twój interfejs nadal wyświetla wiek. Wszystkie widoki zostały skonfigurowane do korzystania z
Person.Age
właściwości, która już nie istnieje. Pojawia się problem: wszystkie widoki odnoszące się doAge
osoby muszą zostać naprawione .Przykład 2 - Zmiana podstawowej struktury danych - Z DTO
W starym systemie, istnieje również
PersonDTO
jednostka z tych samych pięciu właściwości:Id, FirstName, LastName, Age, CityId
. Po pobraniu aPerson
warstwa usługi przekształca ją w a,PersonDTO
a następnie zwraca.Ale teraz wymagania się zmieniły. Wiek osoby musi być dynamicznie pobierany z rządowej bazy danych (załóżmy na podstawie imienia i nazwiska).
Ponieważ nie musisz już przechowywać
Age
wartości lokalnie, dlatego należy ją usunąć zPerson
encji. Ważne jest, aby zdać sobie sprawę, że jednostka reprezentuje dane bazy danych i nic więcej. Jeśli nie ma go w bazie danych, nie ma go w encji.Jednakże, ponieważ masz pośrednika
PersonDTO
, ważne jest, aby zobaczyć, że klasa ta może utrzymać sięAge
nieruchomość. Warstwa usługi pobierzePerson
plik, przekształci go wPersonDTO
, a następnie pobierze wiek osoby z rządowego serwisu internetowego, zapisze tę wartośćPersonDTO.Age
i przekaże ten obiekt.Ważną kwestią jest to, że każdy, kto korzysta z warstwy usług, nie widzi różnicy między starym a nowym systemem . Obejmuje to twój frontend. W starym systemie otrzymał pełny
PersonDTO
obiekt. A w nowym systemie nadal otrzymuje pełnyPersonDTO
obiekt. Widoki nie muszą być aktualizowane .To mamy na myśli, gdy używamy wyrażenia rozdzielającego obawy : Istnieją dwa różne obawy (przechowywanie danych w bazie danych, prezentacja danych w interfejsie użytkownika) i każdy z nich potrzebuje innego typu danych. Nawet jeśli te dwa typy danych zawierają teraz te same dane, może się to zmienić w przyszłości.
W podanym przykładzie
Age
jest różnica między dwoma typami danych:Person
(jednostka bazy danych) nie potrzebujeAge
, alePersonDTO
(typ danych interfejsu użytkownika) jej potrzebuje.Dzięki oddzieleniu problemów (= tworzenie oddzielnych typów danych) od początku baza kodów jest znacznie bardziej odporna na zmiany wprowadzone w modelu danych.
Mógłbym podać więcej przykładów, ale zasada zawsze będzie taka sama.
Podsumowując
Person
)Name
. Ale tylko dlatego, że wszystkie mająName
właściwość, nie oznacza, że powinniśmy sprawić, aby dziedziczyli po wspólnejEntityWithName
klasie bazowej. RóżneName
właściwości nie mają znaczącego związku.Name
zostanie zmienionaTitle
lub ktoś otrzyma znak „FirstName
i”LastName
), będziesz musiał poświęcić więcej wysiłku, aby cofnąć dziedzictwo, którego nawet nie potrzebowałeś .Jako ogólną zasadę, aby rozważyć rozdzielenie problemów, pomyśl o tym w ten sposób:
Załóżmy, że wszystkie problemy (interfejs użytkownika, baza danych, logika) są obsługiwane przez inną osobę w innym miejscu. Mogą komunikować się tylko przez e-mail.
W dobrze wyodrębnionej bazie kodu zmiana konkretnego problemu musi być obsługiwana tylko przez jedną osobę:
Gdyby wszyscy ci programiści korzystali z tej samej
Person
jednostki, a do encji wprowadzono niewielką zmianę, wszyscy musieliby być zaangażowani w proces.Ale dzięki zastosowaniu osobnych klas danych dla każdej warstwy problem ten nie jest tak powszechny:
PersonDTO
obiekt, deweloper biznesowy i interfejs użytkownika nie przejmują się tym, że zmienił sposób przechowywania / pobierania danych.Kluczowym zwrotem jest to, że nie ma na nie wpływu . Wdrożenie dobrego rozdziału problemów ma na celu zminimalizowanie wpływu na inne strony (a zatem konieczność zaangażowania).
Oczywiście, niektóre poważne zmiany nie mogą uniknąć włączenia więcej niż jednej osoby, np. Kiedy do bazy danych dodawany jest zupełnie nowy byt. Ale nie należy lekceważyć ilości drobnych zmian, które należy wprowadzić w trakcie życia aplikacji. Poważne zmiany to mniejszość liczbowa.
źródło