Iteration Podcast
Managing Dependencies
Chapter 3: Managing Dependencies
To collaborate, an object must know something about others. Knowing creates a dependency. If not managed carefully, these dependencies will strangle your application
Recognizing Dependencies
An object has a dependency when it knows:
- The name of another class.
-
Gearexpects a class namedWheelto exist
-
- The name of a message that it intends to send to someone other than
self.-
Gearexpects aWheelinstance to respond todiameter
-
- The arguments that a message requires.
-
Gearknows thatWheel.newrequires arimand atire
-
- The order of those arguments.
-
Gearknows the first argument toWheel.newshould berimand the second should betire
-
Writing Loosely Coupled Code
Inject Dependencies
see 1_inject_dependencies.rb
- Referring to a class by its name inside of another class is bad.
- If the name of
Wheelclass changes, thegear_inchesmethod must also change - The bigger problem is that
gear_inchesis explicitly saying that it is only willing to calculate gear inches for instances ofWheel -
Gearwill only collaborate with any other kind of object even if that object has a diameter and uses gears!
It's is not the class of the object that's important, it's the message you plan to send to it.
-
Gearneeds access to an object that can respond todiameter- a duck type - We can use a technique called dependency injection to move the creation of a new
Wheelinstance outside of the class
Isolate Dependencies
see 2_isolate_dependencies.rb
Isolate Instance Creation
- Sometimes you can't break all unnecessary dependencies, but you can isolate them
- The first technique moves
Wheel.newfromgear_inchesand intoGear'sinitializemethod - The next alternative isolates the creation of a
Wheelinto its ownwheelmethod
Isolate Vulnerable External Messages
-
gear_inchesdepends onGearresponding towheelandwheelresponding todiameter - by creating a different
diametermethod to holdwheel.diameter, we remove the dependency withingear_inches
Remove Argument-Order Dependencies
see 3_remove_arg_orer_dependencies.rb
Use Hashes for Initialization Arguments
- arguments of our
initializemethod must be passed in the correct order. we can pass an object instead to remove this dependency
Explicitly Define Defaults
- we can use the
fetchmethod to set defaults when using hashes in ourinitializemethod -
fetchexpects the key you're fetching to be in the hash and supplies several options for handling missing keys -
fetchwill only set the default if the key is not found in the hash
Managing Dependency Direction
- All examples thus far have shown
Geardepending onWheelordiameter- but the code could have easily been written so thatWheeldepends onGearorratio
Choosing Dependency Direction
Depend on things that change less often
John’s pick - Pick Krisp -https://krisp.ai
Iteration Podcast