Prośba o review apki w WPF

0

Napisałem prostą aplikację do tworzenia fotomozaiki i chciałbym się dowiedzieć jak można by zrobić to lepiej. Podejrzewam że modele są do zaorania, ale to moje pierwsze kroki w oop i nie wiem jak to zrobić tak, żeby miało sens.
Także chętnie przyjmę wszelkie uwagi, wskazówki i krytykę :)

https://github.com/Qbelek/MozaicGenerator

0

Dawno już w WPF (jak i w ogóle w C#) nie rzeźbiłem, ale wywołania System.Windows.MessageBox.Show w kodzie ViewModeli chyba nie są prawidłową praktyką.

Niektóre praktyki każą mi też podejrzewać, że ja tego C# kompletnie już chyba zapomniałem.

Np. https://github.com/Qbelek/MozaicGenerator/blob/master/Mozaic/GUIv2/Handlers/OperationCancelledEventHandler.cs

Czy klasy nie mają domyślnie pustego publicznego konstruktora? Czy teraz trzeba go w C# deklarować?

0

Co do MessageBoxów to całkiem możliwe, że nie do tego służą. Jak wrzuciłem w googla jak wyświetlać komunikaty to takie rozwiązanie znalazłem.
Tę klasę zrobiłem bo chciałem przerobić przerywanie wielowątkowych pętli, ale w międzyczasie doczytałem, że to by niczego nie zmieniło (wywoływanie stop() w pętli zamiast zabicia nadrzędnego wątku). I potem tak jakoś zostało :v
Generalnie dość chaotycznie ta apka powstawała, już jest w śmieciach i piszę to od nowa.

0
Qbelek napisał(a):

Co do MessageBoxów to całkiem możliwe, że nie do tego służą. Jak wrzuciłem w googla jak wyświetlać komunikaty to takie rozwiązanie znalazłem.

Nie napisałem, że MessageBoxy nie służą do wyświetlania komunikatów (jak sama nazwa wskazuje, owszem), tylko że miejsce takich wywołań nie jest w ViewModelach, bo nie do tego powinna slużyć warstwa ViewModel.

ViewModel - znów, jak wskazuje sama nazwa - powinien tylko modelować widok, a nie sam być widokiem. Inaczej mówiąc, powinien przedstawiać sobą, jak widok ma wyglądać. Ale w konkrety obleka się to dopiero w warstwie widoku, który - np. dzięki databindingowi - odzwierciedla sobą stan ViewModelu. Na tym polega rozdział warstw we wzorcu MVVM.

Zaletą tego jest rozdzielenie logiki dotyczącej widoku od samego widoku. Np. łatwo wtedy napisać testy jednostkowe do ViewModeli. A w jaki sposób napiszesz test jednostkowy do ViewModelu, który próbuje samodzielnie otwierać jakieś okna na ekranie?

0

Szczerze mówiąc nie pisałem jeszcze nigdy testów, więc nie wiem jakie problemy w związku z nimi się pojawiają. Na razie mam to na to-do liście.
To rozumiem, że żeby zrobić to lepiej powinienem np. wynik walidacji ustawiać jako flagę i potem ewentualnie wywoływać MessageBoxa z poziomu code behind widoku?

1

Nie może to być pewnie statyczna flaga, bo widok musi się jakoś o niej dowiedzieć - więc jakiś event czy coś w tym rodzaju. Albo w ogóle opakować MessageBoxy w jakąś abstrakcję (typu MessageService), której będzie sobie używać - i którą w testach dałoby się zastąpić jakąś zaślepką.

Nie upieram się co do szczegółów implementacji, bo od lat WPF nie tykałem.

Qbelek napisał(a):

Szczerze mówiąc nie pisałem jeszcze nigdy testów, więc nie wiem jakie problemy w związku z nimi się pojawiają.

To trochę tak, jakby powiedzieć, że złamania pojawiają się w związku ze zrobieniem prześwietlenia ;) Testy nie powodują problemów - przeciwnie, dzięki nim łatwiej je zauważyć.

1

No wiesz o co chodziło. Nie wiem jak powinienem pisać kod, żeby był łatwo testowalny :D
Dzięki za rady :)

0

Jak tak przeglądam to zastanawiam się, czy potrzebujesz w ogóle interfejsu IPageViewModel, skoro chyba wszystkie klasy, które go implementują i tak dziedziczą z ViewModelBase.

1 użytkowników online, w tym zalogowanych: 0, gości: 1