MVVM vs MVC

Wątek zablokowany 2018-06-22 22:03 przez somekind.

0

Witam serdecznie :) Mam kilka pytań odnośnie różnic między wzorcami MVVM i MVC. Generalnie w MVVM:

  • View - kontrolki, widok okna, XAML, to co widzi użytkownik
  • ViewModel - pola do bindowania z widokiem, zapytania do bazy danych wszystkie metody, commandy itd.
  • Model - nasza struktura danych np. baza danych, typy itd.

Jeżeli coś źle rozumiem bardzo proszę o poprawienie. Natomiast teraz pytanie - jaka jest różnica między MVVM i MVC? Generalnie MVC działa bardzo podobnie (chyba) tj. mamy widok czyli to co widzi użytkownik, model czyli jakaś struktura danych, i kontroler który powoływany jest do życia przez wklepanie odpowiedniego adresu url (tutaj działa routing). Generalnie wszystkie działanie takie jak np. połącz z bazą -> pobierz -> przekaż do widoku także realizuje kontroler?

Visual Code
Popatrz gdzie stosuje się mvc a gdzie mvvm i jak działają.
mariano901229
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Postów:597
0

Dość ciekawy i dobry artykuł porównujący różne wzorce architektury - http://www.codeproject.com/Articles/66585/Comparison-of-Architecture-presentation-patterns-M . Z mojego punktu widzenia to Ci się na początku przyda.

Zarówno MVVM jak i MVC są wzorcami architektury, mają one na celu zorganizowanie struktury aplikacji. MVC jest dość popularny w aplikacjach webowych, w przypadku platformy .NET mamy oczywiście ASP.NET MVC, dla MVVM jest on naturalnie stosowany z aplikacjami tworzonymi w technologii WPF.

2
Biały Terrorysta napisał(a):
  • ViewModel - pola do bindowania z widokiem, zapytania do bazy danych wszystkie metody, commandy itd.

żadne zapytania do bazy danych ani metody, tylko wywoływanie metod z "modelu"
viewmodel ma być "adapterem" między modelem a widokiem - ma tak przystosować / zagregować dane żeby były możliwe do zbindowania przez widok - np wywoływanie wszelkich metod formatujących tekst, sumujących dane z wielu modeli do jednego pola itp

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
2
Biały Terrorysta napisał(a):
  • Model - nasza struktura danych np. baza danych, typy itd.

Model to logika biznesowa/domenowa/dziedzinowa, nie struktura danych.

Generalnie MVC działa bardzo podobnie (chyba) tj. mamy widok czyli to co widzi użytkownik, model czyli jakaś struktura danych, i kontroler który powoływany jest do życia przez wklepanie odpowiedniego adresu url (tutaj działa routing).

Żadnego urla, adresu ani routingu nie musi być. Można napisać konsolową aplikację zgodną z MVC. Kontroler po prostu obsługuje żądania użytkownika i przekazuje je do modelu (który jest warstwą, nie klasą), a z drugiej strony decyduje o tym, który widok użytkownikowi wyświetlić. Dlatego jest dobry dla aplikacji webowych, bo nie przechowuje żadnego stanu między żądaniami użytkownika.
Natomiast ViewModel w MVVM zawiera więcej logiki bo sam w sobie odpowiada za dwustronną komunikację między widokiem a modelem, trzyma ich stan, potrafi śledzić zmiany tego, co się zmieniło.

Generalnie wszystkie działanie takie jak np. połącz z bazą -> pobierz -> przekaż do widoku także realizuje kontroler?

Nie, za połączenia z bazą odpowiada warstwa dostępu do danych, obrobienie ich do czytelnej postaci to zadanie warstwy aplikacji (obie są elementami modelu), a kontroler jest gdzieś tam na końcu dopiero.

mariano901229 napisał(a):

Zarówno MVVM jak i MVC są wzorcami architektury, mają one na celu zorganizowanie struktury aplikacji.

Nie tyle architektury, co warstwy prezentacji. Oba te wzorce odpowiadają na pytanie jak powiązać interfejs użytkownika z resztą aplikacji, nie jak zaprojektować wszystkie warstwy całej aplikacji.

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:8 dni
1

