Grube Modelki i chude Kontrolery brzmi jak tworzenie God models [closed]

Czytałem wiele blogów, które opowiadają się za podejściem grubych modeli i Chudy kontrolerów , esp. Obóz Rails. W rezultacie routery w zasadzie tylko zastanawiają się, jaką metodę wywołać kontroler, a wszystko, co robi metoda kontrolera, to wywołanie odpowiedniej metody w modelu, a następnie wywołanie widoku. Więc mam tu dwie obawy, których nie rozumiem:

    [5]}kontroler i router tak naprawdę nie wykonują wielu różnych zadań poza wywołanie metody opartej na modelu podobnym do Boga na podstawie trasy. Modelki robią za dużo. Wysyłanie wiadomości e-mail, tworzenie relacji, usuwanie i modyfikowanie innych modeli, kolejkowanie zadań itp. Zasadniczo teraz masz obiekty podobne do Boga, które mają robić wszystko, co może, ale nie musi dotyczyć modelowania i radzenia sobie z danymi.

Gdzie wyznaczasz granicę? Czy to nie jest po prostu wpadanie w wzorzec Boga?

Author: James A Mohler, 2012-12-26

3 answers

to może nie być najlepszy pomysł, aby spojrzeć na Rails jako podstawę wzorca projektowego MVC. Wspomniany framework został stworzony z pewnymi nieodłącznymi niedociągnięciami (trochę rozwinąłem go w innym poście ) i społeczność dopiero teraz zaczęła zajmować się Falloutem. Możesz spojrzeć na rozwój DataMapper2 jako pierwszy ważny krok.

Jakaś teoria

Ludzie udzielający takich rad wydają się być dotknięci dość powszechnym błędnym przekonaniem. Więc pozwól mi zacznij od wyjaśnienia: Model, w nowoczesnym wzorcu projektowym MVC, nie jest klasą ani obiektem. Model jest warstwą.

Podstawową ideą wzorca MVC jest rozdzielenie obaw a pierwszym krokiem w nim jest podział między warstwą prezentacji i warstwą modelu. Podobnie jak warstwa prezentacji dzieli się na Kontrolery( instancje, odpowiedzialne za wprowadzanie danych przez użytkownika), widoki (instancje, odpowiedzialne za logikę interfejsu użytkownika) i szablony/układy, tak samo model warstwa.

Główne części, z których składa się warstwa modelu, to:

  • Domain Objects

    Znane również jako encje domeny, obiekty biznesowe lub obiekty modelowe(nie lubię tej drugiej nazwy, ponieważ tylko dodaje zamieszania). Te struktury są tym, co ludzie zwykle błędnie nazywają "modelami". Są one odpowiedzialne za przechowywanie reguł biznesowych (cała matematyka i Walidacja dla określonej jednostki logiki domeny).

  • Przechowywanie Abstrakcje:

    Zwykle zaimplementowane przy użyciu wzorcadata mapper (nie mylić z ORMs , które nadużywały tej nazwy). Instancje te zwykle mają za zadanie przechowywanie informacji-z obiektów domain i ich pobieranie-do obiektów domain. Każdy obiekt domeny może mieć kilka maperów, podobnie jak istnieje kilka form przechowywania (DB, cache, session, cookies, / dev / null).

  • Usługi:

    Struktury odpowiedzialne za logikę aplikacji (czyli, interakcja między obiektami domenowymi i interakcja między obiektami domenowymi i abstrakcjami pamięci). Powinny one działać jak "interfejs", przez który warstwa prezentacji współdziała z warstwą modelu. To zwykle jest to, co w kodzie typu Rails kończy się w kontrolerach.

Istnieje również kilka struktur, które mogą znajdować się w przestrzeniach między tymi grupami: DAOs, jednostki pracy i repozytoria .

Oh ... a kiedy mówimy (w kontekście sieci) o użytkowniku , który współdziała z aplikacją MVC, nie jest człowiekiem. "Użytkownik" to w rzeczywistości twoja przeglądarka internetowa.

A co z bóstwami?

