2010-12-30 10 views
6

Lubię dążyć do DRY i oczywiście nie zawsze jest to możliwe. Muszę jednak podrapać się nad koncepcją, która wydaje się dość powszechna w MVC, czyli w "Modelu widoku".DRY vs Bezpieczeństwo i konserwacja w modelach MVC i View

Model widoku jest zaprojektowany tak, aby przekazywać do widoku tylko minimalną ilość informacji, zarówno pod kątem bezpieczeństwa, łatwości konserwacji, jak i problemów związanych z testowaniem. Rozumiem. To ma sens.

Jednak z perspektywy DRY model widoku po prostu powiela dane, które już posiadasz. Model widoku może być tymczasowy i używany tylko jako DTO, ale zasadniczo posiadasz dwie różne wersje tego samego modelu, co wydaje się naruszać zasadę DRY.

Czy modele widoku naruszają DRY? Czy są zło konieczne? Czy robią więcej dobrego niż złego?

Odpowiedz

4

Zostało to raz za razem. Nie tylko jest to dość istotne dupe, ale odpowiedź jest subiektywna i argumentująca. ViewModels są odpowiedzią na DDD i koncepcję uporczywej ignorancji.

Powiedzenie, że nie używamy ViewModels jest złe oznacza ignorowanie tego, że Django i Rails oraz większość frameworków PHP ORM/MVC nie dba o te koncepcje. Czy chcesz, aby ktoś powiedział ci te wszystkie inne języki i ramy "robią to źle?".

To, czy chcesz używać ViewModels, czy nie, zależy w 100% od tego, jakie style architektury wybierasz i jakie są cele aplikacji.

To jest tak, jakby pytaniem było przeciąganie i upuszczanie widoku GridView w aplikacji WebForm? Zależy od wielu rzeczy.

Istnieje również błędne przekonanie na temat SUSZENIA, które tu masz. Czy klasy proxy z usługi WCF naruszają DRY? Czy ViewModel zawiera logikę? Podstawowym celem DRY jest brak zduplikowanej logiki w sensownym celu. Czy kilka DTO, które współdzielą obiekty obiektów, naruszają to?

Polecenie DDD dla kontekstów ograniczonych może również służyć do dobrego odczytu. Jeśli obiekt ShoppingCart musi funkcjonować inaczej w ustawieniach magazynu a witryny e-commerce, czy to oznacza, że ​​chcesz udostępniać typy? Co się dzieje, gdy jedyną wspólną funkcją jest łączenie ceny (cena + podatek + dostawa)? Czy tworzysz klasę bazową właśnie dlatego, aby zwiększyć sprzężenie? Jakie są kompromisy w czasie/kosztach/utrzymaniu dla 100% SUCHA dla prostej metody, takiej jak GetTotal(). Czy naruszanie DRY, gdy ma to sens, faktycznie zmniejsza złożoność i ogólny koszt utrzymania twojego kodu?

Przykro mi z powodu odpowiedzi na tak wiele pytań, ale mam nadzieję, że teraz możesz zobaczyć niuanse i zawiłości zadawanego pytania. ;)

+0

Przeprowadziłem wyszukiwanie przed opublikowaniem tego i nie mogłem znaleźć podobnych pytań.Było kilka związanych z silverlightem (ale viewmodels są tam zupełnie inne rzeczy) i trochę rzeczy związanych z szynami (być może nieco istotne, ale nie takie same). Pytam o to, ponieważ DRY jest jednym z głównych celów podejścia do szyn, na którym wzorowane jest MVC. Wydaje się, że MVC jest nieco schizofrenikiem co do zasad, które ceni czasami. –

+0

@Mystere Man - http://stackoverflow.com/search?q=viewmodels+DRY+[asp.net-mvc] – jfar

+0

Być może powinieneś faktycznie przeczytać wyniki. Żadne z nich nie ma zastosowania. –

2

Można również zauważyć, że niestosowanie modeli widoków stanowiłoby naruszenie zasady jednej odpowiedzialności - Twój podmiot nie powinien być zanieczyszczony problemami interfejsu użytkownika.

Uważam również, że prawdziwa wartość modeli widoku niekoniecznie musi być widoczna w wersji 1.0 aplikacji. Będziesz sobie wdzięczny, pracując nad wersją 2.0, gdy całkowicie pomyślisz o tym, jak działa twój back-end, ale nie musisz przenosić tych zmian do warstwy widoku.

+0

Naprawdę nie widzę, jak mogłoby to naruszyć SRP, ponieważ SRP jest bardziej kwestią kontrolera niż modelową. –

+0

SRP to problem dla każdej aplikacji w dowolnym miejscu. Jest to prawdopodobnie najważniejsza zasada OOP. –