Small methods make a project easier to scan, test, and reuse.

extraction Move repeated calculations into a named method so the calling code reads like a sequence of decisions.

Method Extraction

subtotal
method_extraction.rb
Replay: real traced execution (multi-file project)
def invoice_total(subtotal, tax_rate)
  tax = (subtotal * tax_rate).round
  subtotal + tax
end

subtotal = 80
tax_rate = 0.1
total = invoice_total(subtotal, tax_rate)
label = total >= 100 ? "large" : "standard"

puts "subtotal=#{subtotal}"
puts "tax_rate=#{tax_rate}"
puts "total=#{total}"
puts "label=#{label}"
def invoice_total(subtotal, tax_rate)
  tax = (subtotal * tax_rate).round
  subtotal + tax
end

subtotal = 40
tax_rate = 0.1
total = invoice_total(subtotal, tax_rate)
label = total >= 100 ? "large" : "standard"

puts "subtotal=#{subtotal}"
puts "tax_rate=#{tax_rate}"
puts "total=#{total}"
puts "label=#{label}"
def invoice_total(subtotal, tax_rate)
  tax = (subtotal * tax_rate).round
  subtotal + tax
end

subtotal = 120
tax_rate = 0.1
total = invoice_total(subtotal, tax_rate)
label = total >= 100 ? "large" : "standard"

puts "subtotal=#{subtotal}"
puts "tax_rate=#{tax_rate}"
puts "total=#{total}"
puts "label=#{label}"
  1. subtotal ← 80, tax_rate ← 0.1

    6subtotal→ 80 = 80  #@subtotal=40, 1207tax_rate→ 0.1 = 0.18total = invoice_total(subtotal80, tax_rate0.1)9label = total >= 100 ? "large" : "standard"
  2. tax ← 8

    1def invoice_total(subtotal80, tax_rate0.1)2  tax→ 8 = (subtotal80 * tax_rate0.1).round3  subtotal80 + tax84end
  3. total ← 88, label ← standard

    7tax_rate = 0.18total→ 88 = invoice_total(subtotal80, tax_rate0.1)9label→ standard = total88 >= 100 ? "large" : "standard"1011puts "subtotal=#{subtotal80}"12puts "tax_rate=#{tax_rate0.1}"13puts "total=#{total88}"14puts "label=#{labelstandard}"
    outputsubtotal=80
    tax_rate=0.1
    total=88
    label=standard
  1. subtotal ← 40, tax_rate ← 0.1

    6subtotal→ 40 = 407tax_rate→ 0.1 = 0.18total = invoice_total(subtotal40, tax_rate0.1)9label = total >= 100 ? "large" : "standard"
  2. tax ← 4

    1def invoice_total(subtotal40, tax_rate0.1)2  tax→ 4 = (subtotal40 * tax_rate0.1).round3  subtotal40 + tax44end
  3. total ← 44, label ← standard

    7tax_rate = 0.18total→ 44 = invoice_total(subtotal40, tax_rate0.1)9label→ standard = total44 >= 100 ? "large" : "standard"1011puts "subtotal=#{subtotal40}"12puts "tax_rate=#{tax_rate0.1}"13puts "total=#{total44}"14puts "label=#{labelstandard}"
    outputsubtotal=40
    tax_rate=0.1
    total=44
    label=standard
  1. subtotal ← 120, tax_rate ← 0.1

    6subtotal→ 120 = 1207tax_rate→ 0.1 = 0.18total = invoice_total(subtotal120, tax_rate0.1)9label = total >= 100 ? "large" : "standard"
  2. tax ← 12

    1def invoice_total(subtotal120, tax_rate0.1)2  tax→ 12 = (subtotal120 * tax_rate0.1).round3  subtotal120 + tax124end
  3. total ← 132, label ← large

    7tax_rate = 0.18total→ 132 = invoice_total(subtotal120, tax_rate0.1)9label→ large = total132 >= 100 ? "large" : "standard"1011puts "subtotal=#{subtotal120}"12puts "tax_rate=#{tax_rate0.1}"13puts "total=#{total132}"14puts "label=#{labellarge}"
    outputsubtotal=120
    tax_rate=0.1
    total=132
    label=large