Ile logiki biznesowej powinno istnieć w warstwie kontrolera?

39

Czasami mamy logikę biznesową reprezentowaną w kodzie kontrolera naszych aplikacji. Jest to zwykle logika, która odróżnia metody do wywołania od modelu i / lub argumenty, które należy przekazać.

Innym przykładem tego jest zestaw funkcji narzędziowych istniejących w kontrolerze, które mogą pracować w celu sformatowania lub odkażenia danych zwróconych z modelu, zgodnie z zestawem reguł biznesowych.

To działa, ale zastanawiam się, czy to flirtuje z katastrofą. Jeśli logika biznesowa jest współużytkowana przez kontroler i model, dwie warstwy nie są już możliwe do rozdzielenia, a osoba dziedzicząca kod może być zdezorientowana tą nierównością w lokalizacji kodu związanego z logiką biznesową.

Moje pytanie brzmi: ile logiki biznesowej powinno być dozwolone w kontrolerze i w jakich okolicznościach, jeśli w ogóle?

jellyfishtree
źródło
1
Świetne pytanie. Z niecierpliwością czekam na opinie ludzi.
Nathan Taylor,

Odpowiedzi:

20

Idealnie brak

Ale to nie zawsze jest możliwe. Nie mogę podać ci twardych liczb, takich jak 20% lub 10 linii, co jest subiektywne do tego stopnia, że ​​nie można na nie odpowiedzieć. Potrafię opisać, w jaki sposób wykorzystuję wzorce projektowe i okoliczności, które wymagają ich lekkiego zgięcia.

Moim zdaniem zależy to wyłącznie od celu aplikacji. Budujesz prosty interfejs API REST, na który możesz pisać? Zapomnij o czystej separacji, a nawet wzorze. Możesz wypuścić działającą wersję w niecałą godzinę. Budujesz coś większego? Prawdopodobnie najlepiej nad tym popracować.

Celem jest budowanie indywidualnie zawartych systemów. Jeśli zaczniesz pisać logikę biznesową, która jest specyficzna dla interakcji między dwoma systemami, jest to problem. Nie zagłębiając się w to, nie mogę wyrazić opinii.

Wzory projektowe są formami, niektórzy lubią je ściśle przestrzegać na podstawie głównego i dobrze napisanego kodu. Ściśle przestrzeganie wzorca prawdopodobnie nie da ci złego kodu, ale może zająć więcej czasu i spowodować, że napiszesz o wiele więcej kodu.

Wzory projektowe są elastyczne, dostosuj je do swoich potrzeb. Zbyt mocno je zginaj, ale pękają. Wiedz, czego potrzebujesz i wybierz wzór projektowy najbliższy temu.

Josh K.
źródło
10

Jak najmniej. Najlepiej żaden.

Administrator powinien martwić się przyjęciem żądania, poproszeniem właściwej usługi domeny o przetworzenie żądania i przekazaniem odpowiedzi na poprawny widok.

W tym procesie cała „logika biznesowa” powinna istnieć w usługach domenowych.

Jeśli masz funkcjonalność, która usuwa z nich obiekty domeny i tworzy z nich viewmodels, może to rozsądnie współistnieć z kontrolerem. Ale powinien to być kod, który istnieje tylko ze względu na odpowiednie widoki. Jeśli istnieje zasada biznesowa dotycząca czyszczenia danych, powinna istnieć na poziomie domeny / usługi (z odpowiednimi testami jednostkowymi).

Eric King
źródło
10

Termin „logika biznesowa” jest często mylący, ponieważ ludzie mają różne opinie na temat tego, co to oznacza. Moim zdaniem pojęcie „logika biznesowa” obejmuje dwa obszary

  • Logika domeny
  • Logika aplikacji

Logika domeny jest logiką związaną z kluczowym obszarem, z którym związana jest Twoja działalność, więc jeśli piszesz aplikację dla księgowych, wówczas reguły podatkowe, zasady prowadzenia ksiąg rachunkowych itp. Są częścią logiki domeny.

Logika aplikacji jest logiką związaną z uruchomieniem programu komputerowego. Mogą to być takie elementy, jak eksport importu CSV, kreatory itp. Mogą również zawierać takie elementy, jak tworzenie zapomnianych wiadomości e-mail z hasłem.

„Logiką biznesową”, którą można umieścić w warstwie kontrolera, jest logika aplikacji. Może nie cała logika aplikacji powinna tam iść. Ale nigdy nie należy umieszczać logiki domeny w warstwie kontrolera. Powinno to oczywiście znajdować się w warstwie domenowej.

Mówiłeś o logice formatowania lub dezynfekcji danych. Formatowanie musi być zdecydowanie logiką aplikacji. Z drugiej strony, odkażanie może być logiką domeny, jeśli odkażanie danych opiera się na regułach domeny. To zależy od kontekstu.

