Wie man sich nicht mit einer Zustandsmaschine ins Bein schießt

Die Zustandsmaschine wird von mobilen Entwicklern selten verwendet. Obwohl die Mehrheit die Prinzipien der Arbeit kennt und sie leicht unabhÀngig umsetzt. In diesem Artikel werden wir am Beispiel von iOS-Anwendungen herausfinden, welche Aufgaben von der Zustandsmaschine gelöst werden. Die Geschichte wird in der Natur angewendet und widmet sich den praktischen Aspekten der Arbeit.

Unter dem Schnitt finden Sie eine erweiterte Abschrift von Alexander Sychevs Rede ( Brain89 ) auf AppsConf , in der er seine Optionen fĂŒr die Verwendung der Zustandsmaschine bei der Entwicklung von Nicht-Spiel-Anwendungen teilte.


Über den Redner: Alexander Sychev ist seit acht Jahren in der iOS-Entwicklung tĂ€tig. WĂ€hrend dieser Zeit war er an der Erstellung einfacher Anwendungen und komplexer Clients fĂŒr soziale Netzwerke und den Finanzsektor beteiligt. Im Moment ist ein technischer Leiter bei der Sberbank.

Sie kommen aus vielen Bereichen zum Programmieren, haben unterschiedliche HintergrĂŒnde und Erfahrungen, daher erinnern wir uns zunĂ€chst an die grundlegende Theorie.

ErklÀrung des Problems




Eine Zustandsmaschine ist eine mathematische Abstraktion, die aus drei Hauptelementen besteht:

  • viele interne ZustĂ€nde
  • die Menge der Eingangssignale, die den Übergang vom aktuellen Zustand zum nĂ€chsten bestimmen,
  • SĂ€tze von EndzustĂ€nden, bei deren Übergang der Automat seine Arbeit beendet ("gibt das Eingabewort x zu").

Zustand


Mit Zustand meinen wir eine Variable oder eine Gruppe von Variablen, die das Verhalten eines Objekts bestimmen. In der Standard-iOS-Anwendung "Einstellungen " gibt es beispielsweise einen Punkt "Fett" ("Grundlegend → Universeller Zugriff"). Mit dem Wert dieses Elements können Sie zwischen zwei Optionen fĂŒr die Anzeige von Text auf der GerĂ€teanzeige wechseln.



Durch das Senden des gleichen Signals „Ändern Sie den Wert des Kippschalters “ erhalten wir eine andere Reaktion des Systems: entweder den ĂŒblichen Schriftstil oder Fettdruck - alles ist einfach. Wenn sich ein Objekt in verschiedenen ZustĂ€nden befindet und dasselbe Signal empfĂ€ngt, reagiert es unterschiedlich auf eine ZustandsĂ€nderung.

Traditionelle Aufgaben


In der Praxis stoßen Programmierer hĂ€ufig auf eine endliche Zustandsmaschine.

Spieleanwendungen


Dies ist das erste, was mir in den Sinn kommt - als Teil des Gameplays wird fast alles vom aktuellen Spielstatus bestimmt. Daher geht Apple davon aus, dass Zustandsautomaten hauptsĂ€chlich in Spieleanwendungen verwendet werden (wir werden dies spĂ€ter ausfĂŒhrlich erörtern).

Das Verhalten des Systems bei der Verarbeitung des gleichen Signals, jedoch mit einem anderen internen Zustand, kann anhand der folgenden Beispiele veranschaulicht werden. Zum Beispiel:

● Der Spielcharakter kann unterschiedliche StĂ€rken haben: einer in mechanischer RĂŒstung und mit einer Laserpistole, der andere ist schwach gepumpt. AbhĂ€ngig von diesem Zustand wird das Verhalten von Feinden bestimmt: Sie greifen entweder an oder rennen weg.



● Das Spiel wird angehalten. Der aktuelle Frame muss nicht gezeichnet werden. der Spieler im MenĂŒmodus oder im Spielprozess - das Rendern ist völlig anders.

