Contents
- 1. Chapter 10 Making Method Calls Simpler
- 1.1. Rename Method
- 1.2. Add Parameter
- 1.3. Remove Parameter
- 1.4. Separate Query from Modifier
- 1.5. Parameterize Method
- 1.6. Replace Paramter with Explicit Method
- 1.7. Preserve Whole Object
- 1.8. Replace Parameter with Method
- 1.9. Introduce Parameter Object
- 1.10. Remove Setting Method
- 1.11. Hide Method
- 1.12. Replace Constructor with Factory Method
- 1.13. Encapsulate Downcast
- 1.14. Replace Error Code with Exception
- 1.15. Replace Exception with Test
1.1. Rename Method ¶
The name of a method does not reveal its purpose.
Change the name of the method
1.2. Add Parameter ¶
A method needs more information from its caller.
Add a parameter for an object that can pass on this information
1.4. Separate Query from Modifier ¶
You have a method that returns a value but also changes the state of an object.
Create two methods, one for the query and one for the modification
1.5. Parameterize Method ¶
Several methods do similar things but with different values contained in the method body.
Create one method that uses a parameter for the different values
1.6. Replace Paramter with Explicit Method ¶
You have a method that runs different code depending on the values of an enumerated parameter.
Create a separate method for each value of the parameter
~cpp void setValue (String name, int value) { if (name.equals("height")) _height = value; if (name.equals("width")) _width = value; Assert.shouldNeverReachHere(); }
~cpp void setHeight (int arg) { _height = arg; } void setWidth (int arg) { _width = arg; }
1.7. Preserve Whole Object ¶
You are getting several values from an object and passing these values as parameters in a method call.
Send the whole object instead
~cpp int low = daysTempRange().getLow(); int high = days.TempRange().getHight(); withinPlan = plan.withinRange (low, high);
~cpp withinPlan = plan.withinRange (daysTempRange());
1.8. Replace Parameter with Method ¶
An object invokes a method, then passes the result as a parameter for a method. The receiver can also invoke this method.
Remove the parameter and let the receiver invoke the method
~cpp int basePrice = _quantity * _itemPrice; discountLevel = getDiscountLevel (); double finalPrice = discountedPrice (basePrice, discountLevel);
~cpp int basePrice = _quantity * _itemPrice; double finalPrice = discountedPrice (basePrice);
1.9. Introduce Parameter Object ¶
You have a group of parameters that naturally go together.
Replace them with an object
1.10. Remove Setting Method ¶
A field should be set at creation time and never altered.
Remove any setting method for that field
1.12. Replace Constructor with Factory Method ¶
You want to do more that simple construction when you create an object.
Replace the constructor with a factory method
~cpp Emplyee (int type) { _type = type; }
~cpp static Emplyee create (int type) { return new Emplyee (type); }
1.13. Encapsulate Downcast ¶
A method returns an object that needs to be downcasted by its callers.
Move the downcast to within the method
~cpp Object lastReading () { return readings.lastElement (); }
~cpp Reading lastReading () { return (Reading) readings.lastElement (); }
1.14. Replace Error Code with Exception ¶
A method returns a special code to indicate an error.
Throw an exception instead
~cpp int withdraw(int amount) { if (amount > _balance) return -1; else { _balance -= amount; return 0; } }
~cpp void withdraw(int amount) throws BalanceException { if (amount > _balance) throw new BalanceException (); _balance -= amount; }
1.15. Replace Exception with Test ¶
You are throwing an exception on a condition the caller could have checked first.
Change the caller to make the test first
~cpp double getValueForPeriod (int periodNumber) { try { return _values[periodNumber]; } catch (ArrayIndexOutOfBoundsException e) { return 0; } }
~cpp double getValueForPeriod (int periodNumber) { if (periodNumber >= _values.length) return 0; return _values[periodNumber]; }