Complexe Interacties

  • View
    42

  • Download
    0

Embed Size (px)

DESCRIPTION

Complexe Interacties. Een optimale werkverdeling. play. play. play. play. 3. Aanpasbaarheid. 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()) - PowerPoint PPT Presentation

Transcript

v 1.0

Universiteit AntwerpenAanpasbaarheid3.1Complexe Interacties

Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.2Een optimale werkverdelingplayplayplayplayInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.33. AanpasbaarheidAanpasbaarheid: TicTacToeversie 1.1b (displayGame)koppeling / cohesieversie 1.2 (Player)domeinmodelversie 1.3 (Player.moves)vermijd gebruikersinvoerversie 1.4 (Player. winner())Basisfunctionaliteitversie 1.5 (TictacToeTest.compareFiles(...))ASCII uitvoerConclusie

Inleiding Software EngineeringInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3Universiteit AntwerpenAanpasbaarheid3.4"Ontwikkel" vereistenVereistenBetrouwbaarheidAanpasbaarheidPlanningTechniekenTesten + ContractenObjectgericht ontwerpTijdsschatting

Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.5TicTacToeGame (1.1b)aGame:TicTacToe: TicTacToeGame*[aGame.notDone()] displayMove ()playdisplayGame()doMove()???Wat moeten wehier doen ?Inleiding Software EngineeringInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid5Universiteit AntwerpenAanpasbaarheid3.6PROCEDURE Play*;VAR aGame: TicTacToe.TicTacToe;BEGINinitDisplay;NEW(aGame);aGame.init();displayGame(aGame);WHILE aGame.notDone() DOaGame.doMove();displayGame(aGame);END;END Play;Wat moeten wehier doen ?Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.7PROCEDURE displayGame(aGame: TicTacToe.TicTacToe);VAR i, j: INTEGER;BEGIN...FOR i := ORD(TicTacToe.MinRow) TO ORD(TicTacToe.MaxRow) DOOutExt.Char(CHR(i));OutExt.Char("|");FOR j := ORD(TicTacToe.MinCol) TO ORD(TicTacToe.MaxCol) DOOutExt.Char(aGame.getMark(CHR(j), CHR(i)));OutExt.Char("|");END;OutExt.Ln;...END;OutExt.Ln;END displayGame;Afhankelijk van4 constantes &1 operatieInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.8Sterke KoppelingTicTacToeGamedisplayGame()TicTacToeMinRow : IntegerMaxRow : IntegerMinCol : IntegerMaxCol: IntegergetMark (col, row:CHAR): CHARTicTacToeGameTicTacToeTicTacToeGame is sterk gekoppeldaan TicTacToeEr zijn veel afhankelijkheden van TicTacToeGame naar TicTacToeEen verandering aan TicTacToe betekent meestal dat we ook TicTacToeGame moeten aanpassenAanpasbaarheid :(Evaluatie CriteriaInappropriate intimacyInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.9VuistregelPlaats het gedragdicht bij de data

Refactor:Routines die veel "get" operaties oproepen=> verplaats naar de corresponderende klasse.Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.10Plaats gedrag bij DataFOR i := ORD(TicTacToe.MinRow) TOORD(TicTacToe.MaxRow) DOOutExt.Char(CHR(i));OutExt.Char("|");FOR j := ORD(TicTacToe.MinCol) TOORD(TicTacToe.MaxCol) DO OutExt.Char(aGame.getMark(TicTacToewrite()TicTacToeTicTacToeGamedisplayGame()TicTacToeGameInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.11Zwakke KoppelingTicTacToeGamedisplayGame()TicTacToewrite()TicTacToeGameTicTacToeTicTacToeGame is zwak gekoppeldaan TicTacToeEr is maar n afhankelijkheid van TicTacToeGame naar TicTacToeEen verandering aan TicTacToe heeft zelden een effect op TicTacToeGameAanpasbaarheid :)Evaluatie CriteriaData EncapsulatieInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.12PROCEDURE displayGame(aGame: TicTacToe.TicTacToe);BEGINaGame.write;END displayGame;

PROCEDURE (aTicTacToe: TicTacToe) write* ();VAR i, j: INTEGER;BEGINOutExt....FOR i := ORD(MinRow) TO ORD(MaxRow) DOOutExt.Char(CHR(i));OutExt.Char("|");FOR j := ORD(MinCol) TO ORD(MaxCol) DOOutExt....END;...Maar nu is TicTacToe afhankelijk van OutExt=> Geen uitvoer op Out, Oberon.LogEn afhankelijkheid vanTicTacToeGame naar TicTacToeInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.13VuistregelNooit user-interface codein de basisklassen

Refactor:Extra parameter als in/uitvoerkanaal naar de buitenwereldInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.14PROCEDURE displayGame(aGame: TicTacToe.TicTacToe);BEGINaGame.writeOn(globalWriter);OutExt.Writer(globalWriter);END displayGame;

PROCEDURE (aTicTacToe: TicTacToe) writeOn* (VAR w: Texts.Writer);VAR i, j: INTEGER;BEGINTexts.WriteString(w, .......Extra parameter als uitvoerkanaalInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.15CohesieTicTacToe is redelijk cohesief1 operatie gebruiken impliceert ook het gebruik van alle anderealle operaties zijn nodig/nuttigveranderingen aan de interface zijn weinig waarschijnlijkAanpasbaarheid :)TicTacToeinit();positionInRange (col, row: CHAR): BOOLEANmarkerInRange (marker: CHAR): BOOLEANgetMark (col, row: CHAR): CHARnotDone (): BOOLEANdoMove ()writeOn (w: Texts.Writer)

positionInRange(col, row)

markerInRange(result)

notDone()setMark is nt. gexporteerdInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.16Koppeling vs. CohesieKoppeling=mate waarin een component afhankelijk is van andere componenten

te MINIMALISEREN=> veranderingen hebben minder impactCohesie=mate waarin de onderdelen van een component afhankelijk zijn van elkaar

te MAXIMALISEREN=> veranderingen zijn minder waarschijnlijkIdeaal=een component die niks doet=> perfectie is niet haalbaarInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.17TTT1.2playplayerUse Case 1: playGoal: 2 players play TicTacToe,1 should winPrecondition: An empty 3x3 boardSuccess end: 1 player is the winnerSteps1. Two players start up a game(First is "O"; other is "X")2. WHILE game not done2.1 Current player makes move2.2 Switch current player3. Anounce winnerWaar voegenwe dit bij ?Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.18VuistregelMaak een model van het probleemdomein= het DOMEINMODEL

Tips:Zelfstandige naamwoord als indicator voor object / klasse.Werkwoord als indicator voor operatieNaamgeving in basisklassen = naamgeving in probleemdomeinEvaluatie CriteriaGoeie ADTInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.19Zelfstandige NaamwoordenplayplayerUse Case 1: playGoal: 2 players play TicTacToe,1 should winPrecondition: An empty 3x3 boardSuccess end: 1 player is the winnerSteps1. Two players start up a game(First is "O"; other is "X")2. WHILE game not done2.1 Current player makes move2.2 Switch current player3. Anounce winnerLegendeSubstantiefWerkwoordInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.20TTT1.2: PlayerTicTacToenotDone(): BOOLEANdoMove()currentPlayer: PlayerdoMove()makeMove ()PlayermakeMove()mark(): CHARt: TicTacToe2switchPlayer ()Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.21PROCEDURE (aTicTacToe: TicTacToe) doMove* ();VAR row, col, mark: CHAR;BEGINASSERT(aTicTacToe.notDone(), 100);IF ODD(aTicTacToe.nrOfMoves) THENmark := "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 PlayerInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.22TYPEPlayer* = POINTER TO PlayerData;PlayerData* = RECORDmarker: CHAR;END;...PROCEDURE (aPlayer: Player) initMarked* (m: CHAR);...PROCEDURE (aPlayer: Player) makeMove* (aTicTacToe: TicTacToe);VAR row, col: CHAR;BEGINASSERT(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 ...Inleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.23TYPETicTacToeData* = 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* ();BEGINASSERT(aTicTacToe.notDone(), 100);aTicTacToe.players[aTicTacToe.nrOfMoves MOD 2].makeMove(aTicTacToe);aTicTacToe.nrOfMoves := aTicTacToe.nrOfMoves + 1;END doMove;... vervangen door operatieInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.24VuistregelEen test verwacht gn gebruikersinvoer

Waarom ?Veel & frequent testen => onmogelijk om steeds invoer te gevenHoe dan wel ?Invoerdata wordtgecreerd door testprogramma (testbestand ?)Ontwerp basisklassen onafhankelijk van het data invoer kanaalInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.25PROCEDURE TicTacToeTest.Main;...BEGINNEW(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);...PROCEDURE (aPlayer: Player) initMarkedMoves* (marked: CHAR; moves: ARRAY OF CHAR);een reeks zetten=> invoerdata door testprogrammaabc1OXO2XOX3OXOTTT1.3: Reeks van zettenInleiding Software EngineeringInleiding Software EngineeringUniversiteit AntwerpenAanpasbaarheid3.26UitzonderingenplayplayerUse Case 1: playSteps1. Two players start up a game(First is "O"; other is "X"