3.1! Complexe Interacties!



Vergelijkbare documenten
2.1! Ontdek de 7 verschillen!

Hoe snel loopt iemand de 100 meter?!

Inleiding Software Engineering!

Hoe snel loopt iemand de 100 meter? 4. Planning. Schatting door analogie. Vereisten

Hoe snel loopt iemand de 100 meter? 4. Planning

Hoe snel loopt iemand de 100 meter? 4. Planning

Hoe snel loopt iemand de 100 meter? 4. Planning. Schatting door analogie. Vereisten

Ontdek de 7 verschillen. Een oplossing met een foutje. Wat is Software Engineering? 2. Betrouwbaarheid

Serge Demeyer Universiteit Antwerpen. Project Software Engineering. 1ste Bachelor Informatica Academiejaar Cursus. Universiteit Antwerpen

Ontdek de 7 verschillen. 2.Betrouwbaarheid

Ontdek de 7 verschillen. Een oplossing met een foutje. Wat is Software Engineering? 2. Betrouwbaarheid

Ontdek de 7 verschillen. 2.Betrouwbaarheid

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Totaal

Preschool Kindergarten

Programmeren Blok B. Onderwerpen. wstomv/edu/2ip05/ College 8. Tom Verhoeff

Waarden persistent (blijvend) opslaan gaat in bestanden (files). Lege tekst: eof

Zelftest Inleiding Programmeren

Leren Programmeren met Visual Basic 6.0 Les 3+4. Hoofdstuk 4 : De Selectie

UNIVERSITEIT ANTWERPEN FACULTEIT WETENSCHAPPEN DEPARTEMENT WISKUNDE-INFORMATICA OBERON CODE CONVENTIONS

Zelftest Programmeren in PL/I

7 Omzetten van Recursieve naar Iteratieve Algoritmen

Programmeren met Arduino-software

{ specificatie (contract) en toelichting }

Tutorial 1, Delphi: Geldspraak

Datatypes Een datatype is de sort van van een waarde van een variabele, veel gebruikte datatypes zijn: String, int, Bool, char en double.

Compilers (2IC25) docent: G. Zwaan, HG 5.41, tel. ( )4291, webpagina:

Stacks and queues. Hoofdstuk 6

oefening JavaScript - antwoorden

Inleiding Software Engineering! Unit Testing, Contracten, Debugger! 13 Februari 2014!

Een unit bundelt een stel definities (van constantes, types, routines). Een unit is in een apart bestand ondergebracht.

Testen Aanvullende nota s inleiding software engineering

TOEGANG VOOR NL / ENTRANCE FOR DUTCH : lator=c&camp=24759

Informatica. Deel II: les 2. Leibniz - erven - digitaal. Jan Lemeire Informatica deel II februari mei Parallel Systems: Introduction

