Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 9 – Designing Classes Goals Learning to design classes Learning to design classes Preconditions and postconditions for methods Preconditions.

Similar presentations


Presentation on theme: "Chapter 9 – Designing Classes Goals Learning to design classes Learning to design classes Preconditions and postconditions for methods Preconditions."— Presentation transcript:

1

2 Chapter 9 – Designing Classes

3 Goals Learning to design classes Learning to design classes Preconditions and postconditions for methods Preconditions and postconditions for methods More details about static/class methods and fields More details about static/class methods and fields Creating packages Creating packages

4 Choosing Classes Division of labor: Division of labor: Methods = functions Methods = functions Classes/objects = entities Classes/objects = entities A class represents a single concept from the problem domain A class represents a single concept from the problem domain Name for a class should be a noun that describes a concept Name for a class should be a noun that describes a concept

5 Good Classes Concepts from mathematics: Concepts from mathematics: Point Rectangle Ellipse Path Concepts from real life Concepts from real life BankAccount CashRegister BusTaxi

6 Good Classes Actors (end in -er, -or) – objects that do some kind of work for you Actors (end in -er, -or) – objects that do some kind of work for you Scanner Random // better name: RandomNumberGenerator Utility classes – no objects, only static methods and constants Utility classes – no objects, only static methods and constantsMath Degenerate case of a class: only main() method Degenerate case of a class: only main() method

7 Bad Classes Don't turn actions into classes: Paycheck is better name than ComputePaycheck Don't turn actions into classes: Paycheck is better name than ComputePaycheck The name can tip you off when you are on wrong track The name can tip you off when you are on wrong track Representing a pay check is more useful than only designing a class that seems to compute a pay check Representing a pay check is more useful than only designing a class that seems to compute a pay check

8 OOP Class Diagram -private data +public data -private constructors +public constructors -private methods +public methods The name of the class appears at the top fields constructors and methods ClassName

9 Practice Question class Die  What are the operations needed to use the die?  What data are needed to represent the concept of a die?

10 class Die Die -sides:int -top:int +roll():void +getTop():int

11 Design Questions How might I design a soccer game? How might I design a soccer game?

12 Cohesion A class should represent a single concept A class should represent a single concept The public interface of a class is cohesive if all of its features are related to the concept that the class represents The public interface of a class is cohesive if all of its features are related to the concept that the class represents methods and public constants/variables should all relate to the central idea of the class methods and public constants/variables should all relate to the central idea of the class

13 Cohesion This class lacks cohesion: This class lacks cohesion: public class CashRegister{ public void enterPayment(int dollars, int quarters, int dimes, int nickels, int pennies)... public static final double NICKEL_VALUE = 0.05; public static final double DIME_VALUE = 0.1; public static final double QUARTER_VALUE = 0.25;... }

14 Cohesion What is the problem with this class? What is the problem with this class? More confusion More confusion Ties the role of a cash register to the value of the coins Ties the role of a cash register to the value of the coins What if we wanted to sell this cash register to other countries? What if we wanted to sell this cash register to other countries?

15 Solution CashRegister, as described above, involves two concepts: cash register and coin CashRegister, as described above, involves two concepts: cash register and coin Solution: Make two classes: Solution: Make two classes: public class Coin{ public Coin(double aValue, String aName){... } public double getValue(){... }... } public class CashRegister{ public void enterPayment(int coinCount, Coin coinType) {... }... }

16 Coupling A class depends on another if it uses objects of that class A class depends on another if it uses objects of that class CashRegister depends on Coin to determine the value of the payment CashRegister depends on Coin to determine the value of the payment Coin does not depend on CashRegister Coin does not depend on CashRegister High coupling = many class dependencies High coupling = many class dependencies

17 Coupling Minimize coupling to minimize the impact of interface changes Minimize coupling to minimize the impact of interface changes To visualize relationships draw class diagrams To visualize relationships draw class diagrams UML: Unified Modeling Language. Notation for object-oriented analysis and design UML: Unified Modeling Language. Notation for object-oriented analysis and design

18

19

20 Questions How can we modify the BankAccount class to maintain information about the customer? How can we modify the BankAccount class to maintain information about the customer? How might we minimize coupling with the Soccer game example? How might we minimize coupling with the Soccer game example?

