section3 containment and methods

99
Class References, Object Containment and Methods 1

Upload: duong-tung

Post on 16-Apr-2017

164 views

Category:

Education


2 download

TRANSCRIPT

Class References, Object

Containment and Methods

1

Runner's training log

• Sometimes information not only consist of several pieces of information, but one of its constituents consists of several pieces, too.

• Take a look at this problem:– Develop a program that manages a runner's training log.

Every day the runner enters one entry concerning the day's run. Each entry includes the day's date, the distanceof the day's run, the duration of the run, and a commentdescribing the runner's post-run feeling.

2

Log Entry examples

• A log entry consists of four pieces of information: a date, a distance, a duration, and a comment. – To represent the last three, we can use primitive types;

double (in miles), int (in minutes), and String– Representation for dates consists of three pieces: day,

month, year

• Examples: – on June 5, 2003: 5.3 miles in 27 minutes, feeling good; – on June 6, 2003: 2.8 miles in 24 minutes, feeling tired – on June 23, 2003: 26.2 miles in 150 minutes, feeling

exhausted;

3

Class Diagram

4

Entry- Date date- double distance- int duration- String comment

Date- int day- int month- int year

Define class and constructor

5

public class Entry {private Date date;private double distance;private int duration;private String comment;public Entry(Date date, double distance, int duration,

String comment) {this.date = date;this.distance = distance;this.duration = duration;this.comment = comment;

}}

public class Date {private int day;private int month;private int year;public Date(int day, int month,

int year) {this.day = day;this.month = month;this.year = year;

}}

contain

Test constructor

6

import junit.framework.*;public class EntryTest extends TestCase {

public void testDateContructor() {new Date(5, 6, 2004);Date date1 = new Date(6, 6, 2004);Date date2 = new Date(23, 6, 2004);

}

public void testEntryContructor() {new Entry(new Date(5, 6, 2004), 5.3, 27, "good");

Date date1 = new Date(6, 6, 2004);new Entry(date1, 2.8, 24, "tired");

Date date2 = new Date(23, 6, 2004);new Entry(date2, 26.2, 159, "exhausted");

}}

Methods for containment

7

Add methods to the Entry

8

??? nnn(???)

Entry- Date date- double distance- int duration- String comment

Date- int day- int month- int year

??? kkk(???)

Java template for Entry

9

public class Entry {private Date date;private double distance;private int duration;private String comment;public Entry(Date date, double distance, int duration,

String comment) {this.date = date;this.distance = distance;this.duration = duration;this.comment = comment;

}

public ??? nnn(???) {...this.date.kkk(???)...

...this.distance...this.duration...this.comment...

}}

Java template for Entry

10

public class Date {private int day;private int month;private int year;public Date(int day, int month,

int year) {this.day = day;this.month = month;this.year = year;

}

public ??? kkk(???) {...this.day...this.month...this.year...

}}

Computes the pace for a daily entry

• For each entry, the program should compute how fast the runner ran in minutes per mile. ... Develop a method that computes the pace for a daily entry.

??? pace(???)

Entry- Date date- double distance- int duration- String comment

Date- int day- int month- int year

11

Design pace() method

• Purpose and contract (method signature)// computes the pace for a daily entrypublic double pace() {

}

• Examples– new Entry(new Date(5, 6, 2004), 5.3, 27, "good").pace() should produce 5.094

– new Entry(new Date(6, 6, 2004), 2.8, 24, "tired").pace() should produce 8.571

– new Entry(new Date(23, 6, 2004), 26.2, 159, "exhausted").pace() should produce 6.069

12

Design pace() method (con't)

13

public double pace() {return this.duration / this.distance;

}

// computes the pace for a daily entrypublic double pace() {

...this.date...

...this.duration...

...this.distance...

...this.comment...}

Template

Implement

