Softwaretooling - Error!
Softwaretooling - Error!
Softwaretooling - Error!
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