Textanalyse


Eine der beliebtesten Textanalyse-Aufgaben im Zusammenhang mit der Verwendung einer Zustandsmaschine sind Spam-Filter. Es gebe eine Reihe von Stoppwörtern und eine Eingabesequenz. Sie mĂŒssen diese Sequenz entweder filtern oder gar nicht anzeigen.



Formal ist dies die Aufgabe, einen Teilstring in einem String zu finden. Um dies zu lösen, wird der Knut-Morris-Pratt-Algorithmus verwendet, dessen Softwareimplementierung eine Finite-State-Maschine ist. Der Status ist der Versatz der Eingabesequenz und die Anzahl der Zeichen im Musterstoppwort.

Bei der Analyse regulĂ€rer AusdrĂŒcke werden hĂ€ufig Finite-State-Maschinen verwendet.

Parallele Abfrageverarbeitung


Eine Zustandsmaschine ist eine der Optionen zum Implementieren der Anforderungsverarbeitung und zum AusfĂŒhren eines strengen Befehlssatzes.



Beispielsweise werden auf dem Nginx-Webserver Eingabeanforderungen verschiedener Protokolle unter Verwendung von Zustandsautomaten verarbeitet. AbhĂ€ngig vom spezifischen Protokoll wird eine spezifische Implementierung der Zustandsmaschine ausgewĂ€hlt und dementsprechend wird ein bekannter Satz von Anweisungen ausgefĂŒhrt.

Im Allgemeinen werden zwei Klassen von Problemen erhalten:

  • Verwalten der Logik eines komplexen Objekts mit einem komplexen internen Zustand,
  • Bildung von Kontroll- und DatenflĂŒssen (Beschreibung des Algorithmus).

Offensichtlich treten solche allgemeinen Aufgaben in der Praxis eines jeden Programmierers auf. Daher ist die Verwendung einer Zustandsmaschine möglich, auch in Nicht-Gaming-Inhaltsanwendungen, an denen die meisten mobilen Entwickler beteiligt sind.

Als NĂ€chstes analysieren wir, wo und wann die Zustandsmaschine zum Erstellen typischer iOS-Anwendungen verwendet werden kann.

Die meisten mobilen Anwendungen haben eine mehrschichtige Architektur. Es gibt drei Basisschichten.

  • PrĂ€sentationsschicht.
  • GeschĂ€ftslogikschicht.
  • Eine Reihe von Helfern, Netzwerkclients usw. (Kernschicht).

Wie oben angegeben, steuert die Zustandsmaschine Objekte mit komplexem Verhalten, d.h. mit komplexem Zustand. Solche Objekte befinden sich definitiv in der PrĂ€sentationsschicht, da sie Entscheidungen treffen, indem Benutzereingaben oder Nachrichten vom Betriebssystem verarbeitet werden. Schauen wir uns die verschiedenen AnsĂ€tze fĂŒr die AusfĂŒhrung an.



In der klassischen Architekturmetapher von Model-View-Controller befindet sich der Status im Controller: Er entscheidet, was in der Ansicht angezeigt wird und wie auf Eingangssignale reagiert wird: DrĂŒcken einer Taste, Ändern des Schiebereglers usw. Es ist logisch, dass eine der Implementierungen der Steuerung eine Zustandsmaschine ist.



In VIPER befindet sich der Status im PrĂ€sentator: Er bestimmt den spezifischen NavigationsĂŒbergang vom aktuellen Bildschirm und der Anzeige von Daten in der Ansicht.



In Model-View-ViewModel befindet sich der Status im ViewModel. UnabhÀngig davon, ob wir reaktive Bindemittel haben oder nicht, wird das Verhalten des in der MVVM-Metapher definierten Moduls im ViewModel aufgezeichnet. Offensichtlich ist seine Implementierung durch eine Zustandsmaschine eine akzeptable Option.