Design pace() method (con't)

• Unit testing

14

public void testPace() {Entry entry1 = new Entry(new Date(5, 6, 2004), 5.3, 27, "good");assertEquals(entry1.pace(), 5.094, 0.001);

Entry entry2 = new Entry(new Date(6, 6, 2004), 2.8, 24, "tired");assertEquals(entry2.pace(), 8.571, 0.001);

Entry entry3 = new Entry(new Date(23, 6, 2004), 26.2, 159, "exhausted");assertEquals(entry3.pace(), 6.069, 0.001);

}

Compare Date: early than

• A runner's log refers to Dates and a natural question concerning comparing dates is when one occurs earlier than another one. Develop a method that determines whether one date occurs earlier than another date.

• Hint: – The first possibility is that the first date is in the year preceding

the other.– Next, if the years are the same, the month in the first date is

before the month in the second date.– Finally, if both the year and the month values are the same, the

date in the first date is before the day in the second date.

15

Delegation

• Q: Which class (Entry or Date) should we put ealierThan() method in ?

• A: The ealierThan() method deals with properties of the Date so that we delegate this computational task to the corresponding methods in Date class

16

??? ealierThan(???)

Entry

- Date date- double distance- int duration- String comment

Date

- int day- int month- int year

Design earlierThan() method

• Purpose and contract (method signature)// is this date early than the other datepublic boolean earlierThan(Date that)

• Examples– new Date(30, 6, 2003).earlierThan(new Date(1, 1, 2004)) should produce true

– new Date(1, 1, 2004).earlierThan(new Date(1, 12, 2003)) should produce false

– new Date(15, 12, 2004).earlierThan(new Date(31, 12, 2004)) should produce true

17

Design earlyThan() method (con't)

18

public boolean earlierThan(Date that) {if (this.year < that.year) return true;if (this.year > that.year) return false;if (this.month < that.month) return true;if (this.month > that.month) return false;if (this.day < that.day) return true;return false;

}

// is this date early than the other date public double earlyThan(Date that) {

...this.day...this.month...this.year...

...that.day...that.month...that.year...}

Template

Implement

Unit Testing

19

pubblic class EntryTest extends TestCase {...public void testEarlierThan() {

Date date1 = new Date(30, 6, 2003);Date date2 = new Date(1, 1, 2004);Date date3 = new Date(1, 12, 2004);Date date4 = new Date(15, 12, 2004);Date date5 = new Date(31, 12, 2004);

assertTrue(date1.earlierThan(date2));assertTrue(date2.earlierThan(date3));assertTrue(date3.earlierThan(date4));assertTrue(date4.earlierThan(date5));

assertFalse(date1.earlierThan(date1));assertFalse(date5.earlierThan(date4));assertFalse(date4.earlierThan(date3));assertFalse(date3.earlierThan(date2));assertFalse(date2.earlierThan(date1));

}}

Restaurant example

• Develop a program that helps a visitor navigate Manhattan's restaurant scene. The program must be able to provide four pieces of information for each restaurant: its name, the kind of food it serves, its price range, and the closest intersection(street and avenue).

• Examples: – La Crepe, a French restaurant, on 7th Ave and 65th Street,

moderate; – Bremen Haus, a German restaurant on 2nd Ave and 86th Street,

moderate; – Moon Palace, a Chinese restaurant on 10th Ave and 113th Street,

inexpensive;

20

avenue

Class Diagram

21

Restaurant- String name- String food- String priceRange- Intersection intersection

Intersection- int avenue- int street

Problem Statement

• Develop a method to help visitors to find out whether two restaurants are close to each other

• Two restaurants are "close'' to each other if they are at most one avenue and at most one street away from each other

• Notice: This is an interesting example!

• Q: Add this method to the class diagram

22

23

B(2, 2)

C(3, 2)

D(4, 2)

F(2, 3)

G(3, 3)

H(4, 3)

Avenue 2 3 4

Street

4

3

2

X(Street, Avenue)

The considered Intersection

G “closes” B, C, D, F, H, L, M, N

L(2, 4)

M(3, 4)

(2, 5)

P(3, 5)

(2, 1)

A(3, 1)

4, 1)

1 5

(5, 2) K(5, 3)5 (5, 1)

(1, 2) E(1, 3)1 (1, 4) (1, 5)(1, 1)

N(4, 4)

Intersections “close” to the considered

Intersection

Intersections not “close” to the considered

Intersection

K(5, 4) K(5, 5)

Delegation

Q: Which class (Restaurant or Intersection) should we put closeTo() method in ? A: Put closeTo() in both classes.

– The closeTo() method deals with properties of the Intersection so that we delegate this computational task to the corresponding methods in Intersection class

24

Restaurant- String name- String food- String priceRange- Intersection intersection

+ boolean closeTo(Restaurant that)

Intersection- int avenue- int street

+ boolean closeTo(Intersection that)

