Typestate-Muster: Funktionale Zustandsmaschinen in Rust
Functional State Machines in Rust: Typestate and Newtype Patterns
Dieser Artikel zeigt, wie sich mit den Typestate- und Newtype-Mustern in Rust robuste Zustandsmaschinen bauen lassen, die bereits zur Compile-Zeit ungültige Übergänge verhindern. Anhand konkreter Codebeispiele wird demonstriert, wie der Compiler als Verifikationswerkzeug dient und so Laufzeitfehler minimiert werden. Der Beitrag richtet sich an Rust-Entwickler, die ihre Typsystem-Fähigkeiten vertiefen möchten.
Durch die Nutzung des Typsystems als Zustandsmaschine können wir bereits zur Compile-Zeit garantieren, dass bestimmte Übergänge niemals auftreten.
- vatsachak
Typen sind Puzzles. Ein guter Rustacean wird dafür sorgen, dass die Teile zusammenpassen, um das Bild zu ergeben.
Deshalb verwende ich in Crates, in denen ich sicherstellen muss, dass bestimmte Funktionen in der richtigen Reihenfolge aufgerufen werden, ein Ticket<T>, wobei eine Funktion ein Ticket<Func1Done> mit der Ausgabe zurückgibt und die andere es als Eingabe konsumieren muss.
Das Typestate-Muster ist eine Spezialisierung davon, nur gültige Zustände darstellbar zu machen.
- doyougnu
Dies war ein Vortrag auf dem FUNARCH-Workshop auf der diesjährigen ICFP.
Hier ist der Livestream: https://www.youtube.com/live/c0pw1iVs_Q0?is=hwm2xa4cZOcqF5tW
Wir werden die einzelnen Vorträge in den nächsten Tagen veröffentlichen!
- arpinum
Ich verwende Typestates und Newtypes ausgiebig. Die Metrik, die zeigt, dass Typestate und Newtypes vorteilhaft sind, ist: Wie viele Methodenaufrufe oder Parameter können aufgerufen bzw. verwendet werden, die kompilieren, aber keine gültigen Anwendungsfälle sind. Man möchte diese Zahl minimieren. Ich liebe es, einen Typzustand zu haben, in dem ich nur 1 oder 2 Methodenaufrufe tätigen kann, weil der Zustand erzwingt, dass es nur wenige Parsing-/Validierungs-/Übergangsmethoden gibt. Und es gibt nur einen gültigen Weg, die Parameter zu liefern; ich kann die Zeichenketten nicht an der falschen Stelle verwenden. Ich wünschte nur, wir hätten benannte Parameter wie in ObjC.
- michaelnoguera
- bana-io
Vielleicht übersehe ich etwas, aber wo ist der gesamte Quellcode?