Komplexe Objekte mit einem nicht trivialen Satz von ZustĂ€nden werden auch auf der GeschĂ€ftslogikschicht der Anwendung angetroffen. Beispielsweise sendet oder blockiert ein Netzwerkclient, der abhĂ€ngig davon, ob eine Verbindung zum Server hergestellt wurde oder nicht, Anforderungen. Oder ein Objekt fĂŒr die Arbeit mit einer Datenbank, das Sprachfunktionen in eine SQL-Abfrage ĂŒbersetzen, ausfĂŒhren, eine Antwort erhalten, in Objekte ĂŒbersetzen usw. muss.



Bei spezifischeren Aufgaben, wie einem Zahlungsmodul, bei dem ein breiterer Satz von ZustÀnden, eine komplexe Logik, die Verwendung einer Zustandsmaschine ebenfalls korrekt ist.

Infolgedessen stellen wir fest, dass es in mobilen Anwendungen viele Objekte gibt, deren Zustand und Verhaltenslogik komplizierter beschrieben werden als mit einem Satz. Sie mĂŒssen in der Lage sein, zu verwalten.

Betrachten Sie ein reales Beispiel und verstehen Sie, wann eine Finite-State-Maschine wirklich benötigt wird und wo ihre Anwendung nicht gerechtfertigt ist.



Betrachten Sie den ViewController aus der Championship iOS-Anwendung, eine beliebte Sportressource. Dieser Controller zeigt eine Reihe von Kommentaren in tabellarischer Form an. Benutzer geben die Spielbeschreibung ein, zeigen Fotos an, lesen die Nachrichten und hinterlassen ihre Kommentare. Der Bildschirm ist recht einfach: Die darunter liegende Ebene liefert Daten, sie werden verarbeitet und auf dem Bildschirm angezeigt.


Es können entweder reale Daten oder ein Fehler an das Display ĂŒbertragen werden. Es erscheint also der erste bedingte Operator, der erste Zweig, der das weitere Verhalten der Anwendung bestimmt.

Die nĂ€chste Frage ist, was zu tun ist, wenn keine Daten vorhanden sind. Ist dieser Zustand ein Fehler? Höchstwahrscheinlich nicht: Nicht jede Nachricht enthĂ€lt Benutzerkommentare. Zum Beispiel ist Hockey in Ägypten fĂŒr niemanden von Interesse, in einem solchen Artikel gibt es normalerweise keine Kommentare. Dies ist normales Verhalten und der normale Zustand des Bildschirms, den Sie anzeigen mĂŒssen. Der zweite bedingte Operator wird angezeigt.

Es ist logisch anzunehmen, dass es auch einen Startzustand gibt, in dem der Benutzer Daten erwartet (z. B. wenn der Kommentarbildschirm nur auf dem Bildschirm angezeigt wird). Zeigen Sie in diesem Fall die Ladeanzeige korrekt an. Dies ist die dritte bedingte Aussage.

Wir haben also bereits vier ZustÀnde auf einem einfachen Bildschirm, dessen Anzeigelogik durch das Konstrukt if-else-if-else beschrieben wird.



Aber was ist, wenn es mehr solche Staaten gibt? Die iterative Entwicklung des Bildschirms fĂŒhrt zu einem komplizierten Gewirr von bedingten Konstrukten, einer Reihe von Flags oder einem umstĂ€ndlichen Fall mit mehreren Schaltern. Dieser Code ist beĂ€ngstigend. Stellen Sie sich vor, der Entwickler, der ihn unterstĂŒtzt, weiß, wo Sie wohnen, und er hat eine KettensĂ€ge, die er immer bei sich hat. Und Sie möchten Ihrer kleinen, aber wohlverdienten Rente wirklich gerecht werden.

Ich denke, in diesem Fall lohnt es sich zu ĂŒberlegen, ob es sich lohnt, eine solche Implementierung in der Anwendung zu belassen.