Pete
źródło
4

Kontrolery powinny być bardzo lekkie w logice domeny.

Administratorzy powinni delegować zadania, takie jak pobieranie rekordu ze składnicy danych poprzez abstrakcyjną warstwę usługi / repozytorium i przekazywanie danych z powrotem do magazynu danych przez tę samą (lub powiązaną) usługę. Jeśli chodzi o mechanikę i drobniejsze działania między tymi operacjami, zwykle należą one gdzie indziej niż do kontrolera.

Często zdarza mi się dodawać do moich kontrolerów małe metody czyszczenia danych, które zapisują dane z powrotem do sklepu i chociaż jest to skuteczne rozwiązanie, nie pasuje ono do zamierzonej roli kontrolera. Idealnie byłoby, gdyby wszystko, co będzie modyfikowało, sprawdzało lub analizowało twój model, powinno odbywać się bardzo blisko, jeśli nie w samym modelu. Na przykład, jeśli musisz „wyczyścić” obiekt modelu przed jego zapisaniem, rozważ zastosowanie metody SanitizeInputs () w modelu lub w ramach usługi, która obsługuje przechowywanie modelu.

Nathan Taylor
źródło
3

Z pragmatycznego punktu widzenia odkryłem, że albo logika w twoim kontrolerze, albo zachowanie kontrolera w twoim modelu, kiedy próbujesz zrobić coś, co nie jest dobrym podejściem zgodnym ze wzorcami. Podwójnie, jeśli piszesz aplikację, która nie ma za sobą dużej infrastruktury.

Możesz iść w obie strony, ale zwykle próbuję zastanowić się, czy ten dziwny bit prawdopodobnie pojawi się w więcej niż jednej akcji kontrolera, jeśli tak, to w modelu. Jeśli nie jest to jasne, staram się zastanowić, czy bardziej pasuje do jednego miejsca niż drugiego. W przeciwnym razie zwykle umieszczam go w modelu tylko po to, aby trzymać go z dala od kontrolera (osobiste preferencje dla mniejszych kontrolerów i silniejszych obiektów danych, YMMV)

Trzecią opcją byłoby odwołanie się do przedmiotów użyteczności jako oddzielnej klasy użyteczności, ale zdaniem wielu jest to nieco sprzeczne z wzorcem.

Również dlatego, że nie przestrzegasz ściśle wzorca, niekoniecznie flirtujesz z katastrofą. O ile nie spodziewasz się, że znaczna ilość kodu zostanie ponownie wykorzystana w tym projekcie, martwiłbym się o wiele bardziej o spójność projektu z samym sobą (tj .: nie przerzucaj klapkami w miejscu, w którym umieszczasz te bity po wybraniu lokalizacji) niż ponowne napisanie, że z jakiegoś powodu chce zaoszczędzić część środka projektu. Dokumentuj / komentuj, gdzie i dlaczego odszedłeś od wspólnego wzorca i zdefiniuj oczekiwany wzorzec dla tej aplikacji.

MVC w pewnym momencie było odchyleniem od ustalonych wzorców.

Rachunek
źródło
3

Podobnie jak wiele innych interesujących pojęć w programowaniu, MVC jest potężnym paradygmatem, który wprowadza strukturę i skupia się na rodzinie bliskich lub podobnych strategii w celu wdrożenia określonych scenariuszy.

Podobnie jak wiele innych koncepcji programistycznych, MVC upraszcza rzeczywistość, odrzuca drobne szczegóły i zapewnia surowy model szkieletowy do naśladowania. Podobnie jak wiele innych uproszczeń rzeczywistości, ma to na celu doprowadzenie struktury do chaosu widzianego przez ludzki umysł.

Mimo to, podobnie jak wiele innych koncepcji programistycznych, MVS to tylko uproszczenie rzeczywistości. To nie jest idealne i nie jest dokładne. Dlatego nie można dopasować scenariusza z rzeczywistego świata do uproszczonego modelu. Stąd wiele pytań podobnych do tego.

  • Ile logiki powinno przejść do kontrolera?

  • Czy widok powinien zawierać logikę warunkową?

  • Czy model powinien zawierać dodatkowe dane, które nie znajdują się bezpośrednio w podmiotach gospodarczych?

Są to wszystkie pytania zrodzone w celu precyzyjnego i pełnego dopasowania kodu do idei MVC.

Moja odpowiedź brzmi: nie próbuj. MVC zapewnia strukturę. Zbuduj aplikację wokół tego fundamentu, ale nie oczekuj, że będzie idealnie pasować. Będą odchylenia, to normalne. Po prostu obserwuj, aby mieć je pod kontrolą.


źródło