21 Immutable Classes Recall that accessor methods only retrieve information Recall that accessor methods only retrieve information They do not change the state of the object They do not change the state of the object Calling them multiple times in a row will yield same results Calling them multiple times in a row will yield same results Immutable classes are classes that only have accessor methods Immutable classes are classes that only have accessor methods

22 Immutable Classes Example: String Class Example: String Class Advantages Advantages Do not have to worry about the dangers of handing off references in methods Do not have to worry about the dangers of handing off references in methods Disadvantages Disadvantages Have to create a new object whenever you want the data to look different Have to create a new object whenever you want the data to look different

23 Mutable Classes Most classes are mutable – they do have mutator methods Most classes are mutable – they do have mutator methods Bus, Taxi, Path, BankAccount are all mutable Bus, Taxi, Path, BankAccount are all mutable StringBuffer can be used if you want to store strings that you can mutate StringBuffer can be used if you want to store strings that you can mutate

24 Side Effects Mutators are designed to change the internal data of the implicit parameter Mutators are designed to change the internal data of the implicit parameter Side effect of a method: modifying externally observable data (explicit parameters) Side effect of a method: modifying externally observable data (explicit parameters) public void transfer(double amount, BankAccount other) { balance = balance - amount; other.balance = other.balance + amount; // Modifies explicit parameter }

25 Side Effects Updating an explicit parameter can be surprising to programmers, and it is best to avoid it if possible Updating an explicit parameter can be surprising to programmers, and it is best to avoid it if possible

26 Other Side Effects Why don’t we add a printBalance() method to BankAccount ? Why don’t we add a printBalance() method to BankAccount ? public void printBalance() // Not recommended { System.out.println("The balance is now $" + balance); }

27 Other Side Effects Makes potentially dangerous assumptions Makes potentially dangerous assumptions The BankAccount class will only be used in English speaking country The BankAccount class will only be used in English speaking country The machine using the program has a System.out association The machine using the program has a System.out association An instance of too much coupling An instance of too much coupling

28 Minimizing Side Effects Never modify explicit parameters to a method Never modify explicit parameters to a method Treat them as constants Treat them as constants public void deposit(double amount) { balance = amount + balance; }

29 Passing Parameters Two ways to pass parameters Two ways to pass parameters Pass by reference – the memory location is sent, meaning that the data can be changed Pass by reference – the memory location is sent, meaning that the data can be changed Pass by value – a copy of the memory location is created Pass by value – a copy of the memory location is created Java only uses pass by value Java only uses pass by value Even objects are passed by value, since the reference is copied Even objects are passed by value, since the reference is copied

30 Example public class BankAccount{ public void trasnfer(double amount, BankAccount other) { balance = balance – amount; double newBalance = other.balance + amount; other = new BankAccount(newBalance); }} Does this work? Why or why not? Does this work? Why or why not?

31

32 Preconditions Precondition: Requirement that the caller of a method must meet Precondition: Requirement that the caller of a method must meet Publish preconditions so the caller won't call methods with bad parameters Publish preconditions so the caller won't call methods with bad parameters /** Deposits money into this account. @param amount the amount of money to deposit (Precondition: amount >= 0) */

33 Preconditions Typical use: Typical use: To restrict the parameters of a method To restrict the parameters of a method To require that a method is only called when the object is in an appropriate state To require that a method is only called when the object is in an appropriate state If precondition is violated, the method is not responsible for computing the correct result. It is free to do anything. If precondition is violated, the method is not responsible for computing the correct result. It is free to do anything.

34 Example What preconditions are needed for dropOffPassenger() in the Taxi class? What preconditions are needed for dropOffPassenger() in the Taxi class? What a is precondition to next() in Scanner ? What a is precondition to next() in Scanner ?

35 Handling Violations Method does not have to behave correctly when preconditions are violated Method does not have to behave correctly when preconditions are violated But what should be done? But what should be done? Assume data is correct. Only a corruption/crashes to happen at fault of user Assume data is correct. Only a corruption/crashes to happen at fault of user Throw an exception if a condition is violated. The control is shifted to an exception handler Throw an exception if a condition is violated. The control is shifted to an exception handler Runtime error messages are all exceptions Runtime error messages are all exceptions

36 Handling Violations Both have their disadvantages Both have their disadvantages Exceptions slow down the program Exceptions slow down the program Doing nothing can be very dangerous Doing nothing can be very dangerous Best of both worlds: assertions that can be turned on or off Best of both worlds: assertions that can be turned on or off

37 Assertions Method can do an assertion check Method can do an assertion check assert amount >= 0; balance = balance + amount; To enable assertion checking: To enable assertion checking: java -enableassertions MyProg You can turn assertions off after you have tested your program, so that it runs at maximum speed You can turn assertions off after you have tested your program, so that it runs at maximum speed

38 Common Error Returning silently on an error is hard to detect and debug Returning silently on an error is hard to detect and debug if (amount < 0) return; // Not recommended; hard to debug balance = balance + amount;

39 Postconditions Postcondition: a condition that is true after a method has completed. This is the designer's duties (recall preconditions are the user's duty) Postcondition: a condition that is true after a method has completed. This is the designer's duties (recall preconditions are the user's duty) If method call is in accordance with preconditions, it must ensure that postconditions are valid If method call is in accordance with preconditions, it must ensure that postconditions are valid

