2010-04-22 13 views
8

Wikipedia opisuje Single Responsibility Principle ten sposób:Czy tradycyjne użycie kontrolera w MVC prowadzi do naruszenia zasady pojedynczej odpowiedzialności?

Jednolity Odpowiedzialność Zasada stanowi, że każdy obiekt powinien mieć jeden odpowiedzialność i że odpowiedzialność powinna być całkowicie zamknięta przez klasę. Wszystkie jego usługi powinny być ściśle powiązane z tą odpowiedzialnością.

Tradycyjne użycie kontrolera w MVC wydaje się prowadzić programistę w kierunku naruszenia tej zasady. Weź prosty kontroler księgi gości i zobacz. Kontroler może mieć dwie metody/akcje: 1) Indeks() i 2) Prześlij(). Indeks() wyświetla formularz. Funkcja Submit() je przetwarza. Czy te dwie metody reprezentują dwie odrębne obowiązki? Jeśli tak, to w jaki sposób wchodzi pojedyncza odpowiedzialność?

Odpowiedz

8

Tak jest.

A jeśli chcesz postępować zgodnie z SRP, zdezagreguj kontroler do Dispatchera i Działania; Dyspozytor przekazuje kontrolę do swoich działań, a podczas kompilacji (szablony C++) lub w czasie wykonywania (Java XML, cokolwiek) tworzysz dyspozytorów i akcje.

Dlaczego nie widzimy tego częściej? Ponieważ kontrolery są często implementacjami "ad hoc", klasy betonu na poziomie liścia, które nie są uogólnione i nie mają być poddane subklasie. W tym przypadku klasa służy raczej do wygodnego grupowania kodu, działania są prawie na pewno niepubliczne (prawdopodobnie prywatne, może chronione), "tylko" wewnętrzne szczegóły implementacji.

Wybór sposobu decydowania o tym, do czego należy wysłać przesyłkę, liczbę i różnorodność możliwych działań, jest wysoki, a wysyłanie i działanie są ściśle powiązane. W praktyce często łatwiej jest po prostu umieścić kod w jednym miejscu.

4

Nie, nie ma.

Nie ma nic nieodłącznego w strukturze MVC lub jej odmianach, które prowadzą do naruszenia zasady Single Responsibility Principle. To, czy implementacja kontrolera narusza SRP, czy nie, opiera się na tym, czy zachowanie kapsułkowane ma więcej niż jeden powód do zmiany (tak jak każda inna klasa), a nie z powodu jakiegokolwiek domniemanego nakazowego użycia wzorca.

Podany przykład stanowi podzestaw podstawowych formularzy nad aplikacją danych, w której kontroler udostępnia jedynie operacje CRUD dla danego modelu. Operacje CRUD mają dość spójny charakter, więc generalnie nie stanowi to naruszenia SRP. Tam, gdzie wiele metod na pojedynczym kontrolerze zaczyna się podejrzewać, jest to, gdy metody reprezentują różne interakcje behawioralne w domenie.

To powiedziawszy, nawet jeśli ktoś, kto twierdzi, że CRUD reprezentuje cztery oddzielne niespójne kwestie, nie ma nic nieodłącznego w strukturze MVC, która zmusza do ułatwienia każdej z tych czynności w ramach tego samego kontrolera.

Dla małej historii na wzór MVC, a także kilka dyskusji na temat jej zastosowania w rozwoju sieci, kasy Interactive Application Architecture Patterns.

+0

Zgadzam się, sam w sobie nie narusza wzoru MVC, ale zachęca do - gdzie zamierzasz wprowadzić nowe działanie związane z użytkownikiem? Dlaczego, w UserController oczywiście. Wkrótce wyrośnie spod kontroli, wypełniona metodami działania, które nie są zależne od siebie nawzajem, ale są zgrupowane tylko dlatego, że są wygodne. Rozpocząłem dyskusję [tutaj] (https://gist.github.com/mindplay-dk/5505023) w celu omówienia idei rezygnacji ze sterowników i grupowania akcji w przestrzenie nazw. –

Powiązane problemy