Q: Create examples for the method closeTo() in the Intersection class

Examples

25

Intersection i1 = new Intersection(3, 3);

Intersection i2 = new Intersection(3, 2);

i1.closeTo(i2); // should produce true

i1.closeTo(new Intersection(3, 5)); // should produce false

i2.closeTo(new Intersection(3, 5)); // should produce false

Restaurant r1 = new Restaurant("La Crepe", "French",

"moderate", new Intersection(3, 3));

Restaurant r2 = new Restaurant("Das Bier", "German",

"cheap", new Intersection(3, 2));

Restaurant r3 = new Restaurant("Sun", "Chinese",

"cheap", new Intersection(3, 5));

r1.closeTo(r2); // should produce true

r1.closeTo(r3); // should produce false

r2.closeTo(r3); // should produce false

closeTo template in Intersection class

26

public class Intersection {private int avenue;private int street;public Intersection(int avenue, int street) {

this.avenue = avenue;this.street = street;

}

// is this intersection close to anotherpublic boolean closeTo(Intersection that) {

...this.avenue...

...this.street...

...that.avenue...

...that.street...}

}

closeTo template in Restaurant class

27

public class Restaurant {private String name;private String food;private String priceRange;private Intersection intersection;...

// is this restaurant close to anotherpublic boolean closeTo(Restaurant that) {

...this.name...

...this.food...

...this.priceRange...

...this.intersection.closeTo(...)...

...that.name...

...that.food...

...that.priceRange...

...that.intersection.closeTo(...)...}

}

Method Implementation

28

public class Intersection {...

public boolean closeTo(Intersection that) {return ((Math.abs(this.avenue - that.avenue) <=1) &&

(Math.abs(this.street - that.street) <= 1));}

}

public class Restaurant {...public boolean closeTo (Restaurant that) {

return this.intersection.closeTo(that.intersection);}

}

Unit Testing

29

public void testCloseTo() {

Restaurant r1 = new Restaurant("La Crepe", "French", "moderate",

new Intersection(3, 3));

Restaurant r2 = new Restaurant("Das Bier", "German", "cheap",

new Intersection(3, 2));

Restaurant r3 = new Restaurant("Sun", "Chinese", "cheap",

new Intersection(3, 5));

assertTrue(r1.closeTo(r2));

assertFalse(r1.closeTo(r3));

assertFalse(r2.closeTo(r3));

}

Relax &

…Do Exercises …

30

Rectangle example

• The rectangles have width, height and are located on the Cartesian plane of a computer canvas, which has its origin in the northwest corner.

31

Rectangle- CartPt nwCorner- int width- int height

CartPt- int x- int y

Problem Statement

...Design a method that computes the distance of a Rectangle to the origin of the canvas.• Considering that a Rectangle has many points, the

meaning of this problem is clearly to determine the shortest distance of the Rectangle to the origin.

• This, in turn, means computing the distance between its northwest corner and the origin

32

X

y

Y

O

Rectangle

x

northwest corner

Problem Analysis

We need two methods:

1. Measuring the distance of a Rectangle to the origin

2. Measuring the distance of a CartPt to the origin

Q: Add these two methods to the class diagram

33

Delegation

• Q: Which class (Rectangle or CartPt) should we put distanceToO() method in ?

• A: Put distanceToO() in both classes.– The distanceToO() method deals with properties of the CartPt so that we delegate this computational task to the corresponding methods in CartPt class

34

CartPt- int x- int y

+ double distanceToO()

Rectangle- CartPt nwCorner- int width- int height

+ double distanceToO()

distanceToO – Examples

35

CartPt p = new CartPt(3, 4);CartPt q = new CartPt(5, 12);

Rectangle r = new Rectangle(p, 5, 17);Rectangle s = new Rectangle(q, 10, 10);

p.distanceToO() // should produce 5q.distanceToO() // should produce 13r.distanceToO() // should produce 5s.distanceToO() // should produce 13

distanceToO – Purpose and signature

36

public class Rectangle { private CartPt nwCorner; private int width; private int height; public Rectangle(CartPt nwCorner,

int width, int height) { ... }

// to compute the distance of this Rectangle to the origin public double distanceToO() { ... }

}

public class CartPt {private int x;private int y;public CartPt(int x, int y) { ... }

// to compute the distance of this point to the originpublic double distanceToO() { ... }

}

distanceToO – Template

37

