Autor Wątek: MVVM, C# i Kalkulator jako przykładowa aplikacja  (Przeczytany 3287 razy)

Offline Error.

  • Użytkownik

# Luty 11, 2012, 20:34:03
Witam!

Mój ostatni kod pobrało 0 osób, dlatego postanowiłem napisać coś krótkiego, abyście mogli spokojnie to przejrzeć i ocenić czy dobrze rozumiem zagadnienie wzorca MVVM.

To prosta aplikacja kalkulatora liczba całkowitych, prosiłbym abyście ją pobrali i sprawdzili czy napisałem ją w zgodzie z MVVM.

Dziękuję i pozdrawiam.


Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mwojt

  • Użytkownik

# Luty 11, 2012, 20:50:17
Podejrzewam że nikomu nie będzie się chciało tego spokojnie przeglądać i oceniać. Może znajdzie się jakiś dobry ludź, jednak sugerował bym forum dla programistów.

Offline fn2000

  • Użytkownik

# Luty 12, 2012, 00:16:34
Używaj String.IsNullOrEmpty bo == string.Empty strasznie kole w oczy :)

Poza tym konwertowanie stringów na inty aby wykonać obliczenia wskazują na sto czterdziesty level abstrakcji - TO NIE JEST właściwa droga. C# jest językiem "strongly typed" (nie wiem jak to jest po polsku), nie bój się korzystać z tej właściwości.

EDIT: Jeśli już rzucasz wyjątkami to łap je i obsługuj w sposób świadomy: to są podstawy, bez których nie ma co się pakować w eksperymenty z seksownymi w nazwie wzorcami.
« Ostatnia zmiana: Luty 12, 2012, 00:19:22 wysłana przez fn2000 »

Offline Error.

  • Użytkownik

# Luty 12, 2012, 02:22:35
Tzn tak, rzuciłem tam wyjątek tylko po to aby kod przeszedł przez kompilacje, nie ma innej opcji niż: +,-,*,/...
A jeżeli sam użył bym funkcji z innym działaniem - szybko wyłapał bym błąd - pojawienie się wyjątku.

Mógłbyś wyjaśnić jak bez konwertowania to zrobić? C# jest "silnie typowany" więc właśnie trzeba konwertować...




Offline fn2000

  • Użytkownik

# Luty 12, 2012, 12:33:16
Mógłbyś wyjaśnić jak bez konwertowania to zrobić? C# jest "silnie typowany" więc właśnie trzeba konwertować...

O właśnie - silnie typowany :)

Co do konwertowania to dlaczego nie przekażesz liczb do Liczba i Liczba2 jako double czy floaty?

Offline Error.

  • Użytkownik

# Luty 12, 2012, 18:32:24
Pobierając dane z kontrolki TextBox otrzymujemy string więc... Mógłbym ewentualnie konwertować je przed przypisaniem ale za specjalnej różnicy nie widzę.

Offline Error.

  • Użytkownik

# Luty 14, 2012, 01:21:49
@refresh

Nie lubię gdy nic nie odpisujecie bo to sugeruje że napisałem coś głupiego, mógłby ktoś mi wytłumaczyć co robię źle konwertując string na int? Jaka forma jest "lepsza / bardziej poprawna"?

Offline koirat

  • Użytkownik

# Luty 14, 2012, 02:05:32
Int32.TryParse to jest poprawna metoda.

Nie wiem jak to robisz ale jak chcesz aby ludzie ci coś sprawdzali to lepiej wklej kod na forum, nikt niema czasu bawić się w audyt twojego całego kodu.

Offline Xirdus

  • Redaktor

# Luty 14, 2012, 19:43:43
Nie wiem jak to robisz ale jak chcesz aby ludzie ci coś sprawdzali to lepiej wklej kod na forum, nikt niema czasu bawić się w audyt twojego całego kodu.
Wręcz przeciwnie. Szczególnie jak jest od cholery plików.

Offline koirat

  • Użytkownik

# Luty 14, 2012, 20:52:36
Ale to chyba nie wszystko tylko to co chce aby zostało sprawdzone.

Offline Xirdus

  • Redaktor

# Luty 14, 2012, 20:56:30
Chce żeby sprawdzono, czy dobrze zaimplementował wzorzec MVVM. Nie da się tego zrobić izolując jeden fragment kodu - bo wzorce są na wyższym poziomie abstrakcji niż kod źródłowy.

Offline gotji

  • Użytkownik

# Luty 15, 2012, 09:43:00
- Co do samego konwertowania w VM string -> int jest to zaciemnianie kodu. Do takich rzeczy jak sam zauważyłeś są 'converter'-y.
- Twój Model ciężko nazwać Modelem. Twój VM to połączenie VM i Modelu.
- Taką implementacją 'commands' zaciemniasz kod. Dużo lepiej to wygląda jak się implementuje obsługę 'commands' za pomocą metod anonimowych przy użyciu 'lambda expressions', wtedy od razu widać jak dany 'command' wygląda i szybciej się debuguje. Docenia się to podejście kiedy ma się kilka zagnieżdżonych asynchronicznych wywołań z 'callback'-ami.
- Brakuje VM 'locator'-a, który za pomocą 'bindings' zwracał  by odpowiedni VM dla widoku. Podpinasz VM w 'code behind' co nie jest dobrą praktyką.
To tyle co mi wpadło na pierwszy rzut oka. Pamiętaj też że MVVM to tylko 'guide lines' i  praktycznie każdy widzi idealną implementację trochę inaczej.

Dobra rada: jest trochę 'framework'-ów wspomagających MVVM, które ułatwiają bardzo życie. Ja np. do małych projektów używam 'MVVM Light Toolkit'.

Offline Error.

  • Użytkownik

# Luty 15, 2012, 18:00:23
Dzięki!
Mógłbyś wyjaśnić jak "poprawniej" podpiąć DataContext?

Offline gotji

  • Użytkownik

# Luty 15, 2012, 19:05:18
To jest przykład z 'template' MVVM LT do Silverlight-a. Na poziomie App resources tworzysz VMLocator:
...
<Application.Resources>
        <!--Global View Model Locator-->
        <vm:ViewModelLocator x:Key="Locator" />
</Application.Resources>
....

A w widoku podpinasz pod Data Context:

...
DataContext="{Binding Main, Source={StaticResource Locator}}
...

Gdzie Main to property ViewModelLocator zwracające ViewModel.

Dzięki temu podejściu masz czysty 'code behind'. Od biedy można bezpośrednio stworzyć 'resource' z VM, ale trzeba pamiętać, żeby VM posiadał bezparametryczny konstruktor(co jest częsta zbyt dużym ograniczeniem i dlatego stosuje się VMLocator). Dobrym pomysłem jest też zastosowanie 'IoC Container' do implementacji VMLocator-a.