\section{MobX}
\label{eval:mobx}

MobX ist ähnlich wie Redux eine Bibliothek, welche auf Ansätzen aus dem React-Umfeld basiert. Die Grundlagen dazu werden in \autoref{sec:mobx} behandelt.

\subsection{Implementierung}

Für die Implementierung mit MobX werden die Bibliotheken mobx in der Version 2.0.6+1 und flutter\_mobx in der Version 2.0.4 genutzt.

Für die Zustandsverwaltung wurden vier sogenannte Stores implementiert. Diese beinhalteten einen Teilzustand, sowie Computed-Values und Actions zum Ändern des Zustands. Dabei wurde jeweils ein Store für den Anmeldezustand, die Produktliste, den Warenkorb und die Anzahl eines Produktes im Warenkorb implementiert. Die Stores werden ergänzt durch automatisch generierten Quelltext von der MobX Bibliothek.

Die Stores werden über ein \texttt{Inherited\-Widget} in die Widget-Tree übergeben. Hierfür können auch beliebige andere Dependency-Injection-Lösungen genutzt werden. Auf Zustände wird innerhalb eines Observer-Widgets zugegriffen.

\subsection{Bewertung}

Im folgenden Abschnitt wird die Implementierung mit MobX \autocite[branch=\\mobx]{repo} anhand der definierten Bewertungskriterien bewertet.

\paragraph{\nameref{sec:changeablility}} Zur Skalierbarkeit lässt sich sagen, dass hier keine Hindernisse bei der Skalierbarkeit festgestellt werden konnten. So lassen sich beliebig viele Zustände miteinander koppeln, da hier ein einfacher Zugriff auf Observable-Variablen genügt, um Zustandsaktualisierungen zu erhalten.

Zur Änderbarkeit lässt sich sagen, dass hier zwar keine Abstraktionsschicht wie bei Provider oder Riverpod existiert, aber spätere Änderungen sich durch die Verwendung von beispielsweise Computed-Values ausgleichen lässt und somit eine Rückwärtskompatibilität gewährleistet werden kann.

Aufgrund der einfachen Kopplung von Zuständen und der Änderbarkeit wird MobX hier mit \textquote{vollständig erfüllt} bewertet.

\paragraph{\nameref{sec:testability}} Bei der Testbarkeit wird zum einen geprüft, inwiefern sich die Geschäftslogik testen lässt, und wie sich die Zustände bei Widget-Tests durch Platzhalter ersetzen lassen.

Die Tests der Geschäftslogik konnten ohne zusätzliche Maßnahmen implementiert werden, da nach außen hin hier eine Klasse mit Variablen und Funktionen existiert, die sich mit den Mitteln eines Unit-Test testen lässt.

Bei den Widget-Tests ist es nötig, die Store-Klasse mit neuen Platzhalter-Klassen, die von den Store-Klassen erben, zu ersetzen. Damit lassen sich erfolgreich Stores durch triviale Platzhalter ersetzen.

Die Testbarkeit wird mit \textquote{vollständig erfüllt} bewertet.

\paragraph{\nameref{sec:efficiency}} Nach der Ausführung der Teststrecke ergaben die Zähler folgendes Ergebnis: 
\lstinputlisting[caption={Anzahl der Rendervorgänge bei MobX}]{results/mobx/benchmarks.txt}

\paragraph{\nameref{sec:complexity}} Die Auswertung der Metriken (vgl. \autoref{metrics:mobx}) ergab eine \ac{mi} von 83 für das gesamte Projekt.

\paragraph{\nameref{sec:readability}} Zur Verständlichkeit und Lesbarkeit lässt sich sagen, dass mit MobX hier ein Ansatz verfolgt wird, der zur Lesbarkeit beiträgt, da hier mithilfe der Annotationen wie \texttt{computed} der Sprachfluss beim Lesen unterstützt wird. Zusätzlich beinhalten die Zustandsklassen nur die tatsächlich notwendige Geschäftslogik und Prozeduren für die Zustandsverwaltung werden mittels Quelltext-Generierung ausgelagert. Somit ist die Struktur nachvollziehbar und klar.

Die Quelltext-Generierung kann allerdings auch ein Risiko darstellen, da Fehler oder Probleme im generierten Quelltext schwer nachzuvollziehen sind und der generierte Quelltext schwer lesbar ist.

Mit MobX verwendet hauptsächlich bestehende Konzepte aus dem Flutter-Ökosystem und erweitert diese lediglich um die bereits erwähnten Annotationen, welche allerdings bereits durch ihre Benennung Aufschluss über ihre Funktion geben.

Die tiefe Verschachtlung wird bei MobX verhindert, indem hier zur Zustandsverwaltung kein Widget-basierter Ansatz verwendet wird, und somit keine Injizierung in den Widget-Baum nötig ist.

Die Verständlichkeit und Lesbarkeit wird mit \textquote{vollständig erfüllt} bewertet, allerdings sollte das Risko der Quelltext-Generierung bei einer Entscheidung miteinbezogen werden.

\paragraph{\nameref{sec:documentation}} Die Dokumentation \autocite{mobxDocs} von MobX beschreibt die Grundkonzepte des Zustandsverwaltungssystems und ergänzt diese ebenfalls mit umfangreichen Anwendungsbeispielen. Zusätzlich zur offiziellen Dokumentation existieren noch diverse Drittveröffentlichungen zu MobX und die Dokumentation zur JavaScript-Variante von MobX kann ebenfalls in Teilen für Dart adaptiert werden.

Die Dokumentierung wird daher mit \textquote{vollständig erfüllt} bewertet.

\paragraph{\nameref{sec:structure}} Zur Strukturbestimmung lässt sich sagen, dass MobX über die Annotationen und Quelltext-Generierung eine gewisse Struktur der Zustände vorgibt, allerdings leitet sich daraus keine Struktur für die gesamte Anwendung ab. 

Technisch forciert, wird die Struktur der Zustände in Teilen durch die Quell\-text-Generierung, wenn von Vorgaben abgewichen wird. So schlägt beispielsweise die Quell\-text-Generierung fehl, wenn man versucht, Funktionen mit Parametern als \texttt{computed} zu markieren.

Die Strukturbestimmung wird daher mit \textquote{teilweise erfüllt} bewertet.