public class CartPt {...

// to compute the distance of this point to the originpublic double distanceToO() {

...this.x...

...this.y...}

}

public class Rectangle {...

// to compute the distance of this Rectangle to the originpublic double distanceToO() {

...this.nwCorner.distanceToO()...

...this.width...

...this.height...}

}

distanceToO Method Implementation

38

public class CartPt {private int x;private int y;

public CartPt(int x, int y) {this.x = x;this.y = y;

}

// to compute the distance of this CartPt to the originpublic double distanceToO() {

return Math.sqrt(this.x * this.x + this.y * this.y);}

}

Tips: Math.sqrt is the name of the method that computes the square root of its argument as a double.

distanceToO Method Implementation

39

public class Rectangle {

private CartPt nwCorner;

private int width;

private int height;

public Rectangle(CartPt nwCorner,

int width, int height) {

this.nwCorner = nwCorner;

this.width = width;

this.height = height;

}

// to compute the distance of this Rectangle to the origin

public double distanceToO() {

return this.nwCorner.distanceToO();

}

}

distanceToO – Unit Testing

40

public void testDistanceToO() {

CartPt p = new CartPt(3, 4);

Rectangle r = new Rectangle(p, 5, 17);

assertEquals(r.distanceToO(), 5, 0.001);

p = new CartPt(5, 12);

r = new Rectangle(p, 10, 10);

assertEquals(r.distanceToO(), 13, 0.001);

}

Problem Extension Statement

• Compute the distance between the rectangle’s center and the origin

41

y

X

Y

0

x

center of retangle

width

height

Solution 1

42

public class Rectangle {

private CartPt nwCorner;

private int width;

private int height;

public Rectangle(CartPt nwCorner, int width, int height) {

this.nwCorner = nwCorner;

this.width = width;

this.height = height;

}

public double distanceToO() {

return this.nwCorner.distanceToO();

}

public double distanceFromCenterToO() {

int a = this.nwCorner.getX() + this.width/2;

int b = this.nwCorner.getY() + this.height/2;

return Math.sqrt(a*a + b*b);

}

}

Q: Is it right?A: right, but the delegation is not applied.

public class CartPt {private int x;private int y;public CartPt(int x, int y) {

this.x = x;this.y = y;

}

public double distanceToO() {return Math.sqrt(this.x * this.x + this.y * this.y);

}

public int getX() {return this.x;

}

public int getY() {return this.y;

}}

Solution 1 (cont)

43

getter

Solution 2

44

public class Rectangle {private CartPt nwCorner;private int width;private int height;...public double distanceToO() {

return this.nwCorner.distanceToO();}

public double distanceFromCenterToO() {return this.center().distanceToO();

}

private CartPt center() {int a = this.nwCorner.getX() + this.width / 2;int b = this.nwCorner.getY() + this.height / 2;return new CartPt(a, b);

}}

Q: How to find the value of the center?

Class diagram

45

Rectangle

- CatesianPoint northWestConner- int height- int width

+ double distanceToO()+ double distanceFromCenterToO()+ CartPt center()

CartPt- int x- int y

+ double distanceToO()+ int getX()+ int getY()

Circle example

• The circle are located on the Cartesian plane of a computer canvas, which has its center and radius.

• Compute the distance form circle to the origin

• Computing the perimeter of a circle

• Computing the area of a circle.

• Computes the area of a ring, that is, this disk with a hole in the center

46

Distance form circle to the origin

47

y

X

Y

0

x

center of circle

Circle- CartPt center- int radius

+ double distanceToO()

CartPt- int x- int y

+ double distanceToO()+ int getX()+ int getY()

distanceToO template

48

public class Circle {private CartPt center;private int radius;

public Circle(CartPt center, int radius) {this.center = center;this.radius = radius;

}

public double area() {return Math.PI*this.radius*this.radius;

}

// to compute the distance of this Circle to the originpublic doublle distanceToO() {

...this.center.distanceToO()...this.center.getX()...

...this.center.getY()...

...this.radius...}

distanceToO body

49

public class Circle {private CartPt center;private int radius;

public Circle(CartPt center, int radius) {this.center = center;this.radius = radius;

}

// to compute the distance of this Circle to the originpublic double distanceToO() {

return this.center.distanceToO();}

}

distanceToO test

50

