Czy istnieje potrzeba klasy fabrycznej do tworzenia modeli?

17

Mój kolega zasugerował użycie klasy fabrycznej do tworzenia obiektów viewmodel w naszych rozwiązaniach ASP.NET MVC. Chodzi o to, że może pomóc w projektowaniu i utrzymywaniu sposobu, w jaki viewmodels są wbudowane w nasze aplikacje.

Chciałem dowiedzieć się, czy ktokolwiek ma takie doświadczenie. Przeprowadziłem pewne badania i bardzo niewiele znalazłem na temat tej praktyki.

Obecnie tworzymy obiekty viewmodel na poziomie kontrolera np

public ActionResult Index()
{
    return this.View(this.BuildIndexViewModel());
}

Więc this.BuildIndexViewModel () jest odpowiedzialny za tworzenie klasy viewmodel (oczywiście :). Ale zastanawiamy się nad możliwością:

public ActionResult Index()
{
    return this.View(ViewModelFactory.CreateIndexViewModel());
}

To ciekawy pomysł, ale nie jestem w 100% przekonany. Byłem zainteresowany opiniami innych ludzi na ten temat.

Jason Evans
źródło
4
Szczerze mówiąc, walczę o to, by korzyść była. Użyłbyś fabryki do ukrywania konstrukcji obiektów, ale dlaczego miałbyś w tym przypadku?
CodeART
3
Twoja metoda BuildIndexViewModel jest już metodą fabryczną, która prawdopodobnie jest prywatna dla kontrolera. Jedynym powodem do wyodrębnienia tego do odrębnej klasy fabrycznej byłoby ponowne użycie go w innym kontrolerze.
MattDavey,
Obaj dzielicie się tymi samymi przemyśleniami, co ja, więc cieszę się, że nie jestem sam :) @MattDavey Mogę szczerze powiedzieć, że bardzo wątpię, że modele widokowe będą używane z więcej niż jednym kontrolerem, co czyni fabrykę pomysł zbędny. Podzielę się tym, gdy temat pojawi się ponownie w pracy.
Jason Evans,
Osobiście wolałbym, aby typ viewmodel był ekspertem od samego procesu konstruowania. Jedynym czasem, w którym wiedza specjalistyczna powinna leżeć gdzie indziej, jest to, że konstrukcja wymaga znajomości innych obszarów zastosowań (np. Repozytoriów), w którym to przypadku możesz chcieć, aby pośrednik zachował głupotę
modelu widzenia
@MattDavey: Czy możesz zawrzeć te dwa komentarze w odpowiedzi, którą mogę głosować?
pdr

Odpowiedzi:

8

W tym przypadku powiedziałbym, że najlepszą wskazówką będzie GRASP zasady . W szczególności spójrz na cztery kryteria przypisywania tworzenia obiektu:

Zasadniczo klasa B powinna być odpowiedzialna za tworzenie instancji klasy A, jeśli ma zastosowanie jeden lub więcej z poniższych

  • Instancje B zawierają lub kompozycyjnie agregują instancje A
  • Instancje rekordów B instancji A
  • Instancje B ściśle wykorzystują instancje A
  • Instancje B mają informacje inicjujące dla instancji A i przekazują je przy tworzeniu.

Klasa kontrolera (B) odpowiada elementom nr 3 i # 4 na tej liście (i nr 2, jeśli model viewmodelowany jest z powrotem), więc jest to już bardzo rozsądne miejsce dla zachowania konstrukcyjnego viewmodel (A). Moim zdaniem istnieją tylko dwa powody, które zmusiłyby mnie do wyodrębnienia tego zachowania konstrukcyjnego do klasy specjalistycznej.

  • OSUSZANIE - Jeśli dwa lub więcej kontrolerów musi współdzielić zachowanie konstrukcyjne viewmodel, umieszczenie go w osobnym komponencie ułatwi ponowne użycie kodu i uniknie powielania.
  • Jeśli zachowanie konstrukcyjne jest zależne od innych komponentów systemu, takich jak repozytoria, walidatory itp., I nie chcesz wprowadzać tego połączenia do samego kontrolera (w kategoriach GRASP, czysta produkcja).

Patrząc wstecz na te 4 kryteria tworzenia obiektów w GRASP, wyciągnęłbym to zachowanie do osobnej fabryki, gdyby zyskało mi to dodatkowe zaznaczenie na tej liście. W przeciwnym razie nie byłoby w tym żadnej wartości.

Mam nadzieję, że to pomaga!

MattDavey
źródło