40 Postconditions There are two kinds of postconditions: There are two kinds of postconditions: The return value is computed correctly The return value is computed correctly The object is in a certain state after the method call is completed (mutators) The object is in a certain state after the method call is completed (mutators) /** Deposits money into this account. (Postcondition: getBalance() >= 0) @param amount the amount of money to deposit (Precondition: amount >= 0) */

41 Postconditions Don't document trivial postconditions that repeat the @return clause Don't document trivial postconditions that repeat the @return clause Formulate pre- and postconditions only in terms of the interface of the class Formulate pre- and postconditions only in terms of the interface of the class amount <= getBalance() // this is the way to state a postcondition amount <= balance // wrong postcondition formulation

42 Contract Think of pre- and postconditions as a contract Think of pre- and postconditions as a contract If caller fulfills the precondition, the method must fulfill the postcondition. If caller fulfills the precondition, the method must fulfill the postcondition.

43 Static (Class) Fields Stores a field outside of any particular instance (object) Stores a field outside of any particular instance (object) Only one copy of a field that is shared by all instances of a class Only one copy of a field that is shared by all instances of a class Usually minimize the use of static for object- oriented programs Usually minimize the use of static for object- oriented programs

44 Static (Class) Methods Can be invoked without creating an instance. Can be invoked without creating an instance. Can only access explicit parameters, class fields, class methods and constructors. Can only access explicit parameters, class fields, class methods and constructors. main method must be static main method must be static

45 Field Modifier Choices For each field: For each field: 1. Choose identifier and data type. 2. Is it a constant?  If so, add final modifier 3. Does it require a different value for each instance?  If not, add static modifier 4. Is it safe to be directly accessible to methods in other classes?  If so, public  Else private 5. Is the static value known?  If so, initialize to that value

46 Method Modifier Choices For each method: For each method: 1. Choose identifier, return type, and parameters 2. Does it access any instance (non-static) fields or instance methods?  If not, add static modifier 3. Must it be called from methods in other classes?  If so, must be public  Else make it private 4. Is it safe to be overridden? (inheritance)  If not, add final modifier

47 Static (Class) Fields Why make fields static? Why make fields static? so that only one copy of the value is stored (all instances share the same copy) so that only one copy of the value is stored (all instances share the same copy)

48 Static Methods Why make methods static? Why make methods static? So that the method is accessible without creating an instance So that the method is accessible without creating an instance Note: We can only do this if the method only requires explicit parameters or static fields. Note: We can only do this if the method only requires explicit parameters or static fields.

49 Static Methods Why write a method that does not operate on an object? Why write a method that does not operate on an object? Common reason: we're encapsulating some computation that involves only numbers. Numbers aren't objects, you can't invoke methods on them. E.g., x.sqrt() is not legal in Java Common reason: we're encapsulating some computation that involves only numbers. Numbers aren't objects, you can't invoke methods on them. E.g., x.sqrt() is not legal in Java

