Inhaltsübersicht

In der Softwaretechnik ist ein Entwurfsmuster ein häufig auftretendes Problem beim Softwareentwurf. Bei einem Entwurfsmuster handelt es sich nicht um einen endgültigen Entwurf, der direkt in gelösten Code umgewandelt werden kann.

Ein großes Problem bei der Softwareentwicklung ist die enge Kopplung von Code, d.h. selbst eine kleine Änderung in einem Teil des Codes führt zu Änderungen oder Fehlern in einem anderen Teil des Codes. Der Code ist nicht Unit-Test-freundlich und nicht wiederverwendbar.

Einführung

Derzeit gibt es viele Architekturansätze wie MVP, FLUX, MVI, MVVM, die die oben genannten Probleme lösen. Wir können jeden Ansatz verwenden, um unseren Code korrekt zu pflegen, so dass alles gut funktioniert, kurz gesagt, ein glückliches Entwicklerleben. Dieser Artikel diskutiert das MVVM-Designmuster in Android und wie wir bestehende Probleme mit dem MVVM-Designmuster lösen können.

Die wichtigsten Komponenten des MVVM-Entwurfsmusters sind :

  1. View - Informiert das ViewModel über die Aktionen des Benutzers
  2. ViewModel - Zeigt Datenströme an, die für die Ansicht relevant sind
  3. DataModel - Abstrahiert die Datenquelle. Das ViewModel arbeitet mit dem DataModel, um die Daten zu erhalten und zu speichern.

Kurze Erläuterung des MVVM-Entwurfsmusters

Google führte Android Architecture Components ein, die ViewModel anstelle von Presenter enthielten und damit den Beweis erbrachten, dass auch Google MVVM unterstützt.

ViewModel

ViewModels sind einfache Klassen, die mit der Logik/Modell-Schicht interagieren und Zustände/Daten preisgeben, ohne zu wissen, von wem oder wie diese Daten konsumiert werden. Nur View(Activity) verweist auf ViewModel und nicht umgekehrt; dies löst unser Problem der engen Kopplung. Eine einzelne Ansicht kann einen Verweis auf mehrere ViewModels haben.

➡️
public class MainViewModel extends ViewModel {public MainViewModel() {}public String getText() {return new DataModel().getText();}}View

In Android stellt die Aktivität eine Ansicht im MVVM-Designmuster dar. Die View ist für die visuelle Darstellung von Anwendungen und die Dateneingabe durch den Benutzer zuständig. Dieser Teil sollte die Daten auf keinen Fall verarbeiten. Seine Funktion besteht nur darin, die Eingabe wie Berührung oder Streichen zu erkennen und zu visualisieren.

Das ModelView-ViewModel-Architekturmuster wurde mit der Geburt der DataBinding-Bibliothek in Android eingeführt. Sie können die Datenbindung in der app.gradle.

➡️
dataBinding{enabled = true}

Add these lines in-app.Gradle inside android{} tag. Then put your XML layout code under tag. This will generate a binding class, and you can access this class from the activity. You can see we can directly access the getText() method from XML.

➡️
<?xml version="1.0" encoding="utf-8"?><layout><data><variablename="mainViewModel"type="com.g.mvvmproject.MainViewModel" /></data><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{mainViewModel.text}"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></RelativeLayout></layout>

Nach setContentView inactivity setzen Sie einen Verweis auf das View Model.

➡️
public class MainActivity extends AppCompatActivity {private ActivityMainBinding mActivityMainBinding;private MainViewModel mainViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);mainViewModel = new MainViewModel();mActivityMainBinding.setMainViewModel(mainViewModel);}}

DataModel

DataModel enthält die Daten der Anwendung. Es kann nicht direkt mit der Ansicht kommunizieren. Im Allgemeinen wird empfohlen, die Daten dem ViewModel über Observables zugänglich zu machen.

➡️
public class DataModel {String text="Hello World ";public String getText() {return text + text;}}

Vorteile der Verwendung des MVVM-Entwurfsmusters

  • Die Testbarkeit Ihres Codes wird erhöht.

Im folgenden Codeschnipsel testen wir die Methode getText() im ViewModel. Sie können Ihre Daten simulieren und das erwartete Ergebnis überprüfen.

➡️
@RunWith(AndroidJUnit4.class)public class ExampleInstrumentedTest {@Testpublic void emailValidator_CorrectEmailSimple_ReturnsTrue() {String expected = "Hello World Hello World ";assertEquals(expected, new MainViewModel().getText());}}
  • Ihr Code ist entkoppelt.
  • Die Paketstruktur ist noch einfacher zu navigieren.
  • Das Projekt ist noch einfacher zu pflegen.
  • Ihr Team kann neue Funktionen noch schneller hinzufügen.

Schlussfolgerung

MVVM kombiniert die Vorteile der Trennung von Belangen, die MVP bietet, und nutzt gleichzeitig die Vorteile von Datenbindungen. Das Ergebnis ist ein Muster, bei dem das Modell so viele Operationen wie möglich steuert und die Logik in der Ansicht minimiert wird.

➡️
Ein einfaches Beispiel für die MVVM-Implementierung finden Sie hier.

Srinivasa Sainath

Srinivasa Sainath