public void testDistanceTo0() {

Circle c1 = new Circle(new CartPt(3, 4), 5);

Circle c2 = new Circle(new CartPt(5, 12), 10);

Circle c3 = new Circle(new CartPt(6, 8), 20);

assertEquals(c1.distanceToO(), 5.0, 0.001);

assertEquals(c2.distanceToO(), 13.0, 0.001);

assertEquals(c3.distanceToO(), 10.0, 0.001);

}

perimeter template

51

public class Circle {private CartPt center;private int radius;

public Circle(CartPt center, int radius) {this.center = center;this.radius = radius;

}

// Compute the perimeter of the circlepublic double perimeter () {

...this.distanceToO()...

...this.center.distanceToO()

...this.center.getX()...this.center.getY()...

...this.radius...}

}

perimeter body

52

public class Circle {

private CartPt center;

private int radius;

public Circle(CartPt center, int radius) {

this.center = center;

this.radius = radius;

}

//Compute the perimeter of the circle

public double perimeter() {

return 2* Math.PI * this.radius;

}

}

perimeter Test

53

public void testPerimeter() {

Circle c1 = new Circle(new CartPt(3, 4), 5);

Circle c2 = new Circle(new CartPt(5, 12), 10);

Circle c3 = new Circle(new CartPt(6, 8), 20);

assertEquals(c1.perimeter(), 31.42, 0.001);

assertEquals(c2.perimeter(), 62.83, 0.001);

assertEquals(c3.perimeter(), 125.66, 0.001);

}

area template

54

public class Circle {private CartPt center;private int radius;

public Circle(CartPt center, int radius) {this.center = center;this.radius = radius;

}...

//Compute the area of the circlepublic double area () {

...this.distanceToO()...

...this.perimeter()...

...this.center.distanceToO()...this.center.getX()...

...this.center.getY()...

...this.radius...}

}

area body

55

public class Circle {

private CartPt center;

private int radius;

public Circle(CartPt center, int radius) {

this.center = center;

this.radius = radius;

}

//Compute the perimeter of the circle

public double area() {

return Math.PI * this.radius * this.radius;

}

}

area Test

56

public void testArea() {

Circle c1 = new Circle(new CartPt(3, 4), 5);

Circle c2 = new Circle(new CartPt(5, 12), 10);

Circle c3 = new Circle(new CartPt(6, 8), 20);

assertEquals(c1.area(), 78.54, 0.001);

assertEquals(c2.area(), 314.16, 0.001);

assertEquals(c3.area(), 1256.64, 0.001);

}

Area of ring

57

X

y

Y

0

x

Area of ring

area template

58

public class Circle {private CartPt center;private int radius;public Circle(CartPt center, int radius) {

this.center = center;this.radius = radius;

}// Compute the area of the circle

public double area() {

return Math.PI * this.radius * this.radius;

}

// Compute the area of the ringpublic double area(Circle that) {

...this.center...this.radius...

...this.distanceToO()...this.perimeter()...this.area()...

...that.center...that.radius...

...that.distanceToO()...that.perimeter()...that.area()...}

}

area body

59

public class Circle {

private CartPt center;

private int radius;

public Circle(CartPt center, int radius) {

this.center = center;

this.radius = radius;

}

// Compute the area of the circle

public double area() {

return Math.PI * this.radius * this.radius;

}

// Compute the area of the ring

public double area(Circle that) {

return Math.abs(this.area() - that.area());

}

}

area Test

60

public void testArea() {

Circle c1 = new Circle(new CartPt(3, 4), 5);

Circle c2 = new Circle(new CartPt(5, 12), 10);

Circle c3 = new Circle(new CartPt(6, 8), 20);

assertEquals(c1.area(), 78.54, 0.01);

assertEquals(c2.area(), 314.16, 0.01);

assertEquals(c3.area(), 1256.64, 0.01);

assertEquals(c2.area(c1), 235.62, 0.01);

assertEquals(c3.area(c1), 1178.1, 0.01);

assertEquals(c3.area(c2), 942.48, 0.01);

}

Overloading method

• Q: what happen with the same name area() and area(Circle) method?

• A:– Method area() and area(Cirlce ) in class Cirlce have

the same name but different parameter is called overloading.

– When we invoke overloading methods, the method with appropriate argument will do

61

Class diagram

62

1

Circle- CartPt center- int radius

+ double distanceToO()+ double perimeter()+ double area()+ double area(Circle that)

