Skip to content

Instantly share code, notes, and snippets.

@jgaskins
Last active May 30, 2016 22:02
Show Gist options
  • Save jgaskins/2a220b6d752fae7de79d07e70ff1fa3a to your computer and use it in GitHub Desktop.
Save jgaskins/2a220b6d752fae7de79d07e70ff1fa3a to your computer and use it in GitHub Desktop.
Modules vs method objects
class OrderPriceCalculation
def initialize(order, tax_rate:)
@order = order
@tax_rate = tax_rate
end
def total
subtotal + sales_tax + fees
end
def subtotal
items
.map(&:price)
.reduce(0, :+)
end
def sales_tax
items
.select(&:taxable?)
.map { |o| o.price * @tax_rate }
.reduce(0, :+)
end
def fees
delivery_fee + processing_fee
end
def delivery_fee
if @order.delivery?
3.99
else
0
end
end
def processing_fee
0.30
end
def items
@order.line_items
end
end
module CalculateOrderPrice
module_function
def total(order, tax_rate:)
subtotal(order) + sales_tax(order, tax_rate) + fees(order)
end
def subtotal(order)
items
.map(&:price)
.reduce(0, :+)
end
def sales_tax(order, rate)
order
.line_items
.select(&:taxable?)
.map { |o| o.price * rate }
.reduce(0, :+)
end
def fees(order)
delivery_fee(order) + processing_fee
end
def delivery_fee(order)
if order.delivery?
3.99
else
0
end
end
def processing_fee
0.30
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment