Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen.

Slides:



Advertisements
Verwante presentaties
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.
Advertisements

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.
OOS Object geOrienteerd Software-ontwerp - 3
Ronde (Sport & Spel) Quiz Night !
Inleiding Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Gelinkte lijsten Finite State.
IST Status Gerrit van Nieuwenhuizen IST-MIT meeting BNL, July 24, 2008
Beyond Big Grid – Amsterdam 26 september 2012 Enquette 77 ingevulde enquettes, waarvan 60 met gebruikservaring = Mainly Computer Science.
Macbeth Quotes.
Identification Documents Port of Ghent All documents in this leaflet are copies of identification/legitimation documents that authorise persons to access.
SCENARIO BASED PRODUCT DESIGN
NWO-AB. 2/23 missie 3/23 RuG LEI NIOZ UT TUe ASTRON AMOLF TUD SRON + Veel colleges, masteropleiding, onderzoeksschool (80 PhDs) samenwerking.
Ofwel Oom Piet moet lekker poepen thuis
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Inleiding Software Engineering Universiteit AntwerpenPlanning 4.1 Hoe snel loopt iemand de 100 meter ?
Complexe Interacties Universiteit Antwerpen Aanpasbaarheid.
LokWeb and LWB 7 maart 2006 by Maarten and Hilverd.
Probleem P 1 is reduceerbaar tot P 2 als  afbeelding  :P 1  P 2 zo dat: I yes-instantie van P 1   (I) yes-instantie van P 2 als ook:  polytime-algoritme,
1 Voorwaarden hergebruik Modulair ontwerp Low coupling High cohesion.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Dagdeel 2.
Netwerk Algorithms: Shortest paths1 Shortest paths II Network Algorithms 2004.
Dia 1 Politiewerk in de Toekomst Kan technologie “ons” helpen om het veiliger te maken?
Inleiding programmeren in C++ Life Science & Technology 2 februari Universiteit Leiden.
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:
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.
Instructions and warnings. Instructions Om in het Engels een instructie te maken gebruikt men, net als in het Nederlands de Gebiedende Wijs.
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.
Geheugen, distributie en netwerken Netwerken: de basis voor distributie van gegevens en taken (processen) –bestaan zo’n 40 jaar, zeer snelle ontwikkeling.
Organizing Organization is the deployment of resources to achieve strategic goals. It is reflected in Division of labor into specific departments & jobs.
Motivation One secret for success in organizations is motivated and enthusiastic employees The challenge is to keep employee motivation consistent with.
Simple en continuous tenses Met of zonder –ing. Alle tijden kun je in het Engels met of zonder –ing-form maken: I sleep… I slept… I had slept… I will sleep…
ZijActief Koningslust 10 jaar Truusje Trap
OO Analyse in de praktijk OO Analyse in de praktijk V Enkele Design Patterns.
Deltion College Engels B1 Gesprekken voeren [Edu/005] thema: applying for a job can-do : kan een eenvoudig sollicitatiegesprek voeren © Anne Beeker Alle.
Deltion College Engels B1 Gesprekken voeren [Edu/007] theme: Can I have my money back… can-do : kan minder routinematige situaties aan © Anne Beeker Alle.
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 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.
Future (toekomst) Je krijgt 2 verschillende vormen van Future.
Shortest path with negative arc-costs allowed. Dijkstra?
Rational Unified Process RUP Jef Bergsma. Iterations –Inception –Elaboration –Construction –Transition De kernbegrippen (Phases)
Benjamin Boerebach, Esther Helmich NVMO workshop 12 juni 2014.
De financiële functie: Integrale bedrijfsanalyse©
25 Ways To Be Healthier. 25 Manieren om Gezonder te leven. click.
Het geheim van Linked Data Marcel ReuversGeonovum CB-NL 20 november 2014.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
Lesson 10. Today’s class  Check homework  Passive  Punctuation  Homework.
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
Deltion College Engels B1 Gesprekken voeren [Edu/006] thema: Look, it says ‘No smoking’… can-do : kan minder routinematige zaken regelen © Anne Beeker.
The Research Process: the first steps to start your reseach project. Graduation Preparation
Key Process Indicator Sonja de Bruin
Today: Chapter 2 Discuss SO 2 What to study for your test?
Transcript van de presentatie:

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.1 Ontdek de 7 verschillen

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

Project 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.1: ontwerp, implementatie met slechte test (manuele controle) –versie 1.2: contracten & eerste demonstratie

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

Project 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

Project 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

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

Project 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