CartPt- int x- int y

+ double distanceToO()+ int getX()+ int getY()

Cylinder example

• The information of the cylinder includes base disk and its height. Compute the volume of the cylinder

• Compute the surface area of the cylinder

63

Cylinder- Circle baseDisk- int height

+ double volume()+ double surface()

Circle- CartPt center- int radius

+ double distanceTo0()+ double perimeter()+ double area()+ double area(Circle that)

CartPt- int x- int y

+ double distanceTo0()+ int getX()+ int getY()

volume method template

64

public class Cylinder {private Circle baseDisk;private int height;

public Cylinder(Circle baseDisk, int height) {this.baseDisk = baseDisk;this.height = height;

}

// Compute the volume of the cylinderpublic double volume() {

...this.baseDisk.distanceToO()

...this.baseDisk.perimeter()...this.baseDisk.area()...

...this.height...}

}

volume method body

65

public class Cylinder {private Circle baseDisk;private int height;

public Cylinder(Circle baseDisk, int height) {this.baseDisk = baseDisk;this.height = height;

}

// Compute the volume of the cylinderpublic double volume() {

return this.baseDisk.area() * this.height;}

}

volume method test

66

public void testVolume(){Circle c1 = new Circle(new CartPt(3,4), 5);Circle c2 = new Circle(new CartPt(5,12), 10);Circle c3 = new Circle(new CartPt(6,8), 20);

Cylinder cy1 = new Cylinder(c1, 10);Cylinder cy2 = new Cylinder(c2, 30);Cylinder cy3 = new Cylinder(c3, 40);

assertEquals(cy1.volume(), 785.4, 0.001);assertEquals(cy2.volume(), 9424.77, 0.001);assertEquals(cy3.volume(), 50265.48, 0.001);

}

surface method template

67

public class Cylinder {private Circle baseDisk;private int height;public Cylinder(Circle baseDisk, int height) {

this.baseDisk = baseDisk;this.height = height;

}

// Compute the surface of the cylinderpublic double surface(){

...this.baseDisk.distanceToO()

...this.baseDisk.perimeter()...this.baseDisk.area()...

...this.height...}

}

surface method body

68

public class Cylinder {private Circle baseDisk;private int height;public Cylinder(Circle baseDisk, int height) {

this.baseDisk = baseDisk;this.height = height;

}

// Compute the volume of the cylinderpublic double volume() {

return this.baseDisk.area() * this.height;}

// Compute the surface of the cylinderpublic double surface() {

return this.baseDisk.perimeter() * this.height;}

}

surface method test

69

public void testSurface() {Circle c1 = new Circle(new CartPt(3, 4), 5);Circle c2 = new Circle(new CartPt(5, 12), 10);Circle c3 = new Circle(new CartPt(6, 8), 20);

Cylinder cy1 = new Cylinder(c1, 10);Cylinder cy2 = new Cylinder(c2, 30);Cylinder cy3 = new Cylinder(c3, 40);

assertEquals(cy1.surface(), 314.16, 0.001);assertEquals(cy2.surface(), 1884.95, 0.001);assertEquals(cy3.surface(), 5026.54, 0.01);

}

Class diagram

70

Cylinder- Circle baseDisk- int height

+ double volume()+ double surface()

Circle- CartPt center- int radius

+ double distanceTo0()+ double perimeter()+ double area()+ double area(Circle that)

CartPt- int x- int y

+ double distanceTo0()+ int getX()+ int getY()

Exercises

71

• Part III: Exercise 3.1.3 (HTDCH)

• Exercise 4.1.1 to 4.1.2 (HTDCH)

Exercise 3.1.3 (HTDCH)

Develop a "real estate assistant'' program. The "assistant'' helps the real estate agent locate houses of interest for clients. The information about a house includes its kind, the number of rooms, the asking price, and its address. An address consists of a house number, a street name, and a city.• Represent the following examples using your classes:

– Ranch, 7 rooms, $375,000, 23 Maple Street, Brookline– Colonial, 9 rooms, $450,000, 5 Joye Road, Newton– Cape, 6 rooms, $235,000, 83 Winslow Road, Waltham

• Develop the following methods for the class House: – hasMoreRooms, which determines whether one house has more

rooms than some other house;– inThisCity, which checks whether the advertised house is in

some given city (assume we give the method a city name);– sameCity, which determines whether one house is in the same city

