5. Iterative Development. © O. Nierstrasz P2 — Iterative Development 4.2 Iterative Development Sources  Rebecca Wirfs-Brock, Alan McKean, Object Design.

Slides:



Advertisements
Similar presentations
Intermediate Code Generation
Advertisements

Web Application Development Slides Credit Umair Javed LUMS.
8. Introduction to Denotational Semantics. © O. Nierstrasz PS — Denotational Semantics 8.2 Roadmap Overview:  Syntax and Semantics  Semantics of Expressions.
CS0007: Introduction to Computer Programming Introduction to Classes and Objects.
Composition CMSC 202. Code Reuse Effective software development relies on reusing existing code. Code reuse must be more than just copying code and changing.
12. Common Errors, a few Puzzles. © O. Nierstrasz P2 — Common Errors, a few Puzzles 12.2 Common Errors, a few Puzzles Sources  Cay Horstmann, Computing.
ESE Einführung in Software Engineering 6. Modeling Objects and Classes Prof. O. Nierstrasz.
ESE Einführung in Software Engineering 7. Modeling Behaviour Prof. O. Nierstrasz.
Introduction to Software Engineering 7. Modeling Behaviour.
Unit 251 Summary  Requirements may be represented in itemized format or in visual modeling (UML). Once the complete set of requirements are in our hand,
6. Inheritance and Refactoring. © O. Nierstrasz P2 — Inheritance and Refactoring 6.2 Inheritance and Refactoring Overview  Uses of inheritance —conceptual.
CP — Concurrent Programming 8. Liveness and Asynchrony Prof. O. Nierstrasz Wintersemester 2005 / 2006.
Representing a Game Board In a game, we represent the action taking place using an array – In a very simple game, we use individual variables to represent.
1 CS2200 Software Development Lecture: Testing and Design A. O’Riordan, 2008 K. Brown,
10. Petri Nets Prof. O. Nierstrasz. Roadmap  Definition: —places, transitions, inputs, outputs —firing enabled transitions  Modelling: —concurrency.
12. Common Errors, a few Puzzles. © O. Nierstrasz P2 — Common Errors, a few Puzzles 12.2 Common Errors, a few Puzzles Overview  Common errors … —Typical.
ESE Einführung in Software Engineering N. XXX Prof. O. Nierstrasz Fall Semester 2009.
© Oscar Nierstrasz ST — Smalltalk Basics 2.1 Change sets  Make sure your changes are logged to a new change set.
13. Summary, Trends, Research. © O. Nierstrasz PS — Summary, Trends, Research Summary, Trends, Research...  Summary: functional, logic and object-oriented.
5. Iterative Development. © O. Nierstrasz P2 — Iterative Development 5.2 Iterative Development Overview  Iterative development  Responsibility-Driven.
1 Chapter 4 Language Fundamentals. 2 Identifiers Program parts such as packages, classes, and class members have names, which are formally known as identifiers.
12. Common Errors, a few Puzzles. © O. Nierstrasz P2 — Common Errors, a few Puzzles 12.2 Common Errors, a few Puzzles Overview  Common errors … —Typical.
CP — Concurrent Programming 12. Petri Nets Prof. O. Nierstrasz Wintersemester 2005 / 2006.
Metamodeling Seminar X. CHAPTER Prof. O. Nierstrasz Spring Semester 2008.
© Oscar Nierstrasz ST — Smalltalk Basics 2.1 Change sets  Make sure your changes are logged to a new change set.
ESE Einführung in Software Engineering X. CHAPTER Prof. O. Nierstrasz Wintersemester 2005 / 2006.
N. XXX Prof. O. Nierstrasz Thanks to Jens Palsberg and Tony Hosking for their kind permission to reuse and adapt the CS132 and CS502 lecture notes.
12. Common Errors, a few Puzzles. © O. Nierstrasz P2 — Common Errors, a few Puzzles 12.2 Common Errors, a few Puzzles Sources  Cay Horstmann, Computing.
7. Liveness and Asynchrony Prof. O. Nierstrasz. Roadmap  Asynchronous invocations  Simple Relays —Direct invocations —Thread-based messages —Command-based.
12. Summary, Trends, Research. © O. Nierstrasz PS — Summary, Trends, Research Roadmap  Summary: —Trends in programming paradigms  Research:...
6. Inheritance and Refactoring. © O. Nierstrasz P2 — Inheritance and Refactoring 6.2 Inheritance and Refactoring Source  Wirfs-Brock & McKean, Object.
Chapter 10 Classes Continued
OORPT Object-Oriented Reengineering Patterns and Techniques X. CHAPTER Prof. O. Nierstrasz.
CP — Concurrent Programming X. CHAPTER Prof. O. Nierstrasz Wintersemester 2005 / 2006.
12. eToys. © O. Nierstrasz PS — eToys 12.2 Denotational Semantics Overview:  … References:  …
Ranga Rodrigo. Class is central to object oriented programming.
REFACTORING Lecture 4. Definition Refactoring is a process of changing the internal structure of the program, not affecting its external behavior and.
CISC6795: Spring Object-Oriented Programming: Polymorphism.
Writing Classes (Chapter 4)
© The McGraw-Hill Companies, 2006 Chapter 4 Implementing methods.
Programming in Java Unit 2. Class and variable declaration A class is best thought of as a template from which objects are created. You can create many.
Putting together a complete system Chapter 10. Overview  Design a modest but complete system  A collection of objects work together to solve a problem.
The Java Programming Language
Method Overriding Remember inheritance: when a child class inherits methods, variables, etc from a parent class. Example: public class Dictionary extends.
16-Oct-15 JSP Implicit Objects. 2 JSP Implicit Objects are the Java objects that the JSP Container makes available to developers in each page and developer.
Copyright © 2010 Certification Partners, LLC -- All Rights Reserved Perl Specialist.
Methods in Java. Program Modules in Java  Java programs are written by combining new methods and classes with predefined methods in the Java Application.
OOP in Java : © W. Milner 2005 : Slide 1 Java and OOP Part 2 – Classes and objects.
Topic 1 Object Oriented Programming. 1-2 Objectives To review the concepts and terminology of object-oriented programming To discuss some features of.
Programming in Java CSCI-2220 Object Oriented Programming.
Copyright © 2003 ProsoftTraining. All rights reserved. Perl Fundamentals.
M1G Introduction to Programming 2 5. Completing the program.
GoodOO Programming Practice in Java © Allan C. Milne v
 In the java programming language, a keyword is one of 50 reserved words which have a predefined meaning in the language; because of this,