Project 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)

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.10 TTT1.0: Ontwerp TicTacToe notDone(): BOOLEAN doMove() nrOfMoves(): INTEGER t: TicTacToeaGame play *[t.notDone()] doMove () class TicTacToe { public: TicTacToe(); bool notDone(); void doMove(); int nrOfMoves(); private: … }; WHILE t.notDone() DO t.doMove(); END; klein ontwerp: een lus Notatie = UML (Zie boek “Using UML …”)

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.11 class TicTacToe { public: TicTacToe(); bool notDone(); void doMove(); int nrOfMoves(); private: int _nrOfMoves; }; TicTacToe::TicTacToe() { _nrOfMoves = 0; } bool TicTacToe::notDone() { return _nrOfMoves < 9; } void TicTacToe::doMove() { _nrOfMoves++; } int TicTacToe::nrOfMoves() { return _nrOfMoves; } simpele implementatie: een teller

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.12 Vuistregel Minstens één test per "normaal" scenario Waarom ? Minimum veiligheidsnorm Hoe ? Controleer de tussentijdse toestand via ”EXPECT_…”

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.13 TTT1.0: Test TicTacToeTest setUp() tearDown() testDefaultConstructor() testHappyDay() ttt_ : TicTacToe : TicTacToeTest testHappyDay() *[ttt_.notDone()] doMove () setUp() EXPECT_TRUE(aGame.notDone()) EXPECT_FALSE(aGame.notDone()) tearDown() TicTacToe() EXPECT_EQ(9, ttt_.nrOfMoves()) EXPECT_EQ(0, ttt_.nrOfMoves())

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.14 // Tests the "happy day" scenario TEST_F(TicTactToeTest, HappyDay) { EXPECT_EQ(0, ttt_.nrOfMoves()); EXPECT_TRUE(ttt_.notDone()); while (ttt_.notDone()) { ttt_.doMove(); }; EXPECT_FALSE(ttt_.notDone()); EXPECT_EQ(9, ttt_.nrOfMoves()); } Controleer tussen- tijdse toestand

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.15 class TicTactToeTest: public ::testing::Test { protected: virtual void SetUp() { } virtual void TearDown() { } TicTacToe ttt_; };... Tests here by invoking macro TEST_F... // the main function... there can only be one :) int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } Infrastructuur door GoogleTest Spelregel: werkt in computerlabo Zorg *zelf* voor de nodige bibliotheken Test het vooraf in de computerklas zorg voor makefiles Eclipse is niet noodzakelijk

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.16 [==========] Running 2 tests from 1 test case. [ ] Global test environment set-up. [ ] 2 tests from TicTactToeTest [ RUN ] TicTactToeTest.DefaultConstructor [ OK ] TicTactToeTest.DefaultConstructor (0 ms) [ RUN ] TicTactToeTest.HappyDay [ OK ] TicTactToeTest.HappyDay (0 ms) [ ] 2 tests from TicTactToeTest (0 ms total) [ ] Global test environment tear-down [==========] 2 tests from 1 test case ran. (1 ms total) [ PASSED ] 2 tests. Testresultaat!

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.17 [ FAILED ] TicTactToeTest.HappyDay (1 ms) [ ] 2 tests from TicTactToeTest (1 ms total) [ ] Global test environment tear-down [==========] 2 tests from 1 test case ran. (1 ms total) [ PASSED ] 1 test. [ FAILED ] 1 test, listed below: [ FAILED ] TicTactToeTest.HappyDay Testresultaat (bewust) falende test

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.18 TTT1.1: doMove t: TicTacToe doMove() TicTacToe - nrOfMoves: Integer: 0 - board + doMove() + nrOfMoves() + notDone(): BOOLEAN + setMark (col, row, marker: CHAR) + getMark (col, row: CHAR): CHAR abc1OXO2XOX3OXOabc1OXO2XOX3OXO nrOfMoves := nrOfMoves + 1 …………

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.19 void TicTacToe::doMove() { char col, row, marker; col = (char) (_nrOfMoves % 3) + 'a'; row = (char) (_nrOfMoves / 3) + '0'; if (_nrOfMoves % 2) marker = 'X'; else marker = 'O’; // when _nrOfMoves is odd assign 'X' this->setMark(col, row, marker); _nrOfMoves++; } Ontwerp & Implementatie groeien langzaam

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

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.21 TEST_F(TicTactToeTest, HappyDay) {... while (ttt_.notDone()) { ttt_.doMove(); }; char col, row; bool markIsX = false; // start with 'O' for (col = 'a'; col < 'd'; col++) for (row = '0'; row < '3'; row++) { if (markIsX) EXPECT_EQ('X', ttt_.getMark(col, row)); else EXPECT_EQ('O', ttt_.getMark(col, row)); markIsX = not markIsX; }... Test groeit mee … ook TestDefaultConstructor

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.22 Vuistregel Een test produceert zo weinig mogelijk uitvoer ”PASSED" "FAILED" Waarom ? Veel en frequent testen ⇒ onmogelijk om uitvoer te controleren Hoe dan wel ? Tests antwoorden “PASSED” = alle tests zijn goed verlopen (welke ?) of “FAILED” = minstens één test heeft gefaald (welke ?)

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.23 TEST_F(TicTactToeTest, ManualBADHappyDayTest) { cout << "Start of game: ttt.nrOfMoves() = " << ttt_.nrOfMoves() << endl; cout << "Start of game: ttt.notDone() = " << ttt_.notDone() << endl; while (ttt_.notDone()) { ttt_.doMove(); } char col, row; bool markIsX = false; // start with 'O' for (col = 'a'; col < 'd'; col++) for (row = '0'; row < '3'; row++) { cout << col << " - " << row << ": " << ttt_.getMark(col, row) << " =? "; if (markIsX) cout << "X" << endl; else cout << "O" << endl; markIsX = not markIsX; } cout << "End of game: ttt.nrOfMoves() = " << ttt_.nrOfMoves() << endl; cout << "End of game: ttt.notDone() = " << ttt_.notDone() << endl; } Een slechte test

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.24 Start of game: ttt.nrOfMoves() = 0 Start of game: ttt.notDone() = 1 a - 0: O =? O a - 1: X =? X a - 2: O =? O b - 0: X =? X b - 1: O =? O b - 2: X =? X c - 0: O =? O c - 1: X =? X c - 2: O =? O End of game: ttt.nrOfMoves() = 9 End of game: ttt.notDone() = 0 Hoe weet ik of deze uitvoer correct is ? Manuele Verificatie van Tests Schrijf *nooit* testcode die manuele verificatie van de uitvoer vereist

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 3.25 Manuele tests = *onvoldoende* Evaluatie Criteria Nt. alle functionaliteit getest= *onvoldoende*

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.26 TTT1.1: Klasse Interface TicTacToe - nrOfMoves: Integer: 0 - board + doMove() + nrOfMoves() + 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"

Project Software Engineering Een klein foutje … Universiteit AntwerpenBetrouwbaarheid 2.27 //The state of the game is represented as 3x3 array //of chars marked ' ', 'X', or 'O'. //We index the state using chess notation, i.e., //column is 'a' through 'c' and row is '1' through '3'.*) void setMark(char col, char row, char marker); char getMark(char col, char row); TicTacToe.h TEST_F(TicTactToeTest, DefaultConstructor) { char col, row; for (col = 'a'; col < 'd'; col++) for (row = '0'; row < '3'; row++) { EXPECT_EQ(' ', ttt_.getMark(col, row)); }; TicTactests.cpp

Project Software Engineering Een klein foutje … grote gevolgen (1/2) Universiteit AntwerpenBetrouwbaarheid 2.28 [bron: Wikipedia]

Project Software Engineering Een klein foutje … grote gevolgen (2/2) Universiteit AntwerpenBetrouwbaarheid — Buffer overflow in Berkeley Unix finger daemon. he first internet worm (the so-called Morris Worm) infects between 2,000 and 6,000 computers in less than a day by taking advantage of a buffer overflow. The specific code is a function in the standard input/output library routine called gets() designed to get a line of text over the network. Unfortunately, gets() has no provision to limit its input, and an overly large input allows the worm to take over any machine to which it can connect. Programmers respond by attempting to stamp out the gets() function in working code, but they refuse to remove it from the C programming language's standard input/output library, where it remains to this day — buffer overflow Several systems suffer from a "buffer overflow error", when extremely long addresses are received. The internal buffers receiving the addresses do not check for length and allow their buffers to overflow causing the applications to crash. Hostile hackers use this fault to trick the computer into running a malicious program in its place. [bron: History’s Most (In)Famous Software Failures]

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.30 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 ⇒ PRE: REQUIRE(, ) ⇒ POST: ENSURE(, )

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.31 #include "DesignByContract.h”... char TicTacToe::getMark(char col, char row) { char result; REQUIRE(('a' <= col) && (col <= 'c'), "col must be between 'a' and 'c'"); REQUIRE(('1' <= row) && (row <= '3'), "row must be between '1' and '3'"); result = _board[(int) col - 'a'][(int) row - '1']; ENSURE(('X' == result) || ('O' == result) || (' ' == result), "getMark returns 'X', 'O' or ' '"); return result; } Gebruik een "assertion" aborteert het programma ⇒ fout terug te vinden #include met REQUIRE en ENSURE naamconventie: gebruik “result” in post conditie

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.32 Bestand: TicTacToe.h char getMark(char col, char row); //REQUIRE(('a' <= col) && (col <= 'c'), "col must be between 'a' and 'c'"); //REQUIRE(('1' <= row) && (row <= '3'), "row must be between '1' and '3'"); //ENSURE(('X' == result) || ('O' == result) || (' ' == result), //"getMark returns 'X', 'O' or ' '"); KOPIEER CONTRACTEN IN.h file deel van de klasse-interface ⇒ CONTRACT met de buitenwereld (soms automatisch gegenereerd ⇒ steeds synchroon met de code)

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.33 Vuistregel Contracten gebruiken alleen publieke (geëxporteerde) declaraties Waarom ? contract verifiëerbaar door externe partijen (modules, …) Hoe ? Private (nt. geëxporteerde) declaraties extern niet toegankelijk ⇒ Denk goed na over wat je pre- & postcondities nodig hebben

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.34 void TicTacToe::setMark(char col, char row, char marker) { REQUIRE(('a' <= col) && (col <= 'c'), "col must be between 'a' and 'c'"); REQUIRE(('1' <= row) && (row <= '3'), "row must be between '1' and '3'"); REQUIRE(('X' == marker) || ('O' == marker) || (' ' == marker), "marker must be 'X', 'O' or ' '"); _board[(int) col - 'a'][(int) row - '1'] = marker; ENSURE(_board[(int) col - 'a'][(int) row - '1'] == marker), "setMark postcondition failure"); } _board is nt. geëxporteerd ⇒ contract niet verifieerbaar

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.35 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

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.36 void TicTacToe::setMark(char col, char row, char marker) { REQUIRE(('a' <= col) && (col <= 'c'), "col must be between 'a' and 'c'"); REQUIRE(('1' <= row) && (row <= '3'), "row must be between '1' and '3'"); REQUIRE(('X' == marker) || ('O' == marker) || (' ' == marker), "marker must be 'X', 'O' or ' '"); _board[(int) col - 'a'][(int) row - '1'] = marker; ENSURE((getMark(col, row) == marker), "setMark postcondition failure"); } Postconditie van setMark gebruikt getMark ⇒ setMark oproepen voor getMark

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.37 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

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.38 class TicTacToe { … private: TicTacToe * _initCheck; … }; TicTacToe::TicTacToe() { _initCheck = this; … } bool TicTacToe::properlyInitialized() { return _initCheck == this; } Wijst normaal naar zichzelf na initializatie Object heeft een extra pointer … En kan achteraf geverifiëerd worden

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.39 class TicTacToe { public: TicTacToe(); //ENSURE(properlyInitialized(), "constructor must end …"); … bool notDone(); //REQUIRE(this->properlyInitialized(), //"TicTacToe wasn't initialized when calling notDone"); void doMove(); //REQUIRE(this->properlyInitialized(), // "TicTacToe wasn't initialized when calling doMove");... "properlyInitialized" ⇒ preconditie andere procedures "properlyInitialized" ⇒ postconditie alle constructors ⇒ verifiëer in testDefaultConstructor

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.40 TTT1.2: Contracten TicTacToe properlyInitialized (): BOOLEAN notDone() doMove() nrOfMoves() getMark (col, row: CHAR): CHAR setMark (col, row, marker: CHAR) > properlyInitialized() & ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3") > (result = "O”) OR (result = "X") OR (result = " ") > properlyInitialized() & ("a"<=col) & (col<="c") & ("1"<=row) & (row<="3") & ((marker = "O”) OR (marker = "X") OR (marker = " ")) > getMark(col, row) = marker Zie TicTacToe.h

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.41 Interpretatie Interface Init() playing properlyInitialized setMark() getMark() notDone() doMove() nrOfMoves()

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 3.42 Evaluatie Criteria Gebruik van private/protected attributed Niet zichtbaar in.h file = verkeerd gebruik = *onvoldoende* Beperkt tot initializatie = *onvoldoende*

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.43 Vuistregel schrijf ook een test voor ContractViolations (maar gebruik commentaar) Waarom ? kijk na of de ABNORMAL END wel degelijk gebeurt Hoe ? schrijf tests met oproep illegale waardes gebruik EXPECT_DEATH ter verificatie EXPECT_DEATH(ttt_.getMark('a' - 1, '1'), "failed assertion");

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.44 TicTacToeMain (1.2) aGame: TicTacToe : TicTacToe Game *[aGame.notDone()] play displayGame() doMove() getMark()

Project Software Engineering Universiteit AntwerpenBetrouwbaarheid 2.45 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 –schrijf ook een test voor ContractViolations