Sponsors


Blog powered by TypePad

« The Rails Edge, 2006 - Day 1 | Main | Ruby Arrays: select(), collect(), and map() »

November 22, 2006

Ruby Refactoring Pattern: "Forward with Default Params"

Introducing Ruby refactoring pattern called "Forward with Default Params."  This applies to any language that supports parameter defaulting, actually.  And, this pattern may already be documented somewhere for all I know - I haven't looked into it.  If someone can point this out, I'll be happy to defer all credit.  In the meantime...

Problem: You keep creating new methods, each calling the same helper or 'core' method (we'll call it 'method_a'), but with different params.  You can't change the required params of the core method because spagetti-legacy code relies on method_a, without params, such as with Rails controllers.  You should fix the spagetti code but time dictates otherwise.  However, you feel dirty violating DRY in your controller.  What to do?

# The Problem
def method_a
    a = "Hello, "
    b = "out there."
    puts (a+b)
end

def method_b
     # Duplicates method_a, except a and b are different
    a = "It's turning into another "
    b = "crazy day."

    # Call puts (a+b), just like method_a
    puts (a+b)
end

def method_c
    a = "I will never again "
    b = "code like this."
    puts (a+b)
end

def method_c ... z # Keeps on violating DRY, criminal-like remorselessness
end

Solution: Make method_a accept parameters with each one defaulted to method_a's internal values. 
This way the legacy code isn't broken.  Then reduce all method_b ... z to call method_a with
parameters like the following:

# Forwarding with Default Params

def method_a(a = "Hello, ", b = "out there.")
    puts (a+b)
end

def method_b
    method_a("It's turning into another ", "crazy day.")
end

def method_b
    method_a("I will never again ", "code like this.")
end

TrackBack

TrackBack URL for this entry:
http://www.typepad.com/t/trackback/277049/6907358

Listed below are links to weblogs that reference Ruby Refactoring Pattern: "Forward with Default Params":

Comments

Post a comment

If you have a TypeKey or TypePad account, please Sign In