Nachteile


Lassen Sie uns verstehen, was uns an diesem Code nicht gefÀllt.



Erstens ist es schwer zu lesen .

Da der Code schlecht gelesen wird, ist es fĂŒr einen neuen Entwickler schwierig, herauszufinden, was genau an einer bestimmten Stelle im Projekt implementiert ist. Dementsprechend wird es viel Zeit in Anspruch nehmen, die Logik des Anwendungsverhaltens zu analysieren - die Kosten fĂŒr Support und Entwicklung werden steigen .

Dieser Code ist nicht flexibel . Wenn Sie einen neuen Status hinzufĂŒgen mĂŒssen, der nicht aus der aktuellen Leiter folgt, ist dies möglicherweise ĂŒberhaupt nicht erfolgreich! Wenn Sie einen Durchgang benötigen - beenden Sie abrupt das Bestehen von Schecks auf dieser Leiter - wie geht das? Fast nichts.

Auch bei diesem Ansatz gibt es keinen Schutz vor fiktiven Staaten . Wenn ÜbergĂ€nge durch einen Switch-Fall beschrieben werden, wird höchstwahrscheinlich das Standardverhalten implementiert. Dieser Zustand ist logisch in Bezug auf das Programmverhalten, aber kaum logisch in Bezug auf die menschliche oder geschĂ€ftliche Logik der Anwendung.

Was kann die Lösung fĂŒr die angegebenen MĂ€ngel sein? Dies ist natĂŒrlich die Konstruktion der Logik jedes Moduls / Controllers / komplexen Objekts, die nicht auf Intuition basiert, sondern einen guten formalisierten Ansatz verwendet. Zum Beispiel eine endliche Zustandsmaschine.

Gameplaykit


Als Beispiel nehmen wir das, was Apple anbietet. Im Rahmen des GameplayKit-Frameworks gibt es zwei Klassen, die uns bei der Arbeit mit der Zustandsmaschine helfen.

  • GKState.
  • GKStateMachine.

Der Name des Frameworks macht deutlich, dass Apple in Spielen verwendet werden wollte. In Nicht-Gaming-Anwendungen ist dies jedoch hilfreich.



Die GKState- Klasse definiert den Status. Um es zu beschreiben, mĂŒssen Sie einfache Schritte ausfĂŒhren. Wir erben von dieser Klasse, legen den Statusnamen fest und definieren drei Methoden.

  • isValidNextState - Gibt an, ob der aktuelle Status basierend auf dem vorherigen gĂŒltig ist.
  • didEnterFrom - Aktionen beim Übergang in diesen Zustand.
  • willExitTo - Aktionen beim Verlassen dieses Status.




GKStateMachine ist eine Zustandsmaschinenklasse. Es ist noch einfacher. Es reicht aus, zwei Aktionen auszufĂŒhren.

  • Wir ĂŒbergeben den Satz von EingabezustĂ€nden ĂŒber den Initialisierer an das typisierte Array.
  • Wir machen ÜbergĂ€nge abhĂ€ngig von den Eingangssignalen mit der Enter-Methode. Dadurch wird auch der Ausgangszustand eingestellt.

Es kann verwirrend sein, dass eine Klasse als Argument an die enter- Methode ĂŒbergeben wird. Es sollte jedoch beachtet werden, dass ein Objekt einer Klasse nicht in einem Array von ZustĂ€nden definiert werden kann - dies verbietet eine strikte Typisierung. Wenn Sie also eine beliebige Klasse als nĂ€chste Statusklasse festlegen, geschieht nichts, und die enter-Methode gibt false zurĂŒck.

ZustĂ€nde und ÜbergĂ€nge zwischen ihnen


