Transcript Slides

Lecture 5:
Implementing
Data Abstractions
CS201J: Engineering Software
University of Virginia
Computer Science
David Evans
http://www.cs.virginia.edu/evans
Menu
• Data Abstraction
• Specifying Abstract Data Types
• Implementing Abstract Data Types
11 September 2003
CS 201J Fall 2003
2
Abstract Data Types
• Separate what you can do with data from
how it is represented
• Client interacts with data through provided
operations according to their specifications
• Implementation chooses how to represent
data and implement its operations
11 September 2003
CS 201J Fall 2003
3
Data Abstraction in Java
• A class defines a new data type
• Use private instance variables to hide the
choice of representation
– private declarations are only visible inside the
class
11 September 2003
CS 201J Fall 2003
4
Up and Down
Clients manipulate an abstract data type by calling
its operations (methods and constructors)
clients
Abstract Type
Concrete Representation
class implementation
The representation of an abstract data type is
visible only in the class implementation.
11 September 2003
CS 201J Fall 2003
5
StringSet
clients
{ “test”, “okay” }
s.isIn ()
Abstract Type
Concrete Representation
private Vector res;
class implementation
public boolean isIn () { … }
11 September 2003
CS 201J Fall 2003
6
Advantages/Disadvantages
- More code to write and maintain
- Run-time overhead (time to call method)
+ Client doesn’t need to know about
representation
+ Localize impact of changes
11 September 2003
CS 201J Fall 2003
7
StringSet Example
• StringSet abstract data type: represent a
set of strings
• Support mathematical set operations:
insert, isIn, size
• Create an empty set
11 September 2003
CS 201J Fall 2003
8
Specifying Abstract Data Types
• Overview: what does the type represent
– Mutability/Immutability
A StringSet is a mutable set of Strings.
– Abstract Notation
A typical StringSet is { x1, …, xn }.
• Operations: specifications for constructors
and methods clients use
– Describe in terms of abstract notation
introduced in overview.
11 September 2003
CS 201J Fall 2003
9
StringSet Specification
public class StringSet
// OVERVIEW: StringSets are unbounded, mutable sets of
//
Strings. A typical StringSet is { x1, ..., xn }
public StringSet ()
// EFFECTS: Initializes this to be empty: { }
public void insert (String s)
// MODIFIES: this
// EFFECTS: Adds x to the elements of this:
//
this_post = this_pre U { s }
public boolean isIn (String s) {
// EFFECTS: Returns true iff s is an element of this.
public int size ()
// EFFECTS: Returns the number of elements in this.
11 September 2003
CS 201J Fall 2003
10
Components of Data Abstractions
• Ways to create objects of the data type
– Creators: create new objects of the ADT from
parameters of other types
– Producers: create new objects of the ADT
from parameters of the ADT type (and other
types)
• Ways to observe properties: observers
• Ways to change properties: mutators
11 September 2003
CS 201J Fall 2003
11
StringSet Operations
public class StringSet
// OVERVIEW: StringSets are unbounded, mutable sets of
//
Strings. A typical StringSet is { x1, ..., xn }
public StringSet ()
// EFFECTS: Initializes this to be empty: { }
public void insert (String s)
// MODIFIES: this
// EFFECTS: Adds x to the elements of this:
//
this_post = this_pre U { s }
public boolean isIn (String s) {
// EFFECTS: Returns true iff s is an element of this.
public int size ()
// EFFECTS: Returns the number of elements in this.
• Creators
StringSet ()
• Producers
none
• Observers
isIn, size
• Mutators
insert
11 September 2003
CS 201J Fall 2003
12
Using Abstract Data Types
• PS1, PS2
• Client interacts with data type using the
methods as described in the specification
• Client does not know the concrete
representation
11 September 2003
CS 201J Fall 2003
13
Implementing Abstract Data Types
11 September 2003
CS 201J Fall 2003
14
Choosing a Representation
• Need a concrete data representation to
store the state
• Think about how methods will be
implemented
– A good representation choice should:
• Enable easy implementations of all methods
• Allow performance-critical methods to be
implemented efficiently
11 September 2003
CS 201J Fall 2003
15
StringSet Representation
• Option 1: private String [] rep;
– Recall Java arrays are bounded
– Easy to implement most methods, hard to
implement insert
• Option 2: private Vector rep;
– Easy to implement all methods
– Performance may be worse than for array
11 September 2003
CS 201J Fall 2003
16
Implementing StringSet
public class StringSet {
// OVERVIEW: StringSets are unbounded, mutable sets of Strings.
// A typical StringSet is {x1, ..., xn}
// Representation:
private Vector rep;
public StringSet () {
// EFFECTS: Initializes this to be empty: { }
rep = new Vector ();
Could this implementation
}
of insert be correct?
public void insert (String s) {
// MODIFIES: this
// EFFECTS: Adds s to the elements of this:
//
this_post = this_pre U { s }
rep.add (s);
}
11 September 2003
CS 201J Fall 2003
17
It depends…
public int size () {
// EFFECTS: Returns the number of elements in this.
StringSet uniqueels = new StringSet ();
for (int i = 0; i < rep.size (); i++) {
String current = (String) rep.elementAt (i);
if (uniqueels.isIn (current)) {
;
} else {
uniqueels.insert (current);
}
}
return uniqueels.rep.size ();
}
11 September 2003
CS 201J Fall 2003
18
Is it correct?
public int size () {
// EFFECTS: Returns the number of
//
elements in this.
return rep.size ();
}
public void insert (String s) {
if (!isIn (s)) rep.add (s);
}
11 September 2003
CS 201J Fall 2003
19
Reasoning About Data Abstractions
• How can we possibly implement data
abstractions correctly if correctness of one
method depends on how other methods
are implemented?
• How can we possibly test a data
abstraction implementation if there are
complex interdependencies between
methods?
11 September 2003
CS 201J Fall 2003
20
What must we know to know size is
correct?
public int size () {
// EFFECTS: Returns the number of
//
elements in this.
return rep.size ();
}
• This implementation is correct only if we
know the rep does not contain duplicates
11 September 2003
CS 201J Fall 2003
21
Rep Invariant
• The Representation Invariant expresses
properties all legitimate objects of the ADT
must satisfy
I: C → boolean
Function from concrete representation
to boolean.
• Helps us reason about correctness of
methods independently
11 September 2003
CS 201J Fall 2003
22
Reasoning with Rep Invariants
• Prove all objects satisfy the invariant
before leaving the implementation code
• Assume all objects passed in satisfy the
invariant
REQUIRES: Rep Invariant is true for this (and any
other reachable ADT objects)
EFFECTS: Rep Invariant is true for all new and
modified ADT object on exit.
11 September 2003
CS 201J Fall 2003
23
Rep Invariant for StringSet
public class StringSet {
// OVERVIEW: StringSets are unbounded,
// mutable sets of Strings.
// A typical StringSet is {x1, ..., xn}
// Representation:
private Vector rep;
// RepInvariant (c) =
//
c contains no duplicates
//
&& c != null
11 September 2003
CS 201J Fall 2003
24
Implementing Insert?
public void insert (String s) {
// MODIFIES: this
// EFFECTS: Adds s to the elements of this:
//
this_post = this_pre U { s }
rep.add (s);
}
Not a correct implementation: after it
returns this might not satisfy the rep
invariant!
11 September 2003
CS 201J Fall 2003
25
Implementing Insert
public void insert (String s) {
// MODIFIES: this
// EFFECTS: Adds s to the elements of this:
//
this_post = this_pre U { s }
if (!isIn (s)) { rep.add (s); }
}
Possibly correct implementation: we
need to know how to map rep to
abstraction notation to know if
this_post = this_pre U { s }
11 September 2003
CS 201J Fall 2003
26
Tomorrow in Section
• Return PS2
• Consider how to implement the Graph
datatype specified in your notes
• Think about possible representations
before tomorrow’s class
11 September 2003
CS 201J Fall 2003
27