as some other house.

72

Solution

• Ranch– A ranch is a large farm used for raising animals, especially

cattle, horses or sheep.

• Colonial– A colonial building or piece of furniture was built or made in

a style that was popular in American in the 17th and 18th

centuries.

• Cape– A cape is a large piece of land that sticks out into the sea

from the coast.

73

Back

Exercise 4.1.1

. . . Develop a program that assists bookstore employees. For each book, the program should track the book’s title, its price, its year of publication, and the author. A author has a name and birth year.• Develop the following methods for this class:

– currentBook that checks whether the book was published in 2004 or 2003;

– currentAuthor that determines whether a book was written by a current author (born after 1940);

– thisAuthor that determines whether a book was written by the specified author;

– sameAuthor that determines whether one book was written by the same author as some other book;

– sameGeneration that determines whether two books were written by two authors born less than 10 year apart.

74Solution

Exercise 4.1.2

• Exercise 3.1.2 provides the data definition for a weather recording program.

• Develop the following methods: – withinRange, which determines whether today's high and

low were within the normal range; – rainyDay, which determines whether the precipitation is

higher than some given value; – recordDay, which determines whether the temperature

broke either the high or the low record.

75

Solution

WeatherRecord

-Date d-TemperatureRange today-TemperatureRange normal-TemperatureRange record-double precipitation

Date

-int day-int month-int year

TemperatureRange

-int low-int high

Extended Exercises(Lab hours)

Develop a program that can railway travelers with the arrangement of train trips.• The available information about a specific train includes

its schedule, its route, and whether it is local.• The route information consists of the origin and the

destination station.• A schedule specifies the departure and the arrival

(clock) times when the train leaves and when it arrives. • ClockTime consists of the hour (of the day) and the

minutes (of the hour). • The customer want to know:

– Does his destination station match the destination of the train trip?

– What time does the train start ?– How long does the train trip take?

76

Relax &

…Do Exercises …

77

Solution 3.1.3

78

House

-String kind-int nRooms-Address address-int price

Address

-String houseNumber-String street-String city

Solution 3.1.3: House class

79

public class House {private String kind;private int nRooms;private Address address;private int price;

public House(String kind, int nRooms, Address address, int price) {

this.kind = kind;this.nRooms = nRooms;this.address = address;this.price = price;

}...

}

Solution 3.1.3: Address class

public class Address {private String houseNumber;private String street;private String city;

public Address(String houseNumber, String street, String city) {

this.houseNumber = houseNumber;this.street = street;this.city = city;

}...

}

80

hasMoreRooms() and Unit testing

• Method implementation

81

public boolean hasMoreRooms(House that) {return this.nRooms > that.nRooms;

}

public void testHasMoreRooms() {House house1 = new House("Ranch", 7,

new Address("23", "Mapple Street", "Brooklyn"), 375000);House house2 = new House("Colonial", 9,

new Address("5", "Jove Road", "Newton"), 450000);House house3 = new House("Cape", 6,

new Address("83", "Winslow Road", "Waltham"), 235000);assertFalse(house1.hasMoreRooms(house2));assertTrue(house2.hasMoreRooms(house3));

}

• Unit Test

inThisCity()

82

// class Addresspublic boolean inThisCity(String thatCity) {

return this.city.equals(thatCity);}

// class Housepublic boolean inThisCity(String city) {

return this.address.inThisCity(city);}

inThisCity() Unit testing

83

public void testThisCity() {House house1 = new House("Ranch", 7,

new Address("23", "Mapple Street", "Brooklyn"), 375000);House house2 = new House("Colonial", 9,

new Address("5", "Jove Road", "Newton"), 450000);House house3 = new House("Cape", 6,

new Address("83", "Winslow Road", "Waltham"), 235000);assertTrue(house1.inThisCity("Brooklyn"));assertFalse(house1.inThisCity("Newton"));

}

sameCity()

84

// class Housepublic boolean sameCity(House that) {

return this.address.sameCity(that.address);}

// class Addresspublic boolean sameCity(Address that) {

return this.city.equals(that.city);}

sameCity() Unit Test

85

public void testSameCity() {House house1 = new House("Ranch", 7,

new Address("23", "Mapple Street", "Brooklyn"), 375000);House house2 = new House("Colonial", 9,

new Address("5", "Jove Road", "Newton"), 450000);House house3 = new House("Cape", 6,

new Address("83", "Winslow Road", "Waltham"), 235000);assertTrue(house1.sameCity(house1));assertFalse(house1.sameCity(house2));

}