Nachdem wir uns mit dem Framework von Apple vertraut gemacht haben, kehren wir zum Beispiel zurĂŒck. Es ist notwendig, die ZustĂ€nde und ÜbergĂ€nge zwischen ihnen zu beschreiben. Sie mĂŒssen dies auf die verstĂ€ndlichste Weise tun. Es gibt zwei gĂ€ngige Optionen: eine Tabelle oder ein Übergangsdiagramm. Das Übergangsdiagramm ist meiner Meinung nach eine verstĂ€ndlichere Option. Es ist in UML auf standardisierte Weise. Deshalb wĂ€hlen wir es.

Im Übergangsdiagramm gibt es ZustĂ€nde, die durch Namen beschrieben werden, und Pfeile, die diese ZustĂ€nde verbinden, um ÜbergĂ€nge zu beschreiben. Im Beispiel gibt es einen Anfangszustand - wir erwarten Daten - und es gibt drei ZustĂ€nde, die vom Anfangszustand aus erreicht werden können: empfangene Daten, keine Daten und Fehler.



In der Implementierung erhalten wir vier kleine Klassen.



Lassen Sie uns den Status "Daten ausstehend" analysieren. Am Eingang lohnt es sich, die Download-Anzeige anzuzeigen. Und wenn Sie diesen Zustand verlassen , verstecken Sie ihn. Dazu benötigen Sie eine schwache Verbindung zum ViewController, der von der erstellten Zustandsmaschine gesteuert wird.



Maschinenparameter


Der zweite Schritt, der ausgefĂŒhrt werden muss, besteht darin, die Parameter der Zustandsmaschine einzustellen. Erstellen Sie dazu ZustĂ€nde und ĂŒbertragen Sie diese auf das Automatenobjekt.



Stellen Sie außerdem sicher, dass Sie den Ausgangszustand festlegen



GrundsÀtzlich ist die Maschine alles bereit. Jetzt ist es notwendig, Reaktionen auf externe Ereignisse zu verarbeiten und den Zustand des Automaten zu Àndern.



Erinnern Sie sich an die ErklĂ€rung des Problems. Wir haben eine Leiter von if-else bekommen, auf deren Grundlage entschieden wurde, welche Aktion durchgefĂŒhrt werden soll. Als Steuerung fĂŒr einen einfachen Automaten kann eine solche Implementierungsoption sein (in der Tat ein einfacher Schalter - dies ist eine primitive Implementierung einer endlichen Zustandsmaschine), aber wir werden die zuvor erwĂ€hnten Nachteile praktisch nicht beseitigen.

Es gibt einen anderen Ansatz, mit dem Sie von diesen Leitern wegkommen können. Es wird von den Klassikern der Programmierung vorgeschlagen - der sogenannten "Viererbande".



Es gibt ein spezielles Entwurfsmuster, das als "Status" bezeichnet wird.



Dies ist ein Verhaltensmuster Ă€hnlich einer Strategie, die eine Zustandsmaschinenabstraktion beschreibt. Es ermöglicht dem Objekt, sein Verhalten je nach Status zu Ă€ndern. Der Hauptzweck der Anwendung besteht darin , das Verhalten und die Daten, die einem bestimmten Status zugeordnet sind, in einer separaten Klasse zusammenzufassen. Somit sendet die Zustandsmaschine, die anfĂ€nglich die Entscheidung getroffen hat, welchen Zustand sie verursachen soll, nun ein Signal, ĂŒbersetzt es in einen Zustand und der Zustand trifft eine Entscheidung. Entladen Sie die Leiter also teilweise, und die Verwendung des Codes wird angenehmer.

Das Standard-Framework weiß nicht wie. Er schlĂ€gt vor, dass GKStateMachine die Entscheidung treffen wird. Daher erweitern wir die endliche Zustandsmaschine mit einer neuen Methode, bei der wir als Konfiguration die Beschreibung aller bedingten Variablen ĂŒbergeben, die den nĂ€chsten Zustand eindeutig bestimmen. Innerhalb dieser Methode können Sie die Auswahl des nĂ€chsten Status an den aktuellen delegieren.