Zamiast mieć jakiś straszny i monolityczny model do pracy, Kontrolery powinny współdziałać z usługami. Przekazujesz dane z danych wejściowych użytkownika do określonej usługi(na przykład MailService lub RecognitionService). W ten sposób kontroler zmienia stan warstwy modelu, ale odbywa się to za pomocą przejrzystego API i bez mieszania się z wewnętrznymi strukturami (co powodowałoby nieszczelną abstrakcję).

Takie zmiany mogą spowodować natychmiastową reakcję lub wpłynąć tylko na dane żądane przez instancję widoku z warstwy modelu, lub oba te czynniki.

Każda usługa może wchodzić w interakcje z dowolną liczbą (choć zazwyczaj jest to tylko garstka) obiektów domeny i abstrakcji pamięci masowej. Na przykład RecogitionService nie może się mniej przejmować abstrakcjami przechowywania artykułów.

Zamknięcie uwagi

W ten sposób otrzymujesz aplikację, która może być testowana jednostkowo na dowolnym poziomie, ma niskie sprzężenie (jeśli jest poprawnie zaimplementowana) i ma wyraźnie zrozumiałą architekturę.

Należy jednak pamiętać: MVC nie jest przeznaczony dla małych aplikacji. Jeśli piszesz stronę księgi gości za pomocą wzorca MVC, robisz to źle. Ten wzór jest przeznaczony do egzekwowania prawa i porządku w aplikacjach na dużą skalę.

dla osób, które używają PHP jako języka podstawowego, ten post może być istotny. Jest to nieco dłuższy opis warstwy modelu z kilkoma fragmentami kodu.

 115
Author: tereško,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:05

Jeśli klasy" modelowe " są źle zaimplementowane tak, twój problem jest istotny. Klasa modelu nie powinna wykonywać e-maili (zadań infrastrukturalnych).

Prawdziwe pytanie brzmi, co oznacza model w MVC. Nie jest ograniczony do klas POCO z kilkoma metodami. Model w MVC oznacza Dane i logikę biznesową. Traktuj go jako superset klasycznych modeli core POCO.

Widok = = = = Controller = = = Model - - - > Business Process layer --> Core models

Dorzuć infrastrukturę zespoły i warstwy dostępu do danych i użyj wtrysku, aby przekazać je do BPL, a następnie proces a wykorzystuje MVC zgodnie z przeznaczeniem.

BPL może wywoływać wzorce UOW / Respository, a także wykonywać reguły biznesowe i wywoływać funkcje infrastruktury za pomocą wtryskiwanych obiektów lub wzorców interfejsu.

Więc zalecenie, aby utrzymać kontroler chudy nie oznacza, że Klasa" person " w klasycznym modelu Core powinna mieć 50 metod i dzwonić bezpośrednio na e-mail. Masz rację myśląc, że to źle.

Kontroler może być nadal zobowiązany do tworzenia instancji i wstrzykiwania klas infrastruktury do warstwy BPL lub warstwy rdzenia, jeśli zostanie wywołany bezpośrednio. Powinna istnieć warstwa biznesowa lub przynajmniej klasy orkiestrujące wywołania między klasycznymi klasami modelu obiektowego. Cóż to i tak Mój "widok"; -)

Dla generic take on MVC opis wiki http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Mały Blog, który mówi o " M " W MVC. http://www.thedeveloperday.com/skinny-controllers/

 5
Author: phil soady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-26 19:29:32

Myślę, że można dokonać rozróżnienia pomiędzy pojedynczym modelem fat (ewentualnie nazwaną aplikacją lub aplikacją), a kilkoma modelami fat podzielonymi na grupy logiczne (biznes, Klient, zamówienie, wiadomość). Ten ostatni sposób jest w jaki układam moje aplikacje, a każdy model z grubsza odpowiada tabeli bazy danych w relacyjnej bazie danych lub kolekcji w bazie danych dokumentów. Modele te obsługują wszystkie aspekty tworzenia, aktualizowania i manipulowania danymi, które tworzą model, niezależnie od tego, czy jest to rozmowa z bazy danych lub wywołanie API. Kontroler jest bardzo cienki odpowiedzialny za małe mor, które wywołanie odpowiedniego modelu i wybranie szablonu.

 -1
Author: Bryan Young,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-26 18:54:30