Slides by Alex Mariakakis Section 5: Midterm Review.

Slides:



Advertisements
Similar presentations
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Advertisements

Identity and Equality Based on material by Michael Ernst, University of Washington.
Composition CMSC 202. Code Reuse Effective software development relies on reusing existing code. Code reuse must be more than just copying code and changing.
Annoucements  Next labs 9 and 10 are paired for everyone. So don’t miss the lab.  There is a review session for the quiz on Monday, November 4, at 8:00.
Data Abstraction II SWE 619 Software Construction Last Modified, Spring 2009 Paul Ammann.
Chapter 1. The Phases of Software Development. Data Structure 2 Chapter outline  Objectives  Use Javadoc to write a method’s complete specification.
Programming with Alice Computing Institute for K-12 Teachers Summer 2011 Workshop.
1 Design by Contract Building Reliable Software. 2 Software Correctness Correctness is a relative notion  A program is correct with respect to its specification.
CSE 331 Software Design & Implementation Dan Grossman Winter 2014 Lecture 2 – Reasoning About Code With Logic 1CSE 331 Winter 2014.
© Janice Regan, CMPT 102, Sept CMPT 102 Introduction to Scientific Computer Programming The software development method algorithms.
Searching. 2 Searching an array of integers If an array is not sorted, there is no better algorithm than linear search for finding an element in it static.
Analysis of Algorithms. Time and space To analyze an algorithm means: –developing a formula for predicting how fast an algorithm is, based on the size.
16-Jun-15 Exceptions. Errors and Exceptions An error is a bug in your program dividing by zero going outside the bounds of an array trying to use a null.
Exceptions. Errors and Exceptions An error is a bug in your program –dividing by zero –going outside the bounds of an array –trying to use a null reference.
1 Java Object Model Part 2: the Object class. 2 Object class Superclass for all Java classes Any class without explicit extends clause is a direct subclass.
Arrays. A problem with simple variables One variable holds one value –The value may change over time, but at any given time, a variable holds a single.
29-Jun-15 Recursion. 2 Definitions I A recursive definition is a definition in which the thing being defined occurs as part of its own definition Example:
Exceptions. Many problems in code are handled when the code is compiled, but not all Some are impossible to catch before the program is run  Must run.
CSE 331 Software Design & Implementation Dan Grossman Fall 2014 Data Abstraction: Abstract Data Types (ADTs) (Based on slides by Mike Ernst, David Notkin,
Slides by Vinod Rathnam with material from Alex Mariakakis Kellen Donohue, David Mailhot, and Hal Perkins Midterm Review.
Inheritance One of the biggest advantages of object-oriented design is that of inheritance. A class may be derived from another class, the base class.
(c) University of Washingtonhashing-1 CSC 143 Java Hashing Set Implementation via Hashing.
Introduction Ellen Walker CPSC 201 Data Structures Hiram College.
Programming with Alice Computing Institute for K-12 Teachers Summer 2011 Workshop.
Searching Also: Logarithms. 2 Searching an array of integers If an array is not sorted, there is no better algorithm than linear search for finding an.
1 Abstraction  Identify important aspects and ignore the details  Permeates software development programming languages are abstractions built on hardware.
Testing Michael Ernst CSE 140 University of Washington.
Testing CSE 140 University of Washington 1. Testing Programming to analyze data is powerful It’s useless if the results are not correct Correctness is.
Stacks - 2 Nour El-Kadri ITI Implementing 2 stacks in one array and we don’t mean two stacks growing in the same direction: but two stacks growing.
CSE 331 SOFTWARE DESIGN & IMPLEMENTATION MIDTERM REVIEW Autumn 2011.
Analysis of Algorithms These slides are a modified version of the slides used by Prof. Eltabakh in his offering of CS2223 in D term 2013.
SWE 619 © Paul Ammann Procedural Abstraction and Design by Contract Paul Ammann Information & Software Engineering SWE 619 Software Construction cs.gmu.edu/~pammann/
Chapter 25 Formal Methods Formal methods Specify program using math Develop program using math Prove program matches specification using.
Copyright © 2002, Systems and Computer Engineering, Carleton University a-JavaReview.ppt * Object-Oriented Software Development Unit.
Low-Level Detailed Design SAD (Soft Arch Design) Mid-level Detailed Design Low-Level Detailed Design Design Finalization Design Document.
Control Structures II Repetition (Loops). Why Is Repetition Needed? How can you solve the following problem: What is the sum of all the numbers from 1.
Making Decisions (True or False) Relational Operators >greater than =greater than or equal to
Review – Final Test Chapters 8,10,11. Locate error in following statement try i = Integer.pareseInt(str); catch(NumberFormatException e) System.out.println(“Input.
Introduction to Java Java Translation Program Structure
Reasoning about programs March CSE 403, Winter 2011, Brun.
(c) University of Washington15-1 CSC 143 Java List Implementation via Arrays Reading: 13.
CSE 331 Software Design & Implementation Hal Perkins Autumn 2012 Abstract Data Types – Examples / Summary (Based on slides by Mike Ernst and David Notkin)
Type Abstraction SWE Spring October 05Kaushik, Ammann Substitution Principle “In any client code, if supertype object is substituted.
Fall 2002CS 150: Intro. to Computing1 Streams and File I/O (That is, Input/Output) OR How you read data from files and write data to files.
90-723: Data Structures and Algorithms for Information Processing Copyright © 1999, Carnegie Mellon. All Rights Reserved. 1 Lecture 1: Introduction Data.
Introduction to Loops Iteration Repetition Counting Loops Also known as.
School of Computer Science & Information Technology G6DICP - Lecture 4 Variables, data types & decision making.
CS305j Introduction to Computing Classes II 1 Topic 24 Classes Part II "Object-oriented programming as it emerged in Simula 67 allows software structure.
Data Abstraction SWE 619 Software Construction Last Modified, Spring 2009 Paul Ammann.
CMSC 202 Java Classes and Object 2nd Lecture. Aug 6, Stack and Heap When your program is running, some memory is used to store local variables.
(c) , University of Washington18a-1 CSC 143 Java Searching and Recursion N&H Chapters 13, 17.
Representation invariants and abstraction functions CSE 331 UW CSE.
27-Jan-16 Analysis of Algorithms. 2 Time and space To analyze an algorithm means: developing a formula for predicting how fast an algorithm is, based.
Chapter 11: Advanced Inheritance Concepts. Objectives Create and use abstract classes Use dynamic method binding Create arrays of subclass objects Use.
CSE 331 Software Design & Implementation Dan Grossman Fall 2014 Abstraction Functions (Based on slides by Mike Ernst, David Notkin, Hal Perkins)
(c) University of Washington06-1 CSC 143 Java Inheritance Tidbits.
Section 6: Interfaces, Midterm Slides by Vinod Rathnam and Geoffrey Liu (with material from Alex Mariakakis, Kellen Donohue, David Mailhot, and Hal Perkins)
1 Introduction 1. Why Data Structures? 2. What AreData Structure? 3. Phases of Software Development 4. Precondition and Postcondition 5. Examples.
Chapter 1 The Phases of Software Development. Software Development Phases ● Specification of the task ● Design of a solution ● Implementation of solution.
CS/ENGRD 2110 FALL 2013 Lecture 3: Fields, getters and setters, constructors, testing 1.
Winter 2006CISC121 - Prof. McLeod1 Stuff We had better discuss a midterm date… –27 Feb. to 3 March or –6 to 10 March.
CSE 1020:Using Objects Mark Shtern 1-1. Summary Read API Method binding and overloading Development process Input validation Assert 1-2.
CPSC 252 ADTs and C++ Classes Page 1 Abstract data types (ADTs) An abstract data type is a user-defined data type that has: private data hidden inside.
Winter 2016CISC101 - Prof. McLeod1 CISC101 Reminders Quiz 3 next week. See next slide. Both versions of assignment 3 are posted. Due today.
Reasoning and Design (and Assertions). How to Design Your Code The hard way: Just start coding. When something doesn’t work, code some more! The easier.
CSE 374 Programming Concepts & Tools
Section 6: Midterm Review
IMPORTANT NOTE Some parts of these section slides deal with null ints. This was a mistake, as primitives cannot be null. These issues have been corrected.
Assertions References: internet notes; Bertrand Meyer, Object-Oriented Software Construction; 4/25/2019.
CSE 332: Concurrency and Locks
Presentation transcript:

Slides by Alex Mariakakis Section 5: Midterm Review

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {_______________} z = x + y; {_______________} y = z – 3; {x > y}

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {_______________} z = x + y; {x > z - 3} y = z – 3; {x > y}

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {x > x + y – 3 => y < 3} z = x + y; {x > z - 3} y = z – 3; {x > y}

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {_______________} p = a + b; {_______________} q = a - b; {p + q = 42}

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {_______________} p = a + b; {p + a – b = 42} q = a - b; {p + q = 42}

Winter 2013 Q1 Using backwards reasoning, find the weakest precondition for each sequence of statements and postcondition below. Insert appropriate assertions in each blank line. You should simplify your answers if possible. {a + b + a – b = 42 => a = 21} p = a + b; {p + a – b = 42} q = a - b; {p + q = 42}

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? I.void withdraw(int amount) { balance -= amount; } ABC

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? I.void withdraw(int amount) { balance -= amount; } ABC Another way to ask the question: If the client does not know the implementation, will the method do what he/she expects it to do based on the specification?

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? I.void withdraw(int amount) { balance -= amount; } ABC O a.The method does exactly what the spec says

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? I.void withdraw(int amount) { balance -= amount; } ABC OO a.The method does exactly what the spec says b.If the client follows precondition, the code will execute as expected

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? I.void withdraw(int amount) { balance -= amount; } ABC OOX a.The method does exactly what the spec says b.If the client follows precondition, the code will execute as expected c.The method does not throw an exception

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? II.void withdraw(int amount) { if (balance >= amount) balance -= amount; } ABC

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? II.void withdraw(int amount) { if (balance >= amount) balance -= amount; } a.The balance will not always decrease ABC X

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? II.void withdraw(int amount) { if (balance >= amount) balance -= amount; } a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected ABC XO

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? II.void withdraw(int amount) { if (balance >= amount) balance -= amount; } a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected c.The method does not throw an exception ABC XOX

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? III.void withdraw(int amount) { if (amount < 0) throw new IllegalArgumentException(); balance -= amount; } ABC

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? III.void withdraw(int amount) { if (amount < 0) throw new IllegalArgumentException(); balance -= amount; } ABC X a.The balance will not always decrease

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? III.void withdraw(int amount) { if (amount < 0) throw new IllegalArgumentException(); balance -= amount; } ABC XO a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? III.void withdraw(int amount) { if (amount < 0) throw new IllegalArgumentException(); balance -= amount; } ABC XOX a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected c.The method throws the wrong kind of exception and for the wrong reason

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? IV.void withdraw(int amount) throws InsufficientFundsException { if (balance < amount) throw new InsufficientFundsException(); balance -= amount; } ABC

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? IV.void withdraw(int amount) throws InsufficientFundsException{ if (balance < amount) throw new InsufficientFundsException(); balance -= amount; } ABC X a.The balance will not always decrease

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? IV.void withdraw(int amount) throws InsufficientFundsException{ if (balance < amount) throw new InsufficientFundsException(); balance -= amount; } ABC XO a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected

Winter 2013 Q2 Suppose we have a BankAccount class with instance variable balance. Consider the following specifications: decreases balance by amount amount >= 0 and amount <= decreases balance by amount InsufficientFundsException if balance < decreases balance by amount Which specifications does this implementation meet? IV.void withdraw(int amount) throws InsufficientFundsException{ if (balance < amount) throw new InsufficientFundsException(); balance -= amount; } ABC XOO a.The balance will not always decrease b.If the client follows precondition, the code will execute as expected c.The method does exactly what the spec says

Winter 2013 Q3 /** * An IntPoly is an immutable, integer-valued polynomial * with integer coefficients. A typical IntPoly value * is a_0 + a_1*x + a_2*x^ a_n*x_n. An IntPoly * with degree n has coefficent a_n != 0, except that the * zero polynomial is represented as a polynomial of * degree 0 and a_0 = 0 in that case. */ public class IntPoly { int a[]; // AF(this) = a has n+1 entries, and for each entry, // a[i] = coefficient a_i of the polynomial. }

Winter 2013 Q3 public class IntPoly { /** * Return a new IntPoly that is the sum of this and other */ public IntPoly add(IntPoly other); }

Winter 2013 Q3 public class IntPoly { /** * Return a new IntPoly that is the sum of this and other other != null none none a new IntPoly that is the sum of this and the other none */ public IntPoly add(IntPoly other); }

Winter 2013 Q3 public class IntPoly { /** * Return a new IntPoly that is the sum of this and other other != null none none a new IntPoly that is the sum of this and the other none */ public IntPoly add(IntPoly other); } Note: if you have an instance variable it usually appears as well

Winter 2013 Q3 public class IntPoly { /** * Return a new IntPoly that is the sum of this and other other != null none none a new IntPoly that is the sum of this and the other none */ public IntPoly add(IntPoly other); } Note: this is not the only answer, you could specify an exception or specify the output

Winter 2013 Q4 public class IntPoly { int a[]; // AF(this) = a has n+1 entries, and for each entry, // a[i] = coefficient a_i of the polynomial. // Return the coefficients of this IntPoly public int[] getCoeffs() { return a; } One of your colleagues is worried that this creates a potential representation exposure problem. Another colleague says there’s no problem since an IntPoly is immutable. Is there a problem? Give a brief justification for your answer.

Winter 2013 Q4 public class IntPoly { int a[]; // AF(this) = a has n+1 entries, and for each entry, // a[i] = coefficient a_i of the polynomial. // Return the coefficients of this IntPoly public int[] getCoeffs() { return a; } One of your colleagues is worried that this creates a potential representation exposure problem. Another colleague says there’s no problem since an IntPoly is immutable. Is there a problem? Give a brief justification for your answer. Yes, there is a problem. IntPoly seems immutable because there are no setters, but the return value is a reference to the same coefficient array stored in the IntPoly and the client code could alter those coefficients.

Winter 2013 Q4 public class IntPoly { int a[]; // AF(this) = a has n+1 entries, and for each entry, // a[i] = coefficient a_i of the polynomial. // Return the coefficients of this IntPoly public int[] getCoeffs() { return a; } If there is a representation exposure problem, give a new or repaired implementation of getCoeffs() that fixes the problem but still returns the coefficients of the IntPoly to the client. If it saves time you can give a precise description of the changes needed instead of writing the detailed Java code.

Winter 2013 Q4 public class IntPoly { int a[]; // AF(this) = a has n+1 entries, and for each entry, // a[i] = coefficient a_i of the polynomial. // Return the coefficients of this IntPoly public int[] getCoeffs() { return a; } If there is a representation exposure problem, give a new or repaired implementation of getCoeffs() that fixes the problem but still returns the coefficients of the IntPoly to the client. If it saves time you can give a precise description of the changes needed instead of writing the detailed Java code. Create a new array the same length as a, copy the contents of a to it, and return the new array.

Winter 2013 Q5 We would like to add a method to this class that evaluates the IntPoly at a particular value x. In other words, given a value x, the method valueAt(x) should return a 0 + a 1 x + a 2 x a n x n, where a 0 through an are the coefficients of this IntPoly. For this problem, develop an implementation of this method and prove that your implementation is correct.

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {_____} while (k != n) { {_____} xk = xk * x; {_____} val = val + a[k+1]*xk; {_____} k = k +1; {_____} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {_____} xk = xk * x; {_____} val = val + a[k+1]*xk; {_____} k = k +1; {_____} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {inv && k != n} xk = xk * x; {_____} val = val + a[k+1]*xk; {_____} k = k +1; {_____} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {inv && k != n} xk = xk * x; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k]*x^k} val = val + a[k+1]*xk; {_____} k = k +1; {_____} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {inv && k != n} xk = xk * x; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k]*x^k} val = val + a[k+1]*xk; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k+1]*x^(k+1)} k = k +1; {_____} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {inv && k != n} xk = xk * x; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k]*x^k} val = val + a[k+1]*xk; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k+1]*x^(k+1)} k = k +1; {inv} } {_____} return val; }

