Papers we love: Typestate-Oriented Programming

Veel van onze software draait om toestand. Een gebruiker moet ingelogd zijn voor hij een pagina kan bekijken, een filestream moet je niet vergeten te sluiten nadat je hem geopend hebt of je moet niet vergeten je callback handler te deregistreren als deze niet meer relevant blijkt te zijn. Vanzelfsprekend zijn er nog legio voorbeelden hiervan te bedenken, maar allemaal delen ze enkele overeenkomsten: er zijn gecontroleerde overgangen tussen twee verschillende toestanden en afhankelijk van de toestand waarin iets zich bevind is er sprake van andere mogelijkheden.

De paper die ik deze week wil bekijken hanteert deze overweging als uitgangspunt. De auteurs realiseren zich dat sommige problemen goed uit te drukken zijn in traditionele object georiënteerde termen. Wel zien ze hier een kans om aan dit model bij te dragen. Ze stellen voor om de verschillende toestanden waarin een entiteit zich kan bevinden zo expliciet te maken dat er sprake is van unieke types. De compiler kan deze dan gebruiken om snelle en volledige feedback te geven aan de engineer die met de code aan de slag is. Hierdoor is een library veel beter in staat om inhoudelijke feedback te leveren over de onjuistheden of juist mogelijkheden van de objecten in kwestie.

Om het concreet te maken: in de paper geven de auteurs het voorbeeld van een File API. Hier is een algemene File parent type, welke twee concrete states heeft: hij kan open of gesloten zijn. De ClosedFile state heeft een open() methode die een void retourneert, maar tegelijk wel een transitie uitvoert naar de OpenFile state. Deze heeft dan weer een read() functie die daarmee alleen beschikbaar is als het bestand zich in de geopende state bevindt. Vice versa is er natuurlijk ook een close() functie die het object terug naar de ClosedFile state brengt.

Elegant aan de beschreven methode is dat deze een uitbreiding is van een programmeertaal. In dit geval is er gekozen voor basis Java, aangevuld met wat extra keywords en notatie om state transities te beschrijven. Voor de rest van de taal wordt er gewoon gebruik gemaakt van Java. Deze superset van Java hebben zij Plaid genoemd, de methodologie Typestate-Oriented Programming. Probeer je iets te doen dat niet mogelijk is volgens de statebeschrijving, of wil je ontdekken wat er mogelijk is binnen de state waarin een object zich bevindt kun je de typechecker van de compiler gebruiken om je hier informatie over te geven.

Ondanks dat het een elegant idee is biedt het ook enkele uitdagingen. De voornaamste is sharing. Hierbij gaat het om het delen van een object in een bepaalde state, maar dan op zo’n manier dat je de state kan muteren. Op de oorspronkelijke call site kun je hier niet direct meer waardevolle uitspraken doen over de state waarin het object zich bevindt. Deze kan immers veranderd zijn.

De auteurs bieden hier twee opties in: een eenvoudige read only modus waarin veranderingen niet direct zijn toegestaan en een waarbij je parameters expliciet aangeeft als shared, waardoor ze wel aanpasbaar zijn. De eerste is de (safe) default, de tweede moet expliciet worden aangegeven. Ook is er een permissiemodel om het een en ander te limiteren.

Persoonlijk vind ik dit een mooi voorbeeld van een goed uitgewerkte paper met een echte focus op engineering. Er zijn wat bekende ideeën op een nieuwe manier gebundeld en deze zijn technisch volwaardig uitgewerkt. Dit is gedaan door zo veel mogelijk op bestaand werk voort te borduren en op deze manier met zo min mogelijk effort een zo groot mogelijk resultaat te krijgen. Daarnaast wordt ook de brug tussen (in dit geval) Plaid en Java geminimaliseerd. Er wordt wel direct onderkend dat de ideeën nog gevalideerd zullen moeten worden in de praktijk. Er zijn bepaalde verwachtingen, maar er wordt ook gezegd dat men niet zeker is of deze werken.

Kortom, een praktische paper die met twee voeten in de realiteit staat. Daarnaast is het idee wat mij betreft ook heel waardevol. Mijn standpunt is dat je nooit genoeg informatie kunt krijgen van een compiler of typechecker. Plaid zet een interessante stap in die richting wat mij betreft.


Over deze papers we love: binnen Sogyo hebben we de traditie dat we maandelijks een nieuwsbrief rondsturen. De nieuwsbrief gaat veel over interne feitjes, echter sinds februari 2015 verzorgd Kevin van der Vlist het topic: papers we love. Hij deelt met ons papers die interessant zijn om te lezen en ons kunnen inspireren. De topic is uitgegroeid tot een mooie verzameling die we ook graag hier willen delen.