Solution 4.1.1

86

Book

-String title-double price-int publishYear-Author author

Author

-String name-int birthYear

currentBook()

• Method implementation

87

public boolean currentBook() {return (this.publishYear == 2004) ||

(this.publishYear == 2003);}

currentBook() Unit testing

88

public void testCurrentBook() {

Author felleisen =

new Author("Matthias Felleisen", 1960);

Book htdch = new Book(felleisen, "How to Design Class Hierarchies", 0.0, 2004);

assertTrue(htdch.currentBook());

Author friedman = new Author("Daniel P. Friedman", 1939);

Book aljafp = new Book(friedman,

"A Little Java, A Few Pattern", 25.9, 1998);

assertFalse(aljafp.currentBook());

}

currentAuthor()

• Method implementation

89

// in class Bookpublic boolean currentAuthor() {

return this.author.currentAuthor();}

// in class Authorpublic boolean currentAuthor() {

return this.birthYear >= 1940;}

currentAuthor() Unit testing

90

public void testCurrentAuthor() {Author felleisen = new Author("Matthias Felleisen", 1960);Book htdch = new Book(felleisen,

"How to Design Class Hierarchies", 0.0, 2004);assertTrue(htdch.currentAuthor());

Author friedman = new Author("Daniel P. Friedman", 1939);Book aljafp = new Book(friedman,

"A Little Java, A Few Pattern", 25.9, 1998);assertFalse(aljafp.currentAuthor());

}

thisAuthor()

• Method implementation

91

// in class Bookpublic boolean thisAuthor(Author that) {

return this.author.same(that);}

// in class Authorpublic boolean same(Author that) {

return (this.name.equals(that.name)) &&(this.birthYear == that.birthYear);

}

thisAuthor() Unit testing

92

public void testThisAuthor() {

Author felleisen = new Author("Matthias Felleisen", 1960);

Book htdch = new Book(felleisen,

"How to Design Class Hierarchies", 0.0, 2004);

assertTrue(htdch.thisAuthor(felleisen));

Author friedman = new Author("Daniel P. Friedman", 1939);

assertFalse(htdch.thisAuthor(friedman));

}

sameAuthor()

• Method implementation

93

// in class Bookpublic boolean sameAuthor(Book that) {

return this.author.same(that.author);}

sameAuthor()

• Unit testing

94

public void testSameAuthor() {Author felleisen = new Author("Matthias Felleisen", 1960);Book htdch = new Book(felleisen,

"How to Design Class Hierarchies", 0.0, 2004);Book htdp = new Book(felleisen,

"How to Design Programs", 0.0, 2002);assertTrue(htdch.sameAuthor(htdp));

Author friedman = new Author("Daniel P. Friedman", 1939);Book aljafp = new Book(friedman,

"A Little Java, A Few Pattern", 25.9, 1998);assertFalse(aljafp.sameAuthor(htdch));

}

sameGeneration()

• Method implementation

95

// in class Bookpublic boolean sameGeneration(Book that) {

return this.author.sameGeneration(that.author);}

// in class Authorpublic boolean sameGeneration(Author that) {

return Math.abs(this.birthYear - that.birthYear) <= 10;}

sameGeneration() Unit testing

96Back

public void testSameGeneration() {Author felleisen = new Author("Matthias Felleisen", 1960);Book htdch = new Book(felleisen,

"How to Design Class Hierarchies", 0.0, 2004);assertTrue(htdch.sameGeneration(htdp));

Author friedman = new Author("Daniel P. Friedman", 1939);Book aljafp = new Book(friedman,

"A Little Java, A Few Pattern", 25.9, 1998);assertFalse(aljafp.sameGeneration(htdch));

}

Solution 4.1.2

97

withinRange()

98Back

public class WeatherRecord {...public boolean withinRange() {

return this.today.within(this.normal);}

public boolean rainyDay(double thatPrecipitation) {return this.precipitation >= thatPrecipitation;

}

public boolean recordDay() {return !this.today.within(this.record);

}} public class TemperatureRange {

private double low;private double high;public boolean within(TemperatureRange that) {

return (this.low >= that.low) && (this.high <= that.high);

}}

Solution 4.1.3

99