Dodając do tego, co napisał @somekind: MVVM i MVC dotyczą nieco innych aspektów architektury aplikacji i nie ma najmniejszego problemu, żeby stosować oba wzorce jednocześnie. View do wyświetlenia danych (zero jakiejkolwiek logiki), ViewModel do dostarczenia odpowiednio sformatowanych/zagregowanych danych do View, Model do dostarczenia danych do Controller'a/ViewModelu, Controller do spięcia wszystkiego w całość. Ponadto warstwa Serwisów, która będzie używana przez kontroler (najlepiej za pośrednictwem interfejsów i DI poprzez kontener IoC), a która będzie realizować logikę biznesową i dostarczać lub przyjmować wypełnione danymi Modele do/z Controller'ów.
Kontroler tylko spina klocki w całość, nic nie waliduje, nie łączy się z bazą danych, nie implementuje logiki biznesowej (chyba, że mamy na myśli wywołanie odpowiednich metod serwisów w odpowiedniej kolejności).


EN
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:46
0
somekind napisał(a):

Nie tyle architektury, co warstwy prezentacji. Oba te wzorce odpowiadają na pytanie jak powiązać interfejs użytkownika z resztą aplikacji, nie jak zaprojektować wszystkie warstwy całej aplikacji.

MVC może występować, jako architektóra oraz wzorzec projektowy. W drugiej wersji view oraz kontroler jest traktowany jako odzielna warstwa UI, której priorytetem jest rysowanie elementów graficznych. Dlatego w MVC dodatkowo jest stosowany ViewModle aby odzielić te dwie warstwy, czego większość ludzi nie rozumie.

edytowany 1x, ostatnio: Enter Name
somekind
Nekrofilia jest karalna.
EN
Tak, ale nekrofilia to mniejsza szkodliwość czynu, niż zoofilia ;)
EN
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:46
0
ŁF napisał(a):

(najlepiej za pośrednictwem interfejsów i DI poprzez kontener IoC),

Dlaczego najlepiej za pośrednictwem interfejsów ?

Model do dostarczenia danych do Controller'a/ViewModelu, Controller do spięcia wszystkiego w całość

Dlaczego do Controller'a/ViewModelu? Niby dlaczego nie mogę w modelu mapować danych bezpośrednio na ViewModel ? ;)

View do wyświetlenia danych (zero jakiejkolwiek logiki)

A co z logiką do wyświetlania danych ;) ?

Kontroler tylko spina klocki w całość

Dlaczego spina? Moim zdaniem on tylko rozpina... ;)

edytowany 3x, ostatnio: Enter Name
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:8 dni
0
Enter Name napisał(a):

Dlaczego najlepiej za pośrednictwem interfejsów ?

A dlaczego nie? ;-) Alternatywą jest bezpośrednie wskazanie na implementującą funkcjonalność klasę, co czyni IoC bezsensownym, albo klasy abstrakcyjne. Standardem z tego co się orientuję są jednak interfejsy. Masz jakąś alternatywę? Podaj, podyskutujemy.

Model do dostarczenia danych do Controller'a/ViewModelu, Controller do spięcia wszystkiego w całość

Dlaczego do Controller'a/ViewModelu? Niby dlaczego nie mogę w modelu mapować danych bezpośrednio na ViewModel ? ;)

Bo gubisz warstwę abstrakcji i np. przypinasz się na stałe do ORM. Prawda jest taka, że możesz napisać kod jak chcesz i możesz sobie zwracać viewmodele nawet bezpośrednio z repozytorium. Wszystko kwestią tego jak duży jest projekt, czy wybrane rozwiązania będą się odpowiednio skalować i czy po kilku latach nie okaże się, że całość trzeba przepisać...

View do wyświetlenia danych (zero jakiejkolwiek logiki)

A co z logiką do wyświetlania danych ;) ?

Grubsze sprawy na poziomie kontrolera, reszta w VM albo w mapperze, duperele w view. To nie są rygorystyczne zasady, nikt Ci ręki nie utnie jak zrobisz inaczej. Jednak uważam, że umieszczenie zbyt wielu rzeczy w warstwach, do których te rzeczy nie są przeznaczone powoduje, że projekt robi się ciężki do utrzymania.


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)