Kip en ei spreekwoorden. Iemand met een windei betalen Iemand beduvelen/benadelen.
Hoe snel loopt iemand de 100 meter ?
description
Transcript of Hoe snel loopt iemand de 100 meter ?
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.1
Hoe snel loopt iemand de 100 meter ?
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.2
4. Planning• Tijdsschatting
– Analogie & Decompostie– Empirische schatting
• Plan 2.0 & Plan 2.1
• Conclusie• TicTacToe
– Code Hergebruik=> TestCase
– HTML Uitvoer=> polymorfisme
– “Undo”=> Lijsten & polymorfisme
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.3
"Ontwikkel" vereisten
Vereisten• Betrouwbaarheid• Aanpasbaarheid• Planning
Technieken• Testen + Contracten• Objectgericht ontwerp• Tijdsschatting
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.4
Schatting door analogieAnalogie
• Schatting = tijd gelijkaardig project• Wanneer gelijkaardig ?
– Zelfde probleemdomein– Zelfde mensen– Zelfde technologie
Empirischgespendeerde tijd voorbije projecten dient als
basis voor schatting volgende
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.5
Empirische schatting (project)
Grootte project
On
twik
kelt
ijd
= Voorbij
= Prognose
Legende
y = a x b
(b ±= 1)
Schat totale duur van project op basis van vorige projecten
X
Y
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.6
Schatting door decompositieDecompositie
• Schatting = tijd componenten + integratiekost
• Tijd componenten ?– cfr. opgeleverde componenten
• Integratiekost ?– constant (mits testen en OO)
Empirischgespendeerde tijd eerste componenten dient als
basis voor schatting volgende
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.7
Empirische schatting (component)
Grootte component
On
twik
kelt
ijd
co
mp
on
ent
= Opgeleverd
= Prognose
Legende
y = m x
Schat duur van één component op basis van opgeleverde componenten
X
Y
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.8
Grootte en Tijd• x = Grootte Component ?
# stappen + #uitzonderingenin use case
• y = Ontwikkellingstijd ?Zie tijdsbladen
Na oplevering n componenten: (xn, yn) => m = ∑ yn / ∑ xn
Schatting yn+1 voor grootte xn+1 => yn+1 = m.xn+1
vergelijking benaderende rechte
y = mx
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.9
Vuistregel
Empirische schatten is de basis voor een realistische
planning.
Waarom ?• Betere controle over aanpassingen aan de planning
Hoe ?• Hou tijdsbladen nauwkeurig bij• Maak prognose op basis van gespendeerde werk in het verleden
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.10
Use Case Grootte
play
player
Use Case 1: play• …
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
Exceptions
2.1. [Illegal Move] System issues a warning=> continue from step 2.1
#stappen = 5#uitzond. = 1grootte = 6
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.11
Voorbeelden
Zie voorbeelden in PlanTmpl20 & PlanTmpl21
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.12
Conclusie
• Betrouwbare prognoses zijn belangrijk– Hou tijdsbladen nauwkeurig bij !
• Schatten impliceert fouten– Voorzie een redelijke marge– Vertrouw niet blindelings op de cijfertjes
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.13
Code Hergebruik
TicTacToeTest is groot• code leesbaarheid• hergebruik ? copy + delete + insert
Aanpasbaarheid :(
TicTacToeTest
setUp()tearDown()init()fail(msg: ARRAY OF CHAR)should(b: BOOLEAN, msg: ARRAY OF CHAR): BOOLEANshouldNot(b: BOOLEAN, msg: ARRAY OF CHAR): BOOLEANcompareFiles(fileName1, fileName2: ARRAY OF CHAR): BOOLEANtestBasicPlayer(verbose: BOOLEAN): BOOLEANtestLegalMoves(verbose: BOOLEAN): BOOLEANtestRealGame(verbose: BOOLEAN): BOOLEANtestOutputGame(verbose: BOOLEAN): BOOLEAN
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.14
UnitTest
setUp()tearDown()init()fail(msg: ARRAY OF CHAR)should(b: BOOLEAN, msg: ARRAY OF CHAR): BOOLEANshouldNot(b: BOOLEAN, msg: ARRAY OF CHAR): BOOLEANcompareFiles(fileName1, fileName2: ARRAY OF CHAR): BOOLEAN
TicTacToeTest
setUp()tearDown()init()testBasicPlayer(verbose: BOOLEAN): BOOLEANtestLegalMoves(verbose: BOOLEAN): BOOLEANtestRealGame(verbose: BOOLEAN): BOOLEANtestOutputGame(verbose: BOOLEAN): BOOLEAN
UnitTest is superklasse• bevat algemene code• hergebruik ? subklasse per
te testen component/klasse
Code Hergebruik
TicTacToeTest is subklasse• erft algemene code• overschrijft setup, init & teardown• bevat alleen relevante code
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.15
Vuistregel
“Hollywood Principle”
wij roepen jouw op als we je nodig hebben
Waarom ?• Uitbreiding van bibliotheken via subklasses
Hoe ?• Superklasse in bibliotheek legt protocol van oproepen vast • Subklassen kunnen gedrag uitbreiden
Inleiding Software EngineeringInleiding Software Engineering
BetrouwbaarheidUniversiteit Antwerpen
2.16
Generisch Unittest Protocol
UnitTest
setUp(testCase:ARRAY OF CHAR)
run()tearDown()should (…): BOOLEANshouldNot (…): BOOLEAN
objectunder test: UnitTest
testXXXX()
xxx1stStimulus
setUp("testXXX")
run()
shouldNot(xxx1stObservation)
tearDown()
NEW(); init();
should(xxx2ndObservation)
xxx2ndStimulus
Evaluatie CriteriaObj. Collaboratie
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.17
Vuistregel
Klassen die vaak herbruikt worden hebben preciese
contracten
Waarom ?• Betere betrouwbaarheid door precieze beschrijving interface
Hoe ?• Leg de “normale” volgorde van oproepen vast • Specifieer volgorde via de respectievelijke pre- en postcondities
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.18
Oproepvolgorde voor “UnitTest”
Init()Setup
Initialized
SetUp()Running
Run()
TornDown TearDown()
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.19
Contracten voor “UnitTest”PROCEDURE (aTest : UnitTest) Init;
(* postcondition (120): aTest^.IsInitialized() *) (* postcondition (120): ~ aTest^.IsSetup() *)
(* postcondition (120): ~ aTest^.IsRunning() *) (* postcondition (120): aTest^.IsTornDown() *)
PROCEDURE (aTest : UnitTest) SetUp (testCase: ARRAY OF CHAR);
(* precondition (100): aTest^.IsInitialized() *) (* precondition (100): aTest^.IsTornDown() *)
(* precondition (100): LEN(testCase) < MaxTestCaseLength *)
(* postcondition (120): aTest^.IsSetup() *) (* postcondition (120): ~ aTest^.IsTornDown() *)
PROCEDURE (aTest : UnitTest) Run;
(* precondition (100): aTest^.IsInitialized() *) (* precondition (100): aTest^.IsSetup() *)
(* postcondition (120): ~ aTest^.IsSetup() *) (* postcondition (120): aTest^.IsRunning() *)
PROCEDURE (aTest : UnitTest) TearDown;
(* precondition (100): aTest^.IsInitialized() *) (* precondition (100): aTest^.IsRunning() *)
(* postcondition (120): ~ aTest^.IsRunning() *) (* postcondition (120): aTest^.IsTornDown() *)
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.20
Vuistregel
Schrijf testcode als subklasse(n) van
“UnitTest”
Waarom ?• Betere onderhoudbaarheid van de testcode
Hoe ?• Maak een subklasse van “UnitTest” per te testen component • Overschrijf Init(), SetUp(), TearDown(), Run ()
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.21
HTML Uitvoer (TTT16b)
play
player
Use Case 3: play HTML output• Extension of use case 1
Steps
use case 1 + additional steps
afer 2.2
2.3 write game on HTML (table)
during 33 write winner on HTML text
play HTML output
<<extends>>
(Erg gelijkaardig aan use case 2)=> inheritance & polymorfisme ?
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.22
PROCEDURE (aTicTacToe: TicTacToe) writeHTMLOn* (VAR w: Texts.Writer);…BEGIN
Texts.WriteString(w, "<P>");Texts.WriteString(w, "TicTacToe game after move ");Texts.WriteInt(w, aTicTacToe.nrOfMoves, 0);Texts.WriteString(w, "</P>");Texts.WriteLn(w);Texts.WriteString(w, "<TABLE BORDER>");Texts.WriteLn(w);FOR i := 0 TO 2 DO
Texts.WriteString(w, " <TR>");Texts.WriteLn(w);FOR j := 0 TO 2 DO
Texts.WriteString(w, " <TD>");…END;
…
"Ongeveer" gelijkaan writeOn=> duplicatie
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.23
PROCEDURE (aTest: TicTacToeTest) testOutputGame* (…writeHTML: BOOLEAN): BOOLEAN;
…IF writeHTML THEN
Texts.WriteString(w, "<HTML>");Texts.WriteLn(w);Texts.WriteString(w, "<HEAD>");Texts.WriteLn(w);…
END;WHILE aTest.aGame.notDone() DO
aTest.aGame.doMove();IF writeHTML THEN aTest.aGame.writeHTMLOn(w);
ELSE aTest.aGame.writeOn(w); END;END;IF writeHTML THEN
Texts.WriteString(w, "</BODY></HTML>");Texts.WriteLn(w);END;
…
=> complexeconditionele
logica
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.24
Vuistregel
Vermijd code duplicatie
& complexe logica
Refactor:• code duplicatie: gelijkaardige code in de superklasse;
verschillen in subklassen• complexe logica: normaal geval in de superklasse; speciale
gevallen in de subklassen
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.25
Splits Klassen (TTT16)
TicTacToeOutput
startPage()endPage()startBoard()endBoard()startRow(row: CHAR)endRow()boardLocation(row, column, marker: CHAR)
TicTacToeOutput
TicTacToe
writeOn()writeHTMLOn()
TicTacToe
TicTacToeHTMLOutput
TicTacToeTest
testOutputGame()
TicTacToeTest
Evaluatie Criteriaprintobjecten/iterators
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.26
PROCEDURE (aTest: TicTacToeTest) testOutputGame* (…writeHTML: BOOLEAN): BOOLEAN;
…Texts.OpenWriter(w);output.init ();output.startPage(w);WHILE aTest.aGame.notDone() DO
aTest.aGame.doMove();aTest.aGame.writeOn(w, output)
END;output.endPage(w);
complexecondities
=>polymorfisme
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.27
PROCEDURE (aTicTacToe: TicTacToe) writeOn* (VAR w: Texts.Writer;output: TicTacToeOutput.TicTacToeOutput);
BEGINoutput.startSentences(w);Texts.WriteString(w, "TicTacToe game after move ");Texts.WriteInt(w, aTicTacToe.nrOfMoves, 0);output.endSentences(w);output.startBoard(w);FOR i := 0 TO 2 DO
output.startRow(w, CHR(ORD("1") + i));FOR j := 0 TO 2 DO
output.boardLocation(…);END;output.endRow(w);
END;output.endBoard(w);
extra parametercontroleert verschil
verschillen ingedupliceerde code
=>polymorfisme
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.28
“Undo”
play
player
Use Case 4: play with undo option• Extension of use case 1
Steps
use case 1 + additional steps
afer 2.1
2.1.1 current player “undo” move
2.1.2 goto 2 (restart while loop)
play with undo option
<<extends>>
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.29
“Undo” Algoritme ?
• Hou een lijst bij met verloop spelstatusTicTacToeData* = RECORD (OOLists.NodeDesc)
nrOfMoves: INTEGER;
board: ARRAY 3, 3 OF CHAR;
players: ARRAY 2 OF Player;
lastCol, lastRow, lastMark : CHAR;
theWinner: Player;
END;
Herbruik bestaande code
Maar …“Klassen die vaak herbruikt worden hebben preciese contracten”
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.30
Contracten voor “OOLists” ?PROCEDURE (l : List) Init ();
PROCEDURE (l : List) LocateFirst ();
PROCEDURE (l : List) LocateLast ();
PROCEDURE (l : List) LocateNode (n: Node);
PROCEDURE (l : List) LocatePrev ();
PROCEDURE (l : List) LocateNext ();
PROCEDURE (l : List) InsertBefore (new: Node);
PROCEDURE (l : List) InsertAfter (new: Node);
PROCEDURE (l : List) Delete ();
PROCEDURE (l : List) GetNode (): Node;
PROCEDURE (l : List) Enumerate (P: NodeProc);
PROCEDURE (n : Node) NodeInfo ();
Contracten ? Moeilijk want interface zonder predicaten
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.31
“Lijst” met predicaten PROCEDURE (l : List) Init ();
(* postcondition (120): l^.IsInitialized() *)
PROCEDURE (l : List) Includes (n: Node): BOOLEAN;
(* precondition (100): l^.IsInitialized() *)
PROCEDURE (l : List) Insert (new: Node);
(* precondition (100): l^.IsInitialized() *)
(* postcondition (120): l^.Includes(new) *)
PROCEDURE (l : List) Delete (old: Node);
(* precondition (100): l^.IsInitialized() *)
(* postcondition (120): ~ l^.Includes(new) *)
Contracten ? Makkelijker want interface met veel predicaten
Evaluatie CriteriaReuse (lijsten)
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.32
Vuistregel
Prefereer een interface met predicaten
Waarom ?• Betere betrouwbaarheid door eenvoudige contracten
Hoe ?• Specifieer predicaten voor hoofdfunctionaliteit component • Roep predicaten op in pre- en post-condities
Inleiding Software EngineeringInleiding Software Engineering
PlanningUniversiteit Antwerpen
4.33
VuistregelsTesten• Schrijf testcode als subklasse(n) van “UnitTest”
Ontwerpen• Vermijd code duplicatie & complexe logica• “Hollywood Principle” – wij roepen jouw op als we je nodig hebben• Klassen die vaak herbruikt worden hebben preciese contracten• Prefereer een interface met predicaten
Plannen• Empirische schatten is de basis voor een realistische planning