Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen.

Slides:



Advertisements
Verwante presentaties
M/V in de kerk Man and woman in the Church Doelen: informeren, bezinnen, oefenen Goals: to inform, to reflect, practice 1 december: de bijbel | the Bible.
Advertisements

The stock market will go up De beurswaarden zullen stijgen YESNO JA NEEN Is Jefken a good person ? Is Jefken een goed mens ? YES NO JA NEEN Is Lonny a.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Een programma opbouwen.
Project Software Engineering Universiteit AntwerpenPlanning 4.1 Hoe snel loopt iemand de 100 meter ?
HM-ES-th1 Les 9 Hardware/Software Codesign with SystemC.
Requirements -People are able to make their own memorial page, called a memori -The website will be build first in Dutch for extension.nl, then copied.
Een alternatief voorstel Naar aanleiding van bestudering van de IAASB voorstellen denkt de NBA na over een alternatief. Dit alternatief zal 26 september.
Project Software Engineering Universiteit AntwerpenAanpasbaarheid 3.1 Complexe Interacties.
1 Co-Design at Chess-iT Guus Bosman. 2 Afstuderen bij Chess Net.Footworks tot augustus 2003 Afstuderen augustus 2003 tot maart 2004 Chess full-time vanaf.
Thursday, 10 July 2014 donderdag 10 juli 2014 Click Klik.
Ronde (Sport & Spel) Quiz Night !
Case5: No-Audio Game: from design document to first prototype Tom Ramakers Cmd gad 30/05/2012.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Gelinkte lijsten Finite State.
Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen.
Datastructuren Analyse van Algoritmen en O
‘Inleiding programmeren in Java’ SWI cursus: ‘Inleiding programmeren in Java’ 4e college Woe 19 januari 2000 drs. F. de Vries.
IST Status Gerrit van Nieuwenhuizen IST-MIT meeting BNL, July 24, 2008
AAHA (voor intern gebruik)
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Hoofdstuk 6: Controle structuren
Inleiding Software Engineering Universiteit AntwerpenPlanning 4.1 Hoe snel loopt iemand de 100 meter ?
Complexe Interacties Universiteit Antwerpen Aanpasbaarheid.
Programming for Linguists An Introduction to Python 29/11/2012.
ERIC Combine search terms with Boolean operators Next = click.
1 Voorwaarden hergebruik Modulair ontwerp Low coupling High cohesion.
Frank Stalpers en Ad Baars
CONTROLESTRUCTUREN (DEEL 2)
Werken aan Intergenerationele Samenwerking en Expertise.
De digitale coach Het verbeteren van een plan van aanpak Steven Nijhuis, coördinator projecten FNT Deze presentatie staat op:
Copyright met toestemming gebruikt van Stichting Licentie © 1994 Shepherd's Heart Music 1/12 JOY! JOY TO THE WORLD (Dennis L. Jernigan) 1. And this is.
ALBRECHT DÜRER'S MAGIC SQUARE ALBRECHT DÜRERS MAGISCH VIERKANT
CLICK THE END EINDE THE END May peace be with you EINDE Moge de vrede met jou zijn Next time I’ll present you the alphabet Volgende keer bied ik je het.
2009 Tevredenheidsenquête Resultaten Opleidingsinstellingen.
1 Van Harvard naar MIPS. 2 3 Van Harvard naar MIPS Microprocessor without Interlocked Pipeline Stages Verschillen met de Harvard machine: - 32 Registers.
PLAYBOY Kalender 2006 Dit is wat mannen boeit!.
DB&SQL8- 1 VBA Visual Basics for Applications: eigen Office versie vanaf Office2000 gelijk voor alle applicaties Programmeren onder meer nodig voor Het.
Tussentoets Digitale Techniek. 1 november 2001, 11:00 tot 13:00 uur. Opmerkingen: 1. Als u een gemiddeld huiswerkcijfer hebt gehaald van zes (6) of hoger,
1 HOOFDSTUK 5 CONTROLESTRUCTUREN (DEEL 2) 5.1. INTRODUCTIE  Vervolg discussie omtrent gestructureerd programmeren  Introductie van de overblijvende controlestructuren.
From computer power and human reason. Joseph Weizenbaum.
F REE R IDING IN P ROJECTS Recognize it today, Deal with it tomorrow, Prevent it in the next project Toine Andernach Focus Centre of Expertise on Education,
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology ; PIC assember programeren 1 Les 3 - onderwerpen Het.
KPRES1 : C vervolg Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology Les 2 sheet 1 Wat gaan we doen:  Een (vaste) melodie.
Geheugen, distributie en netwerken Netwerken: de basis voor distributie van gegevens en taken (processen) –bestaan zo’n 40 jaar, zeer snelle ontwikkeling.
ZijActief Koningslust 10 jaar Truusje Trap
Deltion College Engels C1 Gesprekken voeren [Edu/004]/ thema: There are lies, damned lies and statistics... can-do : kan complexe informatie en adviezen.
Deltion College Engels B2 Schrijven [Edu/004] thema: (No) skeleton in the cupboard can-do: kan een samenhangend verhaal schrijven © Anne Beeker Alle rechten.
Deltion College Engels C1 Luisteren [Edu/001] thema: It’s on tv can-do : kan zonder al te veel inspanning tv-programma’s begrijpen.
Deltion College Engels B1 En Spreken/Presentaties [Edu/007] Thema: Soap(s) can-do : kan met enig detail verslag doen van ervaringen, in dit geval, rapporteren.
Deltion College Engels En Projectopdracht [Edu/001] thema: research without borders can-do/gesprekken voeren : 1. kan eenvoudige feitelijke informatie.
Deltion College Engels C1 Spreken/Presentaties [Edu/006] thema ‘I hope to convince you of… ‘ can-do : kan een standpunt uiteenzetten voor een publiek van.
Deltion College Engels B1 Schrijven [Edu/004]/ subvaardigheid lezen thema: reporting a theft can-do : kan formulieren waarin meer informatie gevraagd wordt,
Deltion College Engels C1 Gesprekken voeren [Edu/006] thema: ‘I was wondering what you think of…’ can-do : kan deelnemen aan de conversatie bij zeer formele.
Writing exercise This one goes into your language portfolio!!! You have until the end of the week to hand it in… (So you have a little longer than it says.
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
Shortest path with negative arc-costs allowed. Dijkstra?
TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik.
Rational Unified Process RUP Jef Bergsma. Iterations –Inception –Elaboration –Construction –Transition De kernbegrippen (Phases)
De financiële functie: Integrale bedrijfsanalyse©
International Primary Curriculum
25 Ways To Be Healthier. 25 Manieren om Gezonder te leven. click.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
ZijActief Koningslust
Deltion College Engels C1 Schrijven [Edu/007] thema: Mind twister or how to write an essay… can-do : kan heldere, goed gestructureerde uiteenzetting schrijven.
Deltion College Engels B2 Spreken [Edu/001] thema: What’s in the news? can-do : kan verslag doen van een gebeurtenis en daarbij meningen met argumenten.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
Leerlingen zeiden: “Je MOET hem loslaten
Transcript van de presentatie:

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.2 Een oplossing met een foutje …

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid Betrouwbaarheid Software Engineering –Wat? –Bouw vs. Ontwikkel –Vereisten Betrouwbaarheid (Aanpasbaarheid & Planning) Betrouwbaarheid: TicTacToe –specificatie –versie 1.0: ontwerp, implementatie & test –versie 1.1a: ontwerp, implementatie met slechte test (manuele controle) –versie 1.1a en 1.1: contracten

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.4 Wat is Software Engineering ? Specificatie Systeem "Multi-person construction of multi-version software" –Ploegwerk –Evolueren of... uitsterven

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.5 "Bouw" een systeem Monolithische systemen –banken, verzekeringen, loonberekening Programmeerploeg: stricte functie-opdeling –Analist, programmeur,... Organisatie in functie van systeem –Organisatie past zich aan

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.6 "Ontwikkel" een systeem Modulaire systemen –“desktop” systemen, web-applicaties Programmeerploeg: losse functie- opdeling –Analist + programmeur,... Systeem in functie van organisatie –Systeem past zich aan

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.7 Vereisten Betrouwbaarheid Aanpasbaarheid Planning Technieken Testen + Contracten Objectgericht ontwerp Tijdsschatting

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.8 play player TicTacToe: Specificatie Use Case 1: play Goal: 2 players play TicTacToe, 1 should win Precondition: An empty 3x3 board Success end: 1 player is the winner Steps 1. Two players start up a game (First is "O"; other is "X") 2. WHILE game not done 2.1 Current player makes move 2.2 Switch current player 3. Anounce winner

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.9 Vuistregel Keep It Stupidly Simple (the KISS principle) Hoe ? Begin zo klein mogelijk => laat ontwerp & implementatie langzaam groeien Waarom ? "There are two ways of constructing a software design: one way is to make it so simple that there are obviously no deficiencies, and the other way is make it so complicated that there are no obvious deficiencies." (C. A. R. Hoare - Turing Award Lecture)

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.10 TTT1.0: Ontwerp TicTacToe notDone(): BOOLEAN doMove() t: TicTacToeaGame play *[t.notDone()] doMove () TYPE TicTacToe* = POINTER TO TicTacToeData; PROCEDURE (aTicTacToe: TicTacToe) notDone* (): BOOLEAN; PROCEDURE (aTicTacToe: TicTacToe) doMove* (): BOOLEAN; WHILE t.notDone() DO t.doMove(); END; klein ontwerp: een lus

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.11 TYPE TicTacToe* = POINTER TO TicTacToeData; TicTacToeData* = RECORD nrOfMoves: INTEGER; END; PROCEDURE (aTicTacToe: TicTacToe) init*; BEGIN aTicTacToe.nrOfMoves := 0; END init; PROCEDURE (aTicTacToe: TicTacToe) notDone* (): BOOLEAN; BEGIN RETURN aTicTacToe.nrOfMoves < 9; END notDone; PROCEDURE (aTicTacToe: TicTacToe) doMove* (); BEGIN aTicTacToe.nrOfMoves := aTicTacToe.nrOfMoves + 1; END doMove; kleine implementatie: een teller

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.12 Vuistregel Minstens één test per "normaal" scenario Waarom ? Minimum veiligheidsnorm Hoe ? Controleer de tussentijdse toestand via "should" & "shouldNot" => onthoud of een test gelukt is of niet

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.13 TTT1.0: Test TicTacToeTest setUp(testCase: ARRAY OF CHAR) run() tearDown() should (…): BOOLEAN shouldNot (…): BOOLEAN testBasicGame(): BOOLEAN aGame : TicTacToe : TicTacToeTest testBasicGame() *[aGame.notDone()]doMove () setUp("testBasicGame") should(aGame.notDone()) shouldNot(aGame.notDone()) tearDown() NEW(); init(); should(aGame.nrOfMoves() =9)

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.14 PROCEDURE (aTest: TicTacToeTest) testBasicGame* (verbose: BOOLEAN): BOOLEAN; BEGIN IF verbose THEN Out.String(aTest.testCase); Out.Ln; END; IF ~ aTest.should(aTest.aGame.notDone(), "notDone is FALSE at beginning of game") THEN RETURN FALSE; END; WHILE aTest.aGame.notDone() DO aTest.aGame.doMove(); END; IF verbose THEN Out.String("... at the end of the loop"); Out.Ln; END; IF ~ aTest.shouldNot(aTest.aGame.notDone(), "notDone is TRUE at the end of game") THEN RETURN FALSE; END; IF ~ aTest.should(aTest.aGame.numberOfMoves() = 9, "number of moves at end of game is <> 9") THEN RETURN FALSE; END; RETURN TRUE; END testBasicGame; Controleer tussen- tijdse toestand

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.15 PROCEDURE (aTest: TicTacToeTest) fail (MSG: ARRAY OF CHAR); BEGIN Out.String("Failure: "); Out.String(aTest.testCase); Out.String(" - "); Out.String(MSG); Out.Ln(); END fail; PROCEDURE (aTest: TicTacToeTest) should (b : BOOLEAN; MSG: ARRAY OF CHAR): BOOLEAN; BEGIN IF ~ b THEN aTest.fail(MSG); END; RETURN b; END should; PROCEDURE (aTest: TicTacToeTest) shouldNot (b : BOOLEAN; MSG: ARRAY OF CHAR): BOOLEAN; BEGIN IF b THEN aTest.fail(MSG); END; RETURN ~ b; END shouldNot;

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.16 PROCEDURE Main*; VAR testsPassed: BOOLEAN; aTest: TicTacToeTest; BEGIN NEW(aTest); aTest.init(); testsPassed := TRUE (* assume that tests will pass *); aTest.setUp("testBasicGame"); IF ~ aTest.testBasicGame (TRUE) THEN testsPassed := FALSE; END; aTest.tearDown(); (* -- add more test case invocations before this line -- *) IF testsPassed THEN Out.String("TicTacToeTest: All tests passed"); Out.Ln(); ELSE Out.String("TicTacToeTest: *** At least one test failed"); Out.Ln(); END; END Main; Onthoud testresultaat!

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.17 TTT1.1a: doMove t: TicTacToe doMove() TicTacToe - nrOfMoves: Integer: 0 + doMove() + notDone(): BOOLEAN + setMark (col, row, marker: CHAR) + getMark (col, row: CHAR): CHAR [ODD(t.nrOfMoves)] setMark( CHR((t.nrOfMoves MOD 3) + ORD("a")), CHR((t.nrOfMoves DIV 3) + ORD("1")), "X") [~ODD(t.nrOfMoves)] setMark( CHR((t.nrOfMoves MOD 3) + ORD("a")), CHR((t.nrOfMoves DIV 3) + ORD("1")), "O") abc1OXO2XOX3OXOabc1OXO2XOX3OXO nrOfMoves := nrOfMoves + 1

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.18 PROCEDURE (aTicTacToe: TicTacToe) doMove* (); VAR row, col, mark: CHAR; BEGIN col := CHR((aTicTacToe.nrOfMoves MOD 3) + ORD("a")); row:= CHR((aTicTacToe.nrOfMoves DIV 3) + ORD("1")); IF ODD(aTicTacToe.nrOfMoves) THEN mark := "X" ELSE mark := "O"; END; aTicTacToe.setMark(col, row, mark); aTicTacToe.nrOfMoves := aTicTacToe.nrOfMoves + 1; END doMove; Ontwerp & Implementatie groeien langzaam

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.19 Vuistregel Als de functionaliteit groeit, dan groeit de test mee Waarom ? Veiligheidsmaatregel: gecontroleerde groei Hoe ? Pas bestaande tests aan => extra tussentijds toestanden controleren

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.20 TTT1.1a: Test t: TicTacToeTest mark := getMark(col, row) t: TicTacToe *[col := "a".. "c"; row := "1".."3"] should(mark = expectedMark) [expectedMarker = "X"] expectedMark := "O" [expectedMarker = "O"] expectedMark := "X"

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.21 PROCEDURE (aTest: TicTacToeTest) testBasicGame* (verbose: BOOLEAN): BOOLEAN;... WHILE aTest.aGame.notDone() DO aTest.aGame.doMove(); END; expectedMark := "O"; FOR col := ORD("a") TO ORD("c") DO FOR row := ORD("1") TO ORD("3") DO IF verbose THEN... END; mark := aTest.aGame.getMark(CHR(col), CHR(row)); IF ~ aTest.should(mark = expectedMark, "mark is not what expected") THEN RETURN FALSE; END; IF expectedMark = "X" THEN expectedMark := "O" ELSE expectedMark := "X"; END; END;... Test groeit mee

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.22 Vuistregel Een test produceert zo weinig mogelijk uitvoer "all tests passed" "at least one test failed" Waarom ? Veel en frequent testen => onmogelijk om uitvoer te controleren Hoe dan wel ? Tests antwoorden "all tests passed" of "at least one test failed" Tests werken normaal in "silent mode" maar er is ook "verbose"

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.23 PROCEDURE (aTest: TicTacToeTestBad) testBasicGame*; … Out.String("BEGIN OF GAME: aGame.notDone() = "); IF aTest.aGame.notDone() THEN Out.String("TRUE"); ELSE Out.String("FALSE"); END; Out.Ln; WHILE aTest.aGame.notDone() DO aTest.aGame.doMove(); END; mark := "O"; FOR col := ORD("a") TO ORD("c") DO FOR row := ORD("1") TO ORD("3") DO Out.Char(CHR(col)); Out.Char("-");Out.Char(CHR(row));Out.Char(":"); Out.Char(aTest.aGame.getMark(CHR(col), CHR(row))); Out.String(" =? "); Out.Char(mark);Out.Ln; IF mark = "X" THEN mark := "O" ELSE mark := "X"; END; END; … Out.String("END OF GAME: aGame.numberOfMoves() = "); Out.Int(aTest.aGame.numberOfMoves(), 0); Out.Ln; Een slechte test

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.24 De vorige testcode produceert volgende uitvoer BEGIN OF GAME: aGame.notDone() = TRUE a-1:O =? O a-2:X =? X a-3:O =? O b-1:X =? X b-2:O =? O b-3:X =? X c-1:O =? O c-2:X =? X c-3:O =? O END OF GAME: aGame.notDone() = FALSE END OF GAME: aGame.numberOfMoves() = 9 Hoe weet ik of deze uitvoer correct is ? Manuele Verificatie van Tests Schrijf *nooit* testcode die manuele verificatie van de uitvoer vereist

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.25 PROCEDURE (aTest: TicTacToeTest) testBasicGame* (verbose: BOOLEAN): BOOLEAN; BEGIN IF verbose THEN Out.String(aTest.testCase); Out.Ln; END; IF ~ aTest.should(aTest.aGame.notDone(), "notDone is FALSE at beginning of game") THEN RETURN FALSE; END; WHILE aTest.aGame.notDone() DO aTest.aGame.doMove(); END; IF verbose THEN Out.String("... at the end of the loop"); Out.Ln; END; IF ~ aTest.shouldNot(aTest.aGame.notDone(), "notDone is TRUE at the end of game") THEN RETURN FALSE; END; IF ~ aTest.should(aTest.aGame.numberOfMoves() = 9, "number of moves at end of game is <> 9") THEN RETURN FALSE; END; RETURN TRUE; END testBasicGame; Alleen uitvoer in geval van "verbose"

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.26 TTT1.1a: Klasse Interface TicTacToe - nrOfMoves: Integer: 0 + doMove() + notDone(): BOOLEAN + setMark (col, row, marker: CHAR) + getMark (col, row: CHAR): CHAR Zijn alle waardes van type CHAR legale col & row ? => NEE: "a".. "c" of "1".. "3" Is elke waarde van type CHAR een legale marker ? => NEE: " ", "X" of "O" Wat is het verband tussen "getMark" en "setMark" ? => resultaat "getMark" is hetgeen vroeger gezet werd via "setMark"

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.27 Vuistregel Controleer de waardes van de argumenten die je binnenkrijgt (PRE) Controleer de waarde van het resultaat dat je teruggeeft (POST) Waarom ? Meeste fouten door interpretatieproblemen van de interface Hoe ? Schrijf pre- en postcondities bij elke procedure => vlak na BEGIN: ASSERT(, 100) => vlak voor END: ASSERT(, 120)

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.28 PROCEDURE (aTicTacToe: TicTacToe) getMark* (col, row: CHAR): CHAR; (** Answer the mark on the given position on the board. *) VAR result: CHAR; BEGIN ASSERT( ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3"), 100); result := aTicTacToe.board [ORD(col) - ORD("a"), ORD(row) - ORD("1")]; ASSERT(("X" = result) OR ("O" = result) OR (" " = result), 120); RETURN result; END getMark; Gebruik een "assertion" aborteert het programma => fout terug te vinden compileeroptie => geen redundante controles Constantes => WatSon

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.29 PROCEDURE (aTicTacToe : TicTacToe) getMark (col, row: CHAR): CHAR; (* Answer the mark on the given position on the board. *) (* precondition (100): ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3") *) (* postcondition (120):("X" = result) OR ("O" = result) OR (" " = result) *) WatSon uitvoer precondities constante in [ ] (& invarianten constante in [ ]) & postcondities constante in [ ] deel van de klasse-interface => CONTRACT met de buitenwereld automatisch gegenereerd => steeds synchroon met de code

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.30 Vuistregel Contracten gebruiken alleen publieke (geëxporteerde) declaraties Waarom ? contract verifieerbaar door externe modules Hoe ? Private (nt. geëxporteerde) declaraties extern niet toegankelijk => Denk goed na over wat je pre- & postcondities nodig hebben

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.31 PROCEDURE (aTicTacToe: TicTacToe) setMark* (col, row, mark: CHAR); (* Mark the given position on the board. *) BEGIN ASSERT( ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3"), 100); ASSERT(("X" =mark) OR ("O" = mark) OR (" " = mark), 100); aTicTacToe.board [ORD(col) - ORD("a"), ORD(row) - ORD("1")] := mark; ASSERT(aTicTacToe.board [ORD(col) - ORD("a"), ORD(row) - ORD("1")] = mark, 120); END setMark; board is nt. geëxporteerd => contract niet verifieerbaar

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.32 Vuistregel Contracten bepalen de volgorde van oproepen. Waarom ? Belangrijk, maar niet te lezen in een "platte" klasse-interface Hoe ? post-conditie van de voorgaande => pre-conditie van de volgende

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.33 PROCEDURE (aTicTacToe: TicTacToe) setMark* (col, row, mark: CHAR); (* Mark the given position on the board. *) BEGIN ASSERT( ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3"), 100); ASSERT(("X" =mark) OR ("O" = mark) OR (" " = mark), 100); aTicTacToe.board [ORD(col) - ORD("a"), ORD(row) - ORD("1")] := mark; ASSERT(aTicTacToe.getMark(col, row) = mark, 120); END setMark; Postconditie van setMark gebruikt getMark => setMark oproepen voor getMark

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.34 Vuistregel Gebruik pre-conditie om de initializatie van objecten te controleren Waarom ? initialisatie vergeten: veel voorkomende & moeilijk te vinden fout Hoe ? pre-conditie met "properlyInitialized" properlyInitialized ? Controleer een self-pointer

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.35 TYPE TicTacToe* = POINTER TO TicTacToeData; TicTacToeData* = RECORD initCheck: TicTacToe; … END; PROCEDURE (t: TicTacToe) properlyInitialized* (): BOOLEAN; BEGIN RETURN t.initCheck = t; END properlyInitialized; Wijst normaal naar zichzelf Object heeft een extra pointer …

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.36 PROCEDURE (aTicTacToe: TicTacToe) init*; … aTicTacToe.initCheck := aTicTacToe; ASSERT(aTicTacToe.properlyInitialized(), 120); END init; PROCEDURE (aTicTacToe: TicTacToe) getMark* (col, row: CHAR): CHAR; (** Answer the mark on the given position on the board. *) VAR result: CHAR; BEGIN ASSERT(aTicTacToe.properlyInitialized(), 100); ASSERT(…) "properlyInitialized" => preconditie andere procedures initializatie garandeert "properlyInitialized"

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.37 TTT1.1: Contracten TicTacToe properlyInitialized (): BOOLEAN positionInRange (col, row: CHAR): BOOLEAN markerInRange (marker: CHAR): BOOLEAN getMark (col, row: CHAR): CHAR setMark (col, row, marker: CHAR) > properlyInitialized() & positionInRange(col, row) > markerInRange(result) > properlyInitialized() & positionInRange(col, row) & markerInRange(marker) > getMark(col, row) = marker (marker = "O") OR (marker = "X") OR (marker = " ") ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3")

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.38 Interpretatie Interface Init() playing properlyInitialized setMark() getMark()

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.39 TicTacToeGame (1.1) aGame: TicTacToe : TicTacToe Game *[aGame.notDone()] displayMove () play displayGame() doMove() writeOn(w)

Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.40 Vuistregels (Samenvatting) ONTWERP –Keep It Stupidly Simple (the KISS principle) TESTEN –Minstens één test per "normaal" scenario –Als de functionaliteit groeit, dan groeit de test mee –Een test produceert zo weinig mogelijk uitvoer CONTRACTEN –Controleer de waardes van de argumenten die je binnenkrijgt –Controleer de waarde van het resultaat dat je teruggeeft –Contracten gebruiken alleen publieke (geëxporteerde) declaraties –Contracten bepalen de volgorde van oproepen. –Gebruik pre-conditie om de initializatie van objecten te controleren