50 Static Methods: Example public class Financial { public static double percentOf(double p, double a) { return (p / 100) * a; } // More financial methods can be added here. } public class Financial { public static double percentOf(double p, double a) { return (p / 100) * a; } // More financial methods can be added here. }

51 Static Methods: Example Call with class name instead of object: double tax = Financial.percentOf(taxRate, total); Call with class name instead of object: double tax = Financial.percentOf(taxRate, total); main is static – there aren't any objects yet main is static – there aren't any objects yet

52 Static Fields Three ways to initialize: Three ways to initialize: Do nothing. Field is 0 (for numbers), false (for boolean values), or null (for objects) Do nothing. Field is 0 (for numbers), false (for boolean values), or null (for objects) Use an explicit initializer, such as Use an explicit initializer, such as public class BankAccount {... private static int lastAssignedNumber = 1000; // Executed once, when class is loaded } Use a static initialization block Use a static initialization block

53

54 Scope Scope of a variable: Region of program in which the variable can be accessed Scope of a variable: Region of program in which the variable can be accessed Scope of a local variable extends from its declaration to end of the block that encloses it Scope of a local variable extends from its declaration to end of the block that encloses it Sometimes the same variable name is used in two methods. Sometimes the same variable name is used in two methods.

55 Scope: Example public class RectangleTester { public static double area(Rectangle rect) { double r = rect.getWidth() * rect.getHeight(); return r; } public static void main(String[] args) { Rectangle r = new Rectangle(5, 10, 20, 30); double a = area(r); System.out.println(r); } } public class RectangleTester { public static double area(Rectangle rect) { double r = rect.getWidth() * rect.getHeight(); return r; } public static void main(String[] args) { Rectangle r = new Rectangle(5, 10, 20, 30); double a = area(r); System.out.println(r); } }

56 Scope The scope of a local variable cannot contain the definition of another variable with the same name The scope of a local variable cannot contain the definition of another variable with the same name Rectangle r = new Rectangle(5, 10, 20, 30); if (x >= 0) { double r = Math.sqrt(x); // Error–can't declare another variable //called r here... }

57 Scope However, we can have local variables with identical names if scopes do not overlap However, we can have local variables with identical names if scopes do not overlap if (x >= 0) { double r = Math.sqrt(x);... } // Scope of r ends here else { Rectangle r = new Rectangle(5, 10, 20, 30); // OK–it is legal to declare another r here... }

58 Scope private members have class scope: You can access all members in any method of the class private members have class scope: You can access all members in any method of the class Must qualify public members outside scope Must qualify public members outside scope Math.PI harrysChecking.BANK_FEE

59 Scope Inside a method, there is no need to qualify fields or methods that belong to the same class Inside a method, there is no need to qualify fields or methods that belong to the same class An unqualified instance field or method name automatically refers to the current object ( this ) An unqualified instance field or method name automatically refers to the current object ( this ) public class BankAccount { public void transfer(double amount, BankAccount other) { withdraw(amount); // this.withdraw(amount); other.deposit(amount); }... }

60 Scope A local variable can shadow a field with the same name A local variable can shadow a field with the same name Local scope wins over class scope public class Coin {... public double getExchangeValue(double exchangeRate) { double value; // Local variable... return value; } private String name; private double value; // Field with the same // name } Local scope wins over class scope public class Coin {... public double getExchangeValue(double exchangeRate) { double value; // Local variable... return value; } private String name; private double value; // Field with the same // name }

61 Scope Access shadowed fields by qualifying them with the this reference Access shadowed fields by qualifying them with the this reference value = this.value * exchangeRate;

62 Packages A package is a set of related classes A package is a set of related classes To put classes in a package, you must place a line To put classes in a package, you must place a line package ; as the first instruction in the source file containing the classes The package name consists of one or more identifiers separated by periods The package name consists of one or more identifiers separated by periods

63 Packages For example, to put the Financial class introduced into a package named com.horstmann.bigjava, the Financial.java file must start as follows: For example, to put the Financial class introduced into a package named com.horstmann.bigjava, the Financial.java file must start as follows: package com.horstmann.bigjava; public class Financial {... }

64 Packages: Default The default package has no name and thus no package statement The default package has no name and thus no package statement


Download ppt "Chapter 9 – Designing Classes Goals Learning to design classes Learning to design classes Preconditions and postconditions for methods Preconditions."

Similar presentations


Ads by Google