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ę :)

- Rejestracja:prawie 6 lat
- Ostatnio:4 minuty
- Postów:102

- Rejestracja:prawie 8 lat
- Ostatnio:9 miesięcy
- Postów:671
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.
Czy klasy nie mają domyślnie pustego publicznego konstruktora? Czy teraz trzeba go w C# deklarować?

- Rejestracja:prawie 6 lat
- Ostatnio:4 minuty
- Postów:102
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.

- Rejestracja:prawie 8 lat
- Ostatnio:9 miesięcy
- Postów:671
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?

- Rejestracja:prawie 6 lat
- Ostatnio:4 minuty
- Postów:102
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?

- Rejestracja:prawie 8 lat
- Ostatnio:9 miesięcy
- Postów:671
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ć.