Fall 2015CISC/CMPE320 - Prof. McLeod1 CISC/CMPE320 Today: –Review declaration, implementation, simple class structure. –Add an exception class and show.
CP — Concurrent Programming 6. Liveness and Guarded Methods Prof. O. Nierstrasz Wintersemester 2005 / 2006.
PROGRAMMING TESTING B MODULE 2: SOFTWARE SYSTEMS 22 NOVEMBER 2013.
Refactoring Agile Development Project. Lecture roadmap Refactoring Some issues to address when coding.
Terms and Rules II Professor Evan Korth New York University (All rights reserved)
© 2011 Pearson Education, publishing as Addison-Wesley Chapter 1: Computer Systems Presentation slides for Java Software Solutions for AP* Computer Science.
9.1 CLASS (STATIC) VARIABLES AND METHODS Defining classes is only one aspect of object-oriented programming. The real power of object-oriented programming.
Classes CS 162 (Summer 2009). Parts of a Class Instance Fields Methods.
Chapter 8 – Arrays and Array Lists
slides created by Ethan Apter
slides created by Ethan Apter
Fall 2018 CISC124 2/24/2019 CISC124 Quiz 1 marking is complete. Quiz average was about 40/60 or 67%. TAs are still grading assn 1. Assn 2 due this Friday,
Fundaments of Game Design
4. Iterative Development
CMPE212 – Reminders Assignment 2 due next Friday.
Presentation transcript:

5. Iterative Development

© O. Nierstrasz P2 — Iterative Development 4.2 Iterative Development Sources  Rebecca Wirfs-Brock, Alan McKean, Object Design — Roles, Responsibilities and Collaborations, Addison- Wesley,  Kent Beck, Extreme Programming Explained — Embrace Change, Addison-Wesley, 1999.

© O. Nierstrasz P2 — Iterative Development 4.3 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.4 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.5 The Classical Software Lifecycle The waterfall model is unrealistic for many reasons, especially:  requirements must be “frozen” too early in the life-cycle  requirements are validated too late The classical software lifecycle models the software development as a step-by-step “waterfall” between the various development phases. Maintenance Testing Implementation Design Requirements Collections Analysis

© O. Nierstrasz P2 — Iterative Development 4.6 Iterative Development In practice, development is always iterative, and all software phases progress in parallel.  If the waterfall model is pure fiction, why is it still the standard software process? TestingImplementation Design Requirements Collections Analysis Maintenance through iteration Testing based on requirementsValidation through prototyping Testing throughout implementation Design through refactoring