Winter 2013 Q5 /** Return the value of this IntPoly at point x */ public int valueAt(int x) { int val = a[0]; int xk = 1; int k = 0; int n = a.length-1; // degree of this, n >=0 {inv: xk = x^k && val = a[0] + a[1]*x + … + a[k]*x^k} while (k != n) { {inv && k != n} xk = xk * x; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k]*x^k} val = val + a[k+1]*xk; {xk = x^(k+1) && val = a[0] + a[1]*x + … + a[k+1]*x^(k+1)} k = k +1; {inv} } {inv && k = n => val = a[0] + a[1]*x + … + a[n]*x^n} return val; }

Winter 2013 Q6 Suppose we are defining a class to represent items stocked by an online grocery store. Here is the start of the class definition, including the class name and instance variables: public class StockItem { String name; String size; String description; int quantity; /* Construct a new StockItem */ public StockItem(…); }

Winter 2013 Q6 A summer intern was asked to implement an equals function for this class that treats two StockItem objects as equal if their name and size fields match. Here’s the result: /** return true if the name and size fields match */ public boolean equals(StockItem other) { return name.equals(other.name) && size.equals(other.size); } This equals method seems to work sometimes but not always. Give an example showing a situation when it fails.

Winter 2013 Q6 A summer intern was asked to implement an equals function for this class that treats two StockItem objects as equal if their name and size fields match. Here’s the result: /** return true if the name and size fields match */ public boolean equals(StockItem other) { return name.equals(other.name) && size.equals(other.size); } This equals method seems to work sometimes but not always. Give an example showing a situation when it fails. Object s1 = new StockItem("thing", 1, "stuff", 1); Object s2 = new StockItem("thing", 1, "stuff", 1); System.out.println(s1.equals(s2));

Winter 2013 Q6 A summer intern was asked to implement an equals function for this class that treats two StockItem objects as equal if their name and size fields match. Here’s the result: /** return true if the name and size fields match */ public boolean equals(StockItem other) { return name.equals(other.name) && size.equals(other.size); } This equals method seems to work sometimes but not always. Give an example showing a situation when it fails. Object s1 = new StockItem("thing", 1, "stuff", 1); Object s2 = new StockItem("thing", 1, "stuff", 1); System.out.println(s1.equals(s2)); The equals method was overloaded, rather than overwritten

Winter 2013 Q6 Show how you would fix the equals method so it works properly ( StockItems are equal if their names and sizes are equal) /** return true if the name and size fields match */

Winter 2013 Q6 Show how you would fix the equals method so it works properly ( StockItems are equal if their names and sizes are equal) /** return true if the name and size fields match Override public boolean equals(Object o) { if (!(o instanceof StockItem)) return false; StockItem other = (StockItem) o; return name.equals(other.name) && size.equals(other.size); }

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal O

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal O O

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal O O O

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal O O O O

Winter 2013 Q6 Which of the following implementations of hashCode() are legal: public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } public int hashCode() { return name.hashCode()*17 + quantity; } public int hashCode() { return quantity; } legalillegal O O O O The equals method does not care about quantity

Winter 2013 Q6 Which implementation do you prefer? public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); }

Winter 2013 Q6 Which implementation do you prefer? public int hashCode() { return name.hashCode(); } public int hashCode() { return name.hashCode()*17 + size.hashCode(); } (ii) will likely do the best job since it takes into account both the size and name fields. (i) is also legal but it gives the same hashCode for StockItems that have different sizes as long as they have the same name, so it doesn’t differentiate between different StockItems as well as (ii).

Winter 2013 Q7 (not on your midterm) Suppose we are specifying a method and we have a choice between either requiring a precondition n > 0 ) or specifying that the method throws an exception under some circumstances IllegalArgumentException if n <= 0 ). Assuming that neither version will be significantly more expensive to implement than the other and that we do not expect the precondition to be violated or the exception to be thrown in normal use, is there any reason to prefer one of these to the other, and, if so, which one?

Winter 2013 Q7 (not on your midterm) Suppose we are specifying a method and we have a choice between either requiring a precondition n > 0 ) or specifying that the method throws an exception under some circumstances IllegalArgumentException if n <= 0 ). Assuming that neither version will be significantly more expensive to implement than the other and that we do not expect the precondition to be violated or the exception to be thrown in normal use, is there any reason to prefer one of these to the other, and, if so, which one? It would be better to specify the exception. That reduces the domain of inputs for which the behavior of the method is unspecified. It also will cause the method to fail fast for incorrect input, which should make the software more robust – or at least less likely to continue execution with erroneous data. Note: You could just as easily argue the other way. It may be better to specify the precondition because once the exception is in the specification, it has to stay there because the client may expect it.

Winter 2013 Q8 Suppose we are trying to choose between two possible specifications for a method. One of the specifications S is stronger than the other specification W, but both include the behavior needed by clients. In practice, should we always pick the stronger specification S, always pick the weaker one W, or is it possible that either one might be the suitable choice? Give a brief justification of your answer, including a brief list of the main criteria to be used in making the decision.

Winter 2013 Q8 Suppose we are trying to choose between two possible specifications for a method. One of the specifications S is stronger than the other specification W, but both include the behavior needed by clients. In practice, should we always pick the stronger specification S, always pick the weaker one W, or is it possible that either one might be the suitable choice? Give a brief justification of your answer, including a brief list of the main criteria to be used in making the decision. Neither is necessarily better. What is important is picking a specification that is simple, promotes modularity and reuse, and can be implemented efficiently. (Many answers focused narrowly on which would be easier to implement. While that is important – we don’t want a specification that is impossible to build – it isn’t the main thing that determines whether a system design is good or bad.)

Midterm Topics Reasoning about Code Specification vs. Implementation Abstract Data Types Abstract Functions Representation Invariants Testing Identity & Equality