Es wird empfohlen, den Status mit einem Objekt zu beschreiben und ihn immer weiterzugeben, anstatt viele, viele Eingabeparameter zu schreiben. Als nÀchstes delegieren wir die Auswahl des nÀchsten Zustands an den aktuellen. Das ist das ganze Upgrade.



Vorteile von GameplayKit.

  • Standardbibliothek. Sie mĂŒssen nichts herunterladen, keine Cocoapods oder Karthago verwenden.
  • Die Bibliothek ist recht einfach zu erlernen.
  • Es gibt zwei Implementierungen gleichzeitig: auf Objective-C und auf Swift.

Nachteile:

  • Realisierungen von ZustĂ€nden und ÜbergĂ€ngen sind eng miteinander verbunden.
    Das Prinzip der alleinigen Verantwortung wird verletzt: Der Staat weiß, wohin und wie es geht.
  • Doppelte ZustĂ€nde werden in keiner Weise kontrolliert.
    Ein Array wird an die Zustandsmaschine ĂŒbergeben, nicht viele ZustĂ€nde. Wenn Sie mehrere identische ZustĂ€nde ĂŒbertragen, wird der letzte aus der Liste verwendet.

Was sind die Implementierungen der endlichen Zustandsmaschine noch? Schauen Sie sich GitHub an.

Objective-C-Implementierungen




TransitionKit


Dies ist seit langem die beliebteste Objective-C-Bibliothek, ohne die in GamePlayKit festgestellten MÀngel. Es ermöglicht uns, eine Zustandsmaschine und alle damit verbundenen Aktionen auf Blöcken zu implementieren.

Der Zustand ist von ÜbergĂ€ngen getrennt .

Innerhalb von TransitionKit gibt es 2 Klassen.

  1. TKState - zum Festlegen von Status- und Eingabe- und Ausgabeaktionen.
  2. TKEvent ist eine Klasse zur Beschreibung des Übergangs.
    TKEvent bindet einige ZustÀnde an andere. Das Ereignis selbst wird einfach durch eine Zeichenfolge definiert.

DarĂŒber hinaus gibt es zusĂ€tzliche Vorteile.

Sie können nĂŒtzliche Daten wĂ€hrend des Übergangs ĂŒbertragen . Dies funktioniert genauso wie bei Verwendung von NSNotificationCenter. Alle nĂŒtzlichen Nutzdaten werden in Form eines userInfo-Wörterbuchs bereitgestellt, und der Benutzer analysiert die Informationen.

Der fehlerhafte Übergang hat eine Beschreibung . Wenn wir versuchen, einen nicht vorhandenen - unmöglichen Übergang durchzufĂŒhren - erhalten wir nicht nur den NO-Wert, wenn wir von der Übergangsmethode zurĂŒckkehren, sondern auch eine detaillierte Beschreibung des Fehlers, die beim Debuggen einer Zustandsmaschine hilfreich ist.



TransitionKit wird im beliebten RestKit Network Harvester verwendet. Dies ist ein ziemlich gutes Beispiel dafĂŒr, wie eine Zustandsmaschine im Anwendungskernel bei der Implementierung von Netzwerkoperationen verwendet werden kann.



RestKit verfĂŒgt ĂŒber eine spezielle Klasse - RKOperationStateMachine - zum Verwalten gleichzeitiger VorgĂ€nge. An der Eingabe akzeptiert es die zu verarbeitende Operation und die Warteschlange fĂŒr ihre AusfĂŒhrung.



Intern ist die Zustandsmaschine sehr einfach: drei ZustĂ€nde (bereit, ausgefĂŒhrt, abgeschlossen) und zwei ÜbergĂ€nge: Start und Ende der AusfĂŒhrung. Nach dem Start der Verarbeitung (und bei allen ÜbergĂ€ngen) beginnt die Zustandsmaschine, einen vordefinierten Benutzercodeblock in der beim Erstellen der Warteschlange angegebenen Warteschlange zu steuern.

