220 likes | 233 Views
Object-Oriented Design. Object : An encapulation of data with the methods that operate on that data. Compare: function-oriented vs object-oriented . get-name(student-number) student.getName(). Budd’s Example: Ordering Flowers.
E N D
Object-Oriented Design Object: An encapulation of data with the methods that operate on that data. Compare: function-oriented vs object-oriented. get-name(student-number) student.getName() CSE 341 -- S. Tanimoto Java Objects
Budd’s Example: Ordering Flowers Budd orders flowers for Sally by sending a message to Flora. Budd and Flora are members of a community of agents. Sally Budd Gardener Flower arranger Flora Delivery person Grower Wholesaler Sally’s florist CSE 341 -- S. Tanimoto Java Objects
Characteristics of an Object Encapulates data and methods. Acts like an agent. Has “responsibility” delegated to it by the designer Is an instance of a class. Its public members (data and/or methods) are accessible outside of its class. Its private members are accessible only within methods of its class, permitting information hiding) Goes into action when “sent” a “message” (i.e., when one of its member functions is called or “invoked”). CSE 341 -- S. Tanimoto Java Objects
Designing a System Identify the component parts of the system Associate data and functionality with each part Identify the communication links among the components CSE 341 -- S. Tanimoto Java Objects
Designing an Object Identify its responsibility. (“What” not “how”) Identify the data it needs. Separate out those services it needs and can delegate to other objects. CSE 341 -- S. Tanimoto Java Objects
Implementing an Object Name its class. Create prototypes for its public methods (to be compatible with the calls from other objects). Design the internal data structures and create private variables for them. Implement the public and any private methods making calls to other objects as needed. CSE 341 -- S. Tanimoto Java Objects
Example: A Program for Displaying Random Line Segments and Their Intersections Specs: 1. The program should randomly create a set of 10 line segments. 2. The segments should be displayed on a canvas. 3. Each intersection should be shown with a bold dot. CSE 341 -- S. Tanimoto Java Objects
Sample Desired Result CSE 341 -- S. Tanimoto Java Objects
Our Key Objects: Line Segments Responsibilities: 1. Display themselves. 2. Find their intersections with others. 3. Create themselves. Delegated services: 1. Create random point 2. Get a list of all the other line segments CSE 341 -- S. Tanimoto Java Objects
Other Objects Points: 1. Create point, create random point. Set of line segments: 1. Create 10 line segments 2. Make a list of all the line segments other than a given one. 3. Display the set. CSE 341 -- S. Tanimoto Java Objects
Data Needed by LineSegment Pointsp1, p2 (endpoints of the segment) Integer id We declare that it is the responsibility of the higher-numbered line segment to determine any intersection between it and another segment. Vector intersections This is a list of intersections for which it is responsible. CSE 341 -- S. Tanimoto Java Objects
LineSegment.java import java.awt.*; import java.util.*; public class LineSegment { LSPoint p1, p2; int id; LineSegmentCollection collection; Vector intersections; public LSPoint getP1() { return p1; } public LSPoint getP2() { return p2; } public LineSegment(int anID, LineSegmentCollection theCollection){...} public void paint(Graphics g) {...} private void computeIntersections() {...} private LSPoint segIntersection(LineSegmentls){...} private void plotIntersections(Graphics g) {...} } CSE 341 -- S. Tanimoto Java Objects
In LineSegment.java -- Constructor public LineSegment(int anID, LineSegmentCollection theCollection){ id = anID; collection = theCollection; p1 = new LSPoint(); p2 = new LSPoint(); computeIntersections(); } CSE 341 -- S. Tanimoto Java Objects
In LineSegment.java -- paint public void paint(Graphics g) { g.drawLine(p1.getX(), p1.getY(), p2.getX(), p2.getY()); plotIntersections(g); } CSE 341 -- S. Tanimoto Java Objects
LineSegment: computeIntersections private void computeIntersections() { intersections = new Vector(); for (Enumeration segments = (collection.otherSegments(this)).elements(); segments.hasMoreElements();) { LineSegment aLineSeg = (LineSegment) segments.nextElement(); LSPoint p = segIntersection(aLineSeg); if (p != null) intersections.addElement(p); } } CSE 341 -- S. Tanimoto Java Objects
LineSegment: segIntersection private LSPoint segIntersection(LineSegment ls) { LSPoint p3 = ls.getP1(); LSPoint p4 = ls.getP2(); int x1 = p1.getX(); int y1 = p1.getY(); int x2 = p2.getX(); int y2 = p2.getY(); int x3 = p3.getX(); int y3 = p3.getY(); int x4 = p4.getX(); int y4 = p4.getY(); double d1 = (x1 * y2) - (x2 * y1); double d2 = (x3 * y4) - (x4 * y3); double d3 = ((x1 - x2) * (y3 - y4)) - ((x3 - x4) * (y1 - y2)); int x = (int) (((d1 * (x3 - x4)) - (d2 * (x1 - x2))) / d3); int y = (int) (((d1 * (y3 - y4)) - (d2 * (y1 - y2))) / d3); CSE 341 -- S. Tanimoto Java Objects
LineSegment: segIntersection (cont) int minx1 = Math.min(x1, x2); if (x < minx1) return null; int maxx1 = Math.max(x1, x2); if (x > maxx1) return null; int miny1 = Math.min(y1, y2); if (y < miny1) return null; int maxy1 = Math.max(y1, y2); if (y > maxy1) return null; int minx2 = Math.min(x3, x4); if (x < minx2) return null; int maxx2 = Math.max(x3, x4); if (x > maxx2) return null; int miny2 = Math.min(y3, y4); if (y < miny2) return null; int maxy2 = Math.max(y3, y4); if (y > maxy2) return null; return new LSPoint(x, y); } CSE 341 -- S. Tanimoto Java Objects
LineSegment: plotIntersections private void plotIntersections(Graphics g) { for (Enumeration intPoints = intersections.elements(); intPoints.hasMoreElements();) { LSPoint p = (LSPoint) intPoints.nextElement(); int x = p.getX(); int y = p.getY(); int radius = 5; g.fillOval(x-radius, y-radius, 2*radius, 2*radius); } } CSE 341 -- S. Tanimoto Java Objects
The Class LSPoint import java.util.Random; public class LSPoint { int x, y; static Random rg = new Random(); public LSPoint() { x = Math.abs(rg.nextInt()) % 200; y = Math.abs(rg.nextInt()) % 200; } public LSPoint(int xVal, int yVal) { x = xVal; y = yVal; } public int getX() { return x; } public int getY() { return y; } } CSE 341 -- S. Tanimoto Java Objects
The Class LineSegmentCollection import java.applet.*; import java.awt.*; import java.util.*; public class LineSegmentCollection extends Applet { Vector theSegments; public void init() { theSegments = new Vector(); for (int i = 0; i < 10; i++) { theSegments.addElement(new LineSegment(i, this)); } } CSE 341 -- S. Tanimoto Java Objects
LineSegmentCollection (cont) public void paint(Graphics g) { setBackground(Color.red); g.setColor(Color.black); for (Enumeration theEnum = theSegments.elements(); theEnum.hasMoreElements();) { ((LineSegment)theEnum.nextElement()).paint(g); } } public Vector otherSegments(LineSegment oneSegment) { Vector copyOfList = (Vector)(theSegments.clone()); copyOfList.removeElement((Object)oneSegment); return copyOfList; } } CSE 341 -- S. Tanimoto Java Objects
Summary of Object-Oriented Design Express the system as a collection of interacting agents (“objects”) Identify data and functionality for each kind of object Identify communication links among types of objects Specify the interfaces for each type of object Implement object behavior in classes and methods CSE 341 -- S. Tanimoto Java Objects