© O. Nierstrasz P2 — Iterative Development 4.7 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.8 What is Responsibility-Driven Design? Responsibility-Driven Design is  a method for deriving a software design in terms of collaborating objects  by asking what responsibilities must be fulfilled to meet the requirements,  and assigning them to the appropriate objects (i.e., that can carry them out).

© O. Nierstrasz P2 — Iterative Development 4.9 How to assign responsibility? Pelrine’s Laws:  “Don't do anything you can push off to someone else.”  “Don't let anyone else play with you.” RDD leads to fundamentally different designs than those obtained by functional decomposition or data-driven design. Class responsibilities tend to be more stable over time than functionality or representation.

© O. Nierstrasz P2 — Iterative Development 4.10 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.11 Example: Tic Tac Toe Requirements: “A simple game in which one player marks down only crosses and another only ciphers [zeroes], each alternating in filling in marks in any of the nine compartments of a figure formed by two vertical lines crossed by two horizontal lines, the winner being the first to fill in three of his marks in any row or diagonal.” — Random House Dictionary We should design a program that implements the rules of Tic Tac Toe.

© O. Nierstrasz P2 — Iterative Development 4.12 Setting Scope Questions:  Should we support other games?  Should there be a graphical UI?  Should games run on a network? Through a browser?  Can games be saved and restored? A monolithic paper design is bound to be wrong! An iterative development strategy:  limit initial scope to the minimal requirements that are interesting  grow the system by adding features and test cases  let the design emerge by refactoring roles and responsibilities  How much functionality should you deliver in the first version of a system?  Select the minimal requirements that provide value to the client.

© O. Nierstrasz P2 — Iterative Development 4.13 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.14 Tic Tac Toe Objects Some objects can be identified from the requirements: ObjectsResponsibilities Game Maintain game rules Player Make moves Mediate user interaction Compartment Record marks Figure (State) Maintain game state Entities with clear responsibilities are more likely to end up as objects in our design.

© O. Nierstrasz P2 — Iterative Development 4.15 Tic Tac Toe Objects... Others can be eliminated: Non-ObjectsJustification Crosses, ciphers Same as Marks Marks Value of Compartment Vertical lines Display of State Horizontal lines ditto Winner State of Player Row View of State Diagonal ditto  How can you tell when you have the “right” set of objects?  Each object has a clear and natural set of responsibilities.

© O. Nierstrasz P2 — Iterative Development 4.16 Missing Objects Now we check if there are unassigned responsibilities:  Who starts the Game?  Who is responsible for displaying the Game state?  How do Players know when the Game is over? Let us introduce a Driver that supervises the Game.  How can you tell if there are objects missing in your design?  When there are responsibilities left unassigned.

© O. Nierstrasz P2 — Iterative Development 4.17 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.18 Scenarios A scenario describes a typical sequence of interactions: Are there other equally valid scenarios for this problem?