II. ZELFGEDEFINIEERDE FUNCTIES

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Gelijktijdigheid: Wederzijdse Uitsluiting & Synchronisatie Concurrency: Mutual Exclusion & Synchonization (5e ed: , Appendix A.

Veel succes! 1. Deze opgave bestaat uit een aantal deelvragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Probleem met dobbelspel. 2IP05: Programmeren Blok A. 5 spelers,2 dobbelstenen. wstomv/edu/2ip05/ Per ronde werpt elke speler 1

Javascript oefenblad 1

Programmeren in Java les 3

The first line of the input contains an integer $t \in \mathbb{n}$. This is followed by $t$ lines of text. This text consists of:

Ontwerp van Informatiesystemen

De keuzestructuur. Versie DD

Contents. Introduction Problem Definition The Application Co-operation operation and User friendliness Design Implementation

Practicum Ox intro. Practicum Ox intro. VU Numeriek Programmeren 2.5. Charles Bos. Vrije Universiteit Amsterdam. 3 april /18

Tentamen Objectgeorienteerd Programmeren

Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/

Knowledgeable Referenceable Personable Accountable Scalable

REEKS I. Zaterdag 6 november 2010, 9u

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/

{ auteur, toelichting }

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

Luister alsjeblieft naar een opname als je de vragen beantwoordt of speel de stukken zelf!

Ingebouwde klassen & methodes

Tentamen Object Georiënteerd Programmeren TI oktober 2014, Afdeling SCT, Faculteit EWI, TU Delft


Datastructuren: stapels, rijen en binaire bomen

Opmerkingen en vragen aan Ultieme vraag: Hoe beïnvloedt dit de winstkansen?

Modelleren en Programmeren

Derde Delphi Programma verkenning

Add the standing fingers to get the tens and multiply the closed fingers to get the units.

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Object Oriënteerd Programmeren A human process, to produce products for human consumption.

Variabelen en statements in ActionScript

Die inputs worden op een gecontroleerde manier aangeboden door (test) stubs. De test driver zorgt voor de uiteindelijke uitvoering ervan.

Methode: Verdeel en heers

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Datastructuren Werkcollege Intro

Gebruik van command-line operating systems

SAMPLE 11 = + 11 = + + Exploring Combinations of Ten + + = = + + = + = = + = = 11. Step Up. Step Ahead

ALGORITMIEK: answers exercise class 7

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Let op dat de scoping regels gerespecteerd blijven; het volgende voorbeeld mag geen fout melden.

Zelftest Programmeren in COBOL - deel I

Lineaire data structuren. Doorlopen van een lijst

How To: Setup MGE Network Shutdown Module V3 op het service console binnen VMware ESX 3.0.2

Stapelgeheugen. Processoren 6 maart 2012

1.2 ENVIRONMENT DIVISION.

Hoofdstuk 6: Zelf functies maken

Tentamen Programmeren in C (EE1400)

Stretching T. Mertens

Bijlage 1. Access VBA code voor het maken van barrièrebestanden.

Elementary Data Structures 3

Maak een pivot uit een Generic.List

Pascal uitgediept Data structuren

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00

Introductie in flowcharts

Instructies en blokken

Voorbeeld. public class BankRekening {

Verslag. Projectteam: 107 Datum: 16 oktober 2008 Project leden: Lennard Fonteijn Harish Marhe Nicoletta Saba Turgay Saruhan Robin Tummers

Project Embedded Linux Domaza. Elektronica-ICT. Dimitri Kozakiewiez Jonas Govaerts. Academiejaar

NBB Scheidsrechtersstage 3 september Onsportieve fout Flop Interpretaties. Nieuwe regels en signalen. Flop/fake

Pagina 1/6. Joris Van Geet! :59 Comment: 1pt voor iteratief 1pt voor incrementeel niets voor een voorbeeldje

USER GUIDE. 3DS firmware

Beginselen van programmeren Practicum 1 (Doolhof) : Oplossing

Een korte samenvatting van enkele FORTRAN opdrachten

Transcriptie:

3.1! Complexe Interacties!

3.2! Een optimale werkverdeling! play play play play

3.3! 3. Aanpasbaarheid: TicTacToe! versie 1.1b (displaygame)! koppeling / cohesie! versie 1.2 (Player)! domeinmodel! versie 1.3 (Player.moves)! vermijd gebruikersinvoer! versie 1.4 (Player. winner())! Basisfunctionaliteit! versie 1.5 (TictacToeTest.compareFiles(...))! Conclusie! ASCII uitvoer!

3.4! "Ontwikkel" vereisten! Vereisten! Betrouwbaarheid! Planning! Technieken! Testen + Contracten! Objectgericht ontwerp! Tijdsschatting!

3.5! TicTacToeGame (1.1b)! : TicTacToe Game agame: TicTacToe play *[agame.notdone()]!displaymove () domove() displaygame()??? Wat moeten we hier doen?!

3.6!!PROCEDURE Play*;!!!VAR agame: TicTacToe.TicTacToe;!!BEGIN!!!initDisplay;!!!NEW(aGame);!!!aGame.init();!!!displayGame(aGame);!!!WHILE agame.notdone() DO!!!!aGame.doMove();!!!!displayGame(aGame);!!!END;!!END Play;! Wat moeten we! hier doen?!

3.7!!PROCEDURE displaygame(agame: TicTacToe.TicTacToe);!!!VAR i, j: INTEGER;!!BEGIN!!!...!!!FOR i := ORD(TicTacToe.MinRow) TO ORD(TicTacToe.MaxRow) DO!!!!OutExt.Char(CHR(i));OutExt.Char(" ");!!!!FOR j := ORD(TicTacToe.MinCol) TO ORD(TicTacToe.MaxCol) DO!!!!!OutExt.Char(aGame.getMark(CHR(j), CHR(i)));!!!!!OutExt.Char(" ");!!!!END;!!!!OutExt.Ln;!!!!...!!!END;!!!OutExt.Ln;!!END displaygame;! Afhankelijk van 4 constantes & 1 operatie!

3.8! TicTacToeGame! TicTacToeGame displaygame()! TicTacToeGame is sterk gekoppeld aan TicTacToe! Er zijn veel afhankelijkheden van TicTacToeGame naar TicTacToe! Een verandering aan TicTacToe betekent meestal dat we ook Sterke Koppeling! Evaluatie Criteria! Inappropriate intimacy! TicTacToe! TicTacToe MinRow : Integer! MaxRow : Integer! MinCol : Integer! MaxCol: Integer! getmark (col, row:!!char): CHAR! TicTacToeGame moeten aanpassen! Aanpasbaarheid :(!

3.9! Vuistregel! Plaats het gedrag! dicht bij de data! Refactor:! Routines die veel "get" operaties oproepen => verplaats naar de corresponderende klasse.!

3.10! Plaats gedrag bij Data! TicTacToeGame! TicTacToeGame displaygame()! TicTacToe! write()! TicTacToe FOR i := ORD(TicTacToe.MinRow) TO!!!ORD(TicTacToe.MaxRow) DO!!OutExt.Char(CHR(i));OutExt.Char(" ");!!FOR j := ORD(TicTacToe.MinCol) TO!!!ORD(TicTacToe.MaxCol) DO!! OutExt.Char(aGame.getMark(!

3.11! Zwakke Koppeling! Evaluatie Criteria! Data Encapsulatie! TicTacToeGame! TicTacToeGame displaygame()! TicTacToe! write()! TicTacToe TicTacToeGame is zwak gekoppeld aan TicTacToe! Er is maar één afhankelijkheid van TicTacToeGame naar TicTacToe! Een verandering aan TicTacToe heeft zelden een effect op TicTacToeGame! Aanpasbaarheid :)!

3.12! PROCEDURE displaygame(agame: TicTacToe.TicTacToe);!!BEGIN!!!aGame.write;!!END displaygame;! Eén afhankelijkheid van! TicTacToeGame naar TicTacToe! PROCEDURE (atictactoe: TicTacToe) write* ();!!!!VAR i, j: INTEGER;!!BEGIN!!!OutExt...!!!FOR i := ORD(MinRow) TO ORD(MaxRow) DO!!!!OutExt.Char(CHR(i));OutExt.Char(" ");!!!!FOR j := ORD(MinCol) TO ORD(MaxCol) DO!!!!!OutExt...!!!!END;!!!!...! Maar nu is TicTacToe afhankelijk van OutExt! => Geen uitvoer op Out, Oberon.Log!

3.13! Vuistregel! Nooit user-interface code in de basisklassen! Refactor:! Extra parameter als in/uitvoerkanaal naar de buitenwereld!

3.14! PROCEDURE displaygame(agame: TicTacToe.TicTacToe);!!BEGIN!!!aGame.writeOn(globalWriter);!!!OutExt.Writer(globalWriter);!!END displaygame;! PROCEDURE (atictactoe: TicTacToe) writeon* (VAR w: Texts.Writer);!!!!VAR i, j: INTEGER;!!BEGIN!!!Texts.WriteString(w,...!!!...! Extra parameter als uitvoerkanaal!

TicTacToe Cohesie! init();! positioninrange (col, row: CHAR): BOOLEAN! markerinrange (marker: CHAR): BOOLEAN! getmark (col, row: CHAR): CHAR! notdone (): BOOLEAN! domove ()! writeon (w: Texts.Writer)! 3.15! <<precondition>>! positioninrange(col, row)! <<postcondition>>! markerinrange(result)! <<precondition>>! notdone()! TicTacToe is redelijk cohesief! 1 operatie gebruiken impliceert ook het gebruik van alle andere! alle operaties zijn nodig/nuttig! veranderingen aan de interface zijn weinig waarschijnlijk! Aanpasbaarheid :)! setmark is nt. geëxporteerd!

3.16! Koppeling vs. Cohesie! Koppeling! =!mate waarin een component afhankelijk is van andere componenten! Cohesie! =!mate waarin de onderdelen van een component afhankelijk zijn van elkaar! te MINIMALISEREN => veranderingen hebben minder impact! te MAXIMALISEREN => veranderingen zijn minder waarschijnlijk! Ideaal! =!een component die niks doet! => perfectie is niet haalbaar!

3.17! TTT1.2! player play Waar voegen! we dit bij?! 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!

3.18! Vuistregel! Evaluatie Criteria! Goeie ADT! Maak een model van het probleemdomein! = het DOMEINMODEL! Tips:! Zelfstandige naamwoord als indicator voor object / klasse.! Werkwoord als indicator voor operatie! Naamgeving in basisklassen = naamgeving in probleemdomein!

3.19! Zelfstandige Naamwoorden! player play Legende! Substantief! Werkwoord! 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!

3.20! TicTacToe notdone(): BOOLEAN! domove() TTT1.2: Player! domove() t: TicTacToe makemove () currentplayer! : Player switchplayer () 2! Player makemove()! mark(): CHAR

3.21! PROCEDURE (atictactoe: TicTacToe) domove* ();!!VAR row, col, mark: CHAR;!!BEGIN!!!ASSERT(aTicTacToe.notDone(), 100);!!!IF ODD(aTicTacToe.nrOfMoves) THEN!!!!mark := "X" ELSE mark := "O"; END;!!!col := CHR((aTicTacToe.nrOfMoves MOD 3) + ORD("a"));!!!row:= CHR((aTicTacToe.nrOfMoves DIV 3) + ORD("1"));!!!aTicTacToe.setMark(col, row, mark);!!!atictactoe.nrofmoves := atictactoe.nrofmoves + 1;! END domove;! Verplaats dit stuk code naar Player!

3.22! TYPE!...!!Player* = POINTER TO PlayerData;!!PlayerData* = RECORD!!!marker: CHAR;!!END;! PROCEDURE (aplayer: Player) initmarked* (m: CHAR);!...! PROCEDURE (aplayer: Player) makemove* (atictactoe: TicTacToe);!!VAR row, col: CHAR;!!BEGIN!!!ASSERT(aTicTacToe.notDone(), 100);!!!col := CHR((aTicTacToe.nrOfMoves MOD 3) + ORD("a"));!!!row:= CHR((aTicTacToe.nrOfMoves DIV 3) + ORD("1"));!!!aTicTacToe.setMark(col, row, aplayer.mark());!!end makemove;! Verplaatste code...!

3.23! TYPE!!TicTacToeData* = RECORD!!!...!!!players: ARRAY 2 OF Player;!!END;! PROCEDURE (atictactoe: TicTacToe) init*;!!...!!new(atictactoe.players[0]); NEW(aTicTacToe.players[1]);!!aTicTacToe.players[0].initMarked("O"); atictactoe.players[1].initmarked("x");! END init;!...! PROCEDURE (atictactoe: TicTacToe) domove* ();! BEGIN!!ASSERT(aTicTacToe.notDone(), 100);!!aTicTacToe.players[aTicTacToe.nrOfMoves MOD 2].makeMove(aTicTacToe);!!aTicTacToe.nrOfMoves := atictactoe.nrofmoves + 1;! END domove;!... vervangen door operatie!

3.24! Vuistregel! Een test verwacht géén gebruikersinvoer! Waarom?! Veel & frequent testen => onmogelijk om steeds invoer te geven! Hoe dan wel?! Invoerdata wordtgecreëerd door testprogramma (testbestand?)! Ontwerp basisklassen onafhankelijk van het data invoer kanaal!

3.25! PROCEDURE TicTacToeTest.Main;!!...! BEGIN!!NEW(aTest); atest.init();!!atest.setup("testbasicgame",!!!"a1 c1 b2 a3 c3", "b1 a2 c2 b3");!!if ~ atest.testbasicgame (TRUE) THEN testspassed := FALSE; END;!!aTest.tearDown();!!...! END Main;!...! PROCEDURE (atictactoe: TicTacToe) init* (mvo, mvx: ARRAY OF CHAR);!...! TTT1.3: Reeks van zetten!!a!b!c! 1!O!X!O! 2!X!O!X! 3!O!X!O een reeks zetten => invoerdata door testprogramma! PROCEDURE (aplayer: Player) initmarkedmoves* (marked: CHAR; moves: ARRAY OF CHAR);!

3.26! Uitzonderingen! player play tijdens 2.1 kan! "Illegal Move"! voorkomen! 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!

3.27! Vuistregel! Minstens één test per "uitzondering"! Waarom?! Alle scenarios in de specificaties moeten getest worden! Hoe?! Controleer resultaat uitzondering via "should" & "shouldnot" => denk eraan: " Een test produceert zo weinig mogelijk uitvoer"!

3.28! PROCEDURE (t: TicTacToeTest) testlegalmoves* (v: BOOLEAN): BOOLEAN;!!!PROCEDURE aux (in: ARRAY OF CHAR; legal: BOOLEAN): BOOLEAN;!!!VAR result: BOOLEAN;!!!BEGIN!!!!result := TicTacToe.LegalMoves(in);!!!!IF ~ atest.should(legal = result, ) THEN RETURN FALSE; END;!!!END!!!!BEGIN!!!IF ~ aux("a1 c1 b2 a3 c3", TRUE) THEN RETURN FALSE END;!!!IF ~ aux("b1 a2 c2 b3", TRUE) THEN RETURN FALSE END;!!!IF ~ aux("", TRUE) THEN RETURN FALSE END;!!!IF ~ aux(" b1 a2 c2 b3 ", TRUE) THEN RETURN FALSE END;!!!IF ~ aux("a1", FALSE) THEN RETURN FALSE END;!!!IF ~ aux("a5", FALSE) THEN RETURN FALSE END;!!!IF ~ aux("a19", FALSE) THEN RETURN FALSE END;!!!RETURN TRUE;!!END testlegalmoves;!

3.29! PROCEDURE TicTacToeTest.Main;!!...! BEGIN!!NEW(aTest); atest.init();!!atest.setup("testrealgame (diagonal wins)",!!!!"a1 c1 b2 a3 c3", "b1 a2 c2 b3");!!if ~ atest.testrealgame (TRUE, "O", 7) THEN testspassed := FALSE; END;!!aTest.tearDown();!!...! END Main;! TTT1.4: Winnaar!!a!b!c! 1!O!X!O! 2!X!O!X! 3!O Test verifieert winnaar + aantal zetten!

3.30! ASCII Uitvoer (TTT15)! player play <<extends>> play simple output Use Case 2: play simple output! Extension of use case 1! Steps! use case 1 + additional steps! afer 2.2! during 3! 2.3 write game on ASCII text! 3 write winner on ASCII text! (Minstens één test per "normaal" scenario)! nieuwe use case => uitbreiding tests!

3.31! PROCEDURE (atest: TicTacToeTest) testoutputgame* (verbose: BOOLEAN;!!!useOutput, expectedoutput: ARRAY OF CHAR): BOOLEAN;!!!Texts.OpenWriter(w);!!!WHILE atest.agame.notdone() DO!!!aTest.aGame.doMove();!!!aTest.aGame.writeOn(w);!!END;!!lenWritten :=atest.writertofile(w, useoutput);!!if ~ atest.should(atest.comparefiles(useoutput, expectedoutput),!!!!"output written is not what was expected")! END testoutputgame;!! Vergelijk! gegenereerde met! verwachte uitvoer! oproep v.d. test! atest.setup("testoutputgame (full board)", "a1 c1 b2 b3 c3", "b1 a2 c2 a3");! IF ~ atest.testoutputgame (FALSE, "testoutput1.txt", "fullboard.txt")!

3.32! Vuistregel! Test lange uitvoer door! het vergelijken van files.! Waarom?! Veel & frequent testen => makkellijk om steeds uitvoer te testen! Hoe?! Verwachte uitvoerdata wordt één maal manueel gecreëerd! Achteraf wordt verwachte uitvoer vergeleken met gegenereerde uitvoer!

3.33! Eerst moet je het doen! Conclusie! KISS principle: klein beginnen en langzaam groeien! tests lopen + contracten worden nageleefd! Daarna moet je het goed doen! lage koppeling, hoge cohesie! model van het probleemdomein! goed ontwerp! en... tests blijven lopen + contracten blijven nageleefd!

3.34! Ontwerpen! Vuistregels! Plaats het gedrag dicht bij de data! Nooit user-interface code in de basisklassen! Maak een model van het probleemdomein (= het domeinmodel)! zelfstandige naamwoorden & werkwoorden als indicators! Testen! Een test verwacht géén gebruikersinvoer! Minstens één test per "uitzondering"! Test lange uitvoer door het vergelijken van files!