20.09.2013 Views

Softwaretooling - Error!

Softwaretooling - Error!

Softwaretooling - Error!

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

42 | 3<br />

Achtergrond Modelgebaseerde ontwikkeling<br />

Statemachines modelleren doen we in de<br />

informatica al meerdere decennia. Van<br />

oudsher ligt het accent daarbij op speci-<br />

catie, ontwerp en documentatie. De laatste<br />

jaren zijn hier engineeringaspecten bij gekomen,<br />

zoals modelanalyse, modelvericatie<br />

en codegeneratie. De voordelen hiervan zijn<br />

overduidelijk: minder ontwerp- en implementatiefouten,<br />

zodat we een aanzienlijke<br />

winst kunnen bereiken in productiviteit.<br />

Toch blijft het oppassen. Tools die toestandsdiagrammen<br />

veriëren, hebben namelijk<br />

hun beperkingen. Ten onrechte rekent een<br />

ontwikkelaar er soms op dat een succesvolle<br />

vericatie een garantie is voor het genereren<br />

van foutvrije broncode. Neem de ervaringen<br />

van Ericsson met de ASD:Suite (Bits&Chips<br />

8, 2012). De ontwikkelaars in Rijen lijken niet<br />

te beseen dat Verums claim van foutvrije<br />

code uitsluitend geldt voor de geverieerde<br />

eigenschappen van de statemachines, zoals<br />

deadlocks en onvoorziene stimuli.<br />

Gegenereerde code zou honderd procent<br />

foutvrij zijn als de softwareontwikkelaars onfeilbaar<br />

zijn. In dat hypothetische geval zou<br />

het gebruik van een vericatietool echter volstrekt<br />

overbodig zijn. In de praktijk kunnen<br />

in geverieerde modellen nog tal van onvolkomenheden<br />

verborgen zitten. Ik zal dat illustreren<br />

aan de hand van twee voorbeelden.<br />

In deze voorbeelden is er sprake van interactie<br />

tussen een client- en een servercomponent.<br />

De communicatie van de client<br />

naar de server bestaat uit synchrone functieaanroepen;<br />

de informatie-uitwisseling<br />

de andere kant op loopt via asynchrone<br />

callbacks. De server brengt deze callbacks<br />

onder in een queue, waar ze worden afgehandeld<br />

door een aparte thread.<br />

De interactie tussen client en server kunnen<br />

we beschouwen als een protocol en<br />

speciceren met twee protocolstatemachines<br />

(PSM’s). De ene PSM beschrijft de interface<br />

voor de rol van de server, de andere<br />

doet dat vanuit de clientrol. Om beide duidelijk<br />

te kunnen beschrijven, gebruiken we<br />

twee UML-stereotypes – zelf te deniëren<br />

eigenschappen die we aan een object kunnen<br />

toekennen. Een NativeTrigger-stereotype is<br />

een interne trigger die binnen een object<br />

Valkuilen bij statemachineverificatie<br />

Een succesvolle verificatie is geen garantie voor het genereren van foutvrije broncode.<br />

Gebruikers van bijvoorbeeld ASD moeten op hun hoede blijven voor deadlock en<br />

andere problemen, zoals Tis Veugen illustreert aan de hand van twee voorbeelden.<br />

Tis Veugen<br />

(client of server) optreedt en een transitie<br />

tot gevolg heeft met een bijbehorende actie.<br />

Een Ignore-stereotype bij een zelftransitie<br />

geeft aan dat de stimulus wordt ‘verwerkt’<br />

zonder enige actie te ondernemen.<br />

Sessiemanagement<br />

Het eerste voorbeeld komt uit de ASD-praktijk.<br />

De problematiek geldt evenwel voor<br />

willekeurig welke vericatietool. Om het<br />

voorbeeld algemeen te houden, heb ik de namen<br />

van de objecten en functies gewijzigd.<br />

Het handelt om een deur (of een lade van<br />

een dvd-speler) die voortijdig kan worden<br />

geopend of gesloten.<br />

Figuur 1 toont de PSM voor de serverrol.<br />

Deze statemachine start altijd in de toestand<br />

Closed, met een gesloten deur. De client kan<br />

met de functie Open() verzoeken de deur te<br />

openen. Het uitvoeren van deze beweging gebeurt<br />

in de toestand Opening. Als de server<br />

de deur volledig heeft geopend, wordt de callbackfunctie<br />

CbOpened() uitgevoerd, gevolgd<br />

door de transitie naar de toestand Opened.<br />

Op eenzelfde wijze kan de deur weer worden<br />

gesloten. De client kan een lopende activiteit<br />

voortijdig onderbreken door in de toestand<br />

Opening een Close()-call te doen om de<br />

deur te sluiten, of in de toestand Closing een<br />

Open()-aanroep om de deur te openen.<br />

De PSM vanuit het oogpunt van de client<br />

staat weergegeven in Figuur 2. Deze statemachine<br />

ziet er wat onoverzichtelijk uit<br />

door de callbacks die nog onderweg kunnen<br />

zijn. In de meeste gevallen kunnen we die<br />

echter negeren. Dit modelleren we expliciet<br />

met de zelftransities waaraan het stereotype<br />

Ignore is gekoppeld. Merk op dat er een<br />

groot verschil is tussen een te negeren trigger<br />

en een niet-gemodelleerde trigger die<br />

wel optreedt in een toestand. In het laatste<br />

geval zou er sprake zijn van een bug in het<br />

protocol of in de aanroepende component.<br />

Een vericatietool kan via trial-and-error<br />

helpen om de te negeren callbacks compleet<br />

krijgen. Uiteindelijk zal vericatie van het<br />

PSM-paar succesvol zijn. Toch is de correctheid<br />

van de statemachines slechts schijn. Bedenk<br />

maar eens wat er gebeurt als de client<br />

de calls Open(), Close() en Open() achter el-<br />

Figuur 1: De serverrol in het deurprotocol<br />

Figuur 2: De clientrol in het deurprotocol<br />

Figuur 3: Verbeterde serverrol in het deurprotocol<br />

Figuur 4: Verbeterde clientrol in het deurprotocol

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!