Kto powinien obsługiwać warunki w złożonych zapytaniach, programie odwzorowującym dane lub warstwie usługi?

to pytanie wykonałem bardzo dobrą robotę, usuwając nieco zamieszanie w tej sprawie, ale mam trudności ze znalezieniem wiarygodnych źródeł na temat dokładnych ograniczeń warstwy usług.

W tym przykładzie załóżmy, że mamy do czynienia z książkami i chcemy uzyskać książki od autora. TheBookDataMapper może mieć rodzajowyget() metoda, która akceptuje warunki takie jak unikalny identyfikator książki, nazwisko autora itp. Ta implementacja jest dość trywialna (logicznie), ale co, jeśli chcemy mieć wiele warunków, które wymagają bardziej złożonego zapytania?

Powiedzmy, że chcemy dostać całą książkę napisaną przez pewnego autora pod konkretnym wydawcą. Możemy rozwinąćBookDataMapper->get() metoda analizowania wielu warunków lub możemy napisać nową metodę, taką jakBookDataMapper->getByAuthorAndPublisher().

Czy lepiej jest, aby warstwa usług nazywała te [bardziej szczegółowe] metody bezpośrednio, czy warunki zostały przeanalizowane przed wywołaniem bardziej ogólnegoBookDataMapper->get() metoda z wieloma warunkami? W drugim scenariuszu warstwa usług zrobiłaby więcej logicznego „ciężkiego podnoszenia”, pozostawiając program mapujący dane dość prosty. Pierwsza opcja spowodowałaby prawie całkowite zredukowanie warstwy usług tylko do pośrednika, pozostawiając logikę warunkową do mapowania danych w metodach takich jakBookDataMapper->getByAuthorAndPublisher().

Oczywistym problemem związanym z pozwoleniem warstwie usługi na analizowanie warunków jest to, że część logiki domeny wycieka z programu odwzorowującego dane. (wyjaśniono to w powiązanym pytaniututaj. Jeśli jednak warstwa usług miała obsługiwać warunki, logika nie wydostałaby się z warstwy modelu; Kontroler zadzwoni$book_service->getByAuthorAndPublisher() bez względu.

questionAnswers(2)

yourAnswerToTheQuestion