© O. Nierstrasz P2 — Iterative Development 4.19 Version 0 — skeleton Our first version does very little!  How do you iteratively “grow” a program?  Always have a running version of your program. class GameDriver { static public void main(String args[]) { TicTacToe game = new TicTacToe(); do { System.out.print(game); } while(game.notOver()); } public class TicTacToe { public boolean notOver() { return false; } public String toString() { return("TicTacToe\n");} }

© O. Nierstrasz P2 — Iterative Development 4.20 SVN branches  Copy a SVN folder to assign a symbolic label to all files of a given revision. svn copy project/trunk project/tags/version0  Copy in SVN duplicates metadata only, not the actual files. The files are only duplicated upon first modification.

© O. Nierstrasz P2 — Iterative Development 4.21 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.22 Version 1 — game state  We will use chess notation to access the game state —Columns ‘a’ through ‘c’ —Rows ‘1’ through ‘3’  How do we decide on the right interface?  First write some tests!

© O. Nierstrasz P2 — Iterative Development 4.23 Test-first development public class TicTacToeTest { private TicTacToe public void setUp() { game = new TicTacToe(); public void testState() { assertTrue(game.get('a','1') == ' '); assertTrue(game.get('c','3') == ' '); game.set('c','3','X'); assertTrue(game.get('c','3') == 'X'); game.set('c','3',' '); assertTrue(game.get('c','3') == ' '); assertFalse(game.inRange('d','4')); }

© O. Nierstrasz P2 — Iterative Development 4.24 Generating methods Test-first programming can drive the development of the class interface …

© O. Nierstrasz P2 — Iterative Development 4.25 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.26 Representing game state public class TicTacToe { private char[][] gameState; public TicTacToe() { gameState = new char[3][3]; for (char col='a'; col <='c'; col++) for (char row='1'; row<='3'; row++) this.set(col,row,' '); }...

© O. Nierstrasz P2 — Iterative Development 4.27 Checking pre-conditions set() and get() translate from chess notation to array indices. public void set(char col, char row, char mark) { assert(inRange(col, row)); // NB: precondition gameState[col-'a'][row-'1'] = mark; } public char get(char col, char row) { assert(inRange(col, row)); return gameState[col-'a'][row-'1']; } public boolean inRange(char col, char row) { return (('a'<=col) && (col<='c') && ('1'<=row) && (row<='3')); }

© O. Nierstrasz P2 — Iterative Development 4.28 Printing the State By re-implementing TicTacToe.toString(), we can view the state of the game:  How do you make an object printable?  Override Object.toString() 3 | | | | | | a b c

© O. Nierstrasz P2 — Iterative Development 4.29 TicTacToe.toString() Use a StringBuilder (not a String) to build up the representation: public String toString() { StringBuffer rep = new StringBuilder(); for (char row='3'; row>='1'; row--) { rep.append(row); rep.append(" "); for (char col='a'; col <='c'; col++) {... }... } rep.append(" a b c\n"); return(rep.toString()); }

© O. Nierstrasz P2 — Iterative Development 4.30 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.31 Version 2 — adding game logic We will:  Add test scenarios  Add Player class  Add methods to make moves, test for winning

© O. Nierstrasz P2 — Iterative Development 4.32 Refining the interactions Updating the Game and printing it should be separate operations. The Game should ask the Player to make a move, and then the Player will attempt to do so. We will want both real and test Players, so the Driver should create them.

© O. Nierstrasz P2 — Iterative Development 4.33 Testing scenarios Our test scenarios will play and test scripted public void testXWinDiagonal() { checkGame("a1\nb2\nc3\n", "b1\nc1\n", "X", 4); } // more tests … public void checkGame(String Xmoves, String Omoves, String winner, int squaresLeft) { Player X = new Player('X', Xmoves);// a scripted player Player O = new Player('O', Omoves); TicTacToe game = new TicTacToe(X, O); GameDriver.playGame(game); assertTrue(game.winner().name().equals(winner)); assertTrue(game.squaresLeft() == squaresLeft); }

© O. Nierstrasz P2 — Iterative Development 4.34 Running the test cases Player O moves: O at c1 3 | | | X | X | O | O a b c Player X moves: X at c3 3 | | X | X | X | O | O a b c game over! 3 | | | | | | a b c Player X moves: X at a1 3 | | | | X | | a b c...

© O. Nierstrasz P2 — Iterative Development 4.35 The Player We use different constructors to make real or test Players: A real player reads from the standard input stream: This constructor just calls another one public class Player { private final char mark; private final BufferedReader in; public Player(char mark) { this(mark, new BufferedReader( new InputStreamReader(System.in) )); }

© O. Nierstrasz P2 — Iterative Development 4.36 Player constructors... But a Player can be constructed that reads its moves from any input buffer: This constructor is not intended to be called directly.... protected Player(char initMark, BufferedReader initIn) { mark = initMark; in = initIn; }

© O. Nierstrasz P2 — Iterative Development 4.37 Player constructors... A test Player gets its input from a String buffer: The default constructor returns a dummy Player representing “nobody” public Player(char mark, String moves) { this(mark, new BufferedReader( new StringReader(moves) )); } public Player() { this(' '); }

© O. Nierstrasz P2 — Iterative Development 4.38 Roadmap  The iterative software lifecycle  Responsibility-driven design  TicTacToe example —Identifying objects —Scenarios —Test-first development —Printing object state —Testing scenarios —Representing responsibilities as contracts

© O. Nierstrasz P2 — Iterative Development 4.39 Tic Tac Toe Contracts Explicit invariants:  turn (current player) is either X or O  X and O swap turns (turn never equals previous turn)  game state is 3  3 array marked X, O or blank  winner is X or O iff winner has three in a row Implicit invariants:  initially winner is nobody; initially it is the turn of X  game is over when all squares are occupied, or there is a winner  a player cannot mark a square that is already marked Contracts:  the current player may make a move, if the invariants are respected

© O. Nierstrasz P2 — Iterative Development 4.40 Encoding the contract We must introduce state variables to implement the contracts public class TicTacToe { static final int X = 0;// constants static final int O = 1; private char[][] gameState; private Player winner = new Player();// = nobody private Player[] player; private int turn = X;// initial turn private int squaresLeft = 9;...

© O. Nierstrasz P2 — Iterative Development 4.41 Supporting test Players The Game no longer instantiates the Players, but accepts them as constructor arguments: public TicTacToe(Player playerX, Player playerO) { //... player = new Player[2]; player[X] = playerX; player[O] = playerO; }

© O. Nierstrasz P2 — Iterative Development 4.42 Invariants These conditions may seem obvious, which is exactly why they should be checked... Assertions and tests often tell us what methods should be implemented, and whether they should be public or private. private boolean invariant() { return (turn == X || turn == O) && ( this.notOver() || this.winner() == player[X] || this.winner() == player[O] || this.winner().isNobody()) && (squaresLeft < 9// else, initially: || turn == X && this.winner().isNobody()); }

© O. Nierstrasz P2 — Iterative Development 4.43 Delegating Responsibilities When Driver updates the Game, the Game just asks the Player to make a move: Note that the Driver may not do this directly!... public void update() throws IOException { player[turn].move(this); }

© O. Nierstrasz P2 — Iterative Development 4.44 Delegating Responsibilities... The Player, in turn, calls the Game’s move() method: public void move(char col, char row, char mark) { assert(notOver()); assert(inRange(col, row)); assert(get(col, row) == ' '); System.out.println(mark + " at " + col + row); this.set(col, row, mark); this.squaresLeft--; this.swapTurn(); this.checkWinner(); assert(invariant()); }

© O. Nierstrasz P2 — Iterative Development 4.45 Small Methods Introduce methods that make the intent of your code clear. Well-named variables and methods typically eliminate the need for explanatory comments! public boolean notOver() { return this.winner().isNobody() && this.squaresLeft() > 0; } private void swapTurn() { turn = (turn == X) ? O : X; }

© O. Nierstrasz P2 — Iterative Development 4.46 Accessor Methods Accessor methods protect clients from changes in implementation:  When should instance variables be public?  Almost never! Declare public accessor methods instead. public Player winner() { return winner; } public int squaresLeft() { return this.squaresLeft; }

© O. Nierstrasz P2 — Iterative Development 4.47 getters and setters in Java Accessors in Java are known as “getters” and “setters”. —Accessors for a variable x should normally be called getx() and setx() Frameworks such as EJB depend on this convention!

© O. Nierstrasz P2 — Iterative Development 4.48 Code Smells — TicTacToe.checkWinner()  Duplicated code stinks! How can we clean it up? for (char col='a'; col <='c'; col++) { player = this.get(col,'1'); if (player == this.get(col,'2') && player == this.get(col,'3')) { this.setWinner(player); return; } player = this.get('b','2'); if (player == this.get('a','1') && player == this.get('c','3')) { this.setWinner(player); return; } if (player == this.get('a','3') && player == this.get('c','1')) { this.setWinner(player); return; } private void checkWinner() { char player; for (char row='3'; row>='1'; row--) { player = this.get('a',row); if (player == this.get('b',row) && player == this.get('c',row)) { this.setWinner(player); return; }

© O. Nierstrasz P2 — Iterative Development 4.49 GameDriver In order to run test games, we separated Player instantiation from Game playing:  How can we make test scenarios play silently? public class GameDriver { public static void main(String args[]) { try { Player X = new Player('X'); Player O = new Player('O'); TicTacToe game = new TicTacToe(X, O); playGame(game); } catch (AssertionException err) {... }

© O. Nierstrasz P2 — Iterative Development 4.50 What you should know!  What is Iterative Development, and how does it differ from the Waterfall model?  How can identifying responsibilities help you to design objects?  Where did the Driver come from, if it wasn’t in our requirements?  Why is Winner not a likely class in our TicTacToe design?  Why should we evaluate assertions if they are all supposed to be true anyway?  What is the point of having methods that are only one or two lines long?

© O. Nierstrasz P2 — Iterative Development 4.51 Can you answer these questions?  Why should you expect requirements to change?  In our design, why is it the Game and not the Driver that prompts a Player to move?  When and where should we evaluate the TicTacToe invariant?  What other tests should we put in our TestDriver?  How does the Java compiler know which version of an overloaded method or constructor should be called?

License © Oscar Nierstrasz 52 Attribution-ShareAlike 2.5 You are free: to copy, distribute, display, and perform the work to make derivative works to make commercial use of the work Under the following conditions: Attribution. You must attribute the work in the manner specified by the author or licensor. Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one. For any reuse or distribution, you must make clear to others the license terms of this work. Any of these conditions can be waived if you get permission from the copyright holder. Your fair use and other rights are in no way affected by the above. Safety Patterns