Il modello Product
che può avere 2 tabelle di prezzo. Il metodo price
calcola il prezzo del prodotto in base alla tabella dei prezzi del prodotto definita dal campo price_table
.
class Product < ActiveRecord::Model
NORMAL_PRICE_TABLE = 1
PROMOTIONAL_PRICE_TABLE = 2
validates_presence_of :price_table
def price(quantity)
case price_table
when NORMAL_PRICE_TABLE
# calculate using normal price table rules
when PROMOTIONAL_PRICE_TABLE
# calculate using promotional price table rules
else
raise 'unknown data price'
end
end
end
Voglio refactoring questo codice. Il modo più pulito che ottengo è questo:
class NormalPriceTable
def initialize(raw_product_price, quantity)
@raw_product_price = raw_product_price
@quantity = quantity
end
def price
# calculate
end
end
class PromotionalPriceTable
def initialize(raw_product_price, quantity)
@raw_product_price = raw_product_price
@quantity = quantity
end
def price
# calculate
end
end
class Product < ActiveRecord::Model
NORMAL_PRICE_TABLE = 1
PROMOTIONAL_PRICE_TABLE = 2
def price(quantity)
price_table_class.new(raw_price, quantity).price
end
def price_table_class
case price_table
when NORMAL_PRICE_TABLE
NormalPriceTable
when PROMOTIONAL_PRICE_TABLE
NormalPriceTable.new(raw_price, quantity).price
else
raise 'unknown price table'
end
end
end
Due domande:
- È possibile sbarazzarsi di questa clausola
case
suProduct
class? - Quali sono le altre alternative per il refactoring di questo codice?