Eine mit ihrem Automaten verknĂŒpfte Operation ĂŒbertrĂ€gt externe Ereignisse an den Automaten und fĂŒhrt ÜbergĂ€nge zwischen ZustĂ€nden und allen zugehörigen Aktionen durch. State Machine kĂŒmmert sich darum

  • asynchrone CodeausfĂŒhrung,
  • Atomcode-AusfĂŒhrung wĂ€hrend ÜbergĂ€ngen,
  • Übergangskontrolle
  • Betriebsstornierung
  • Die Richtigkeit der Änderung der Betriebszustandsvariablen: isReady, isExecuting, isFinished.

Verschiebung


Neben TransitionKit ist Shift zu erwĂ€hnen - eine winzige Bibliothek, die als Kategorie ĂŒber NSObject implementiert ist. Mit diesem Ansatz können Sie jedes Objekt in eine Zustandsmaschine verwandeln und seinen Zustand in Form von Zeichenfolgenkonstanten und Aktionen in Blöcken wĂ€hrend ÜbergĂ€ngen beschreiben. Dies ist natĂŒrlich eher ein Schulungsprojekt, aber sehr interessant und ermöglicht es Ihnen, zu minimalen Kosten zu testen, was eine Zustandsmaschine ist.

Schnelle Implementierungen




Es gibt viele Implementierungen von Finite-State-Maschinen in Swift. Ich werde eines herausgreifen ( Bemerkung : Leider hat sich das Projekt in den letzten zwei Jahren nach dem Bericht nicht weiterentwickelt, aber die darin enthaltenen Ideen sind es wert, im Artikel erwÀhnt zu werden).

SwiftyStateMachine


In SwiftyStateMachine wird die Zustandsmaschine durch eine nicht stabile Struktur dargestellt. Mit den didSet-Methoden der Eigenschaft können Sie StatusÀnderungen leicht abfangen.

In dieser Bibliothek wird die Zustandsmaschine durch die Entsprechungstabelle von ZustĂ€nden und ÜbergĂ€ngen zwischen ihnen definiert. Dieses Schema wird getrennt von dem Objekt beschrieben, das die Maschine steuern wird. Dies wird durch einen verschachtelten Switch-Fall implementiert.



Hauptmerkmale, Vorteile dieser Bibliothek sind.

  • Die Notwendigkeit, das ZustandsĂŒbergangsschema vollstĂ€ndig zu beschreiben.
    Auf diese Weise können Sie in der Kompilierungsphase einen Fehler erhalten, wenn der Übergang fĂŒr einen bestimmten Status nicht verarbeitet wird.
  • Strikte Kontrolle der Eingangssignale.
    Sie können kein Signal an eine Zustandsmaschine ĂŒbergeben, die nicht definiert ist oder die fĂŒr eine andere Zustandsmaschine definiert ist.
  • Durch die Trennung der Schaltung und des von ihr gesteuerten Objekts können Sie Zeit bei der Initialisierung der Maschine sparen.
  • Visualisierung mit der DOT-Grafikbeschreibungssprache.
    Es gibt eine grafische Auszeichnungssprache fĂŒr die Arbeit mit Zustandsdiagrammen - DOT. Diese Bibliothek gibt damit an, wie die Zustandsmaschine gerendert wird.



Fazit


.

  • .
    , . , . , .
  • .
    ( ).
  • .
    , , .
  • . , SwiftyStateMachine , , . .
  • .
    , . , , . .

.



. , . , , switch case: , , — .



. . , . , , , . .



, , . .



— . : , — .





«-» .



, . .



app coordinators — , , : , . , .

, app coordinator , state machine. . , app coordinators state machine, , , , . , , , . .



, state machine , , .

state machine , if-else. , .

Apps Conf 2018, 8 9 , - .

, YouTube- . , .

Source: https://habr.com/ru/post/de423293/


All Articles