今日読んでたオブジェクト指向設計実践ガイドでStruct.newについて学んだのでメモのつもりで記録しておきます。
以下のコードは時価総額を計算する簡単なものとします。
class MarketCapitalization
attr_reader :data
# 初期化
def initialize(data)
@data = data
end
# 時価総額計算
def calc_market_capitalization
data.collect do |cell|
# 株価 * 株数
cell[0].to_i * cell[1].to_i
end
end
end
# [0]に株価、[1]に株数とする
data = [[100,500],[200,1000],[300,320]]
mc = MarketCapitalization.new(data)
puts mc.calc_market_capitalization
このコードの場合、calc_market_capitalizationメソッドが、配列の構造を知っている前提になっているので、例えばdataの[0]に銘柄コードなどを差し込んだ場合、メソッド内の配列の要素数を変更する必要が出てきます。
メソッドが一つだけなら修正も容易ですが、このdataを多岐に渡って使用している場合、あちらこちらを修正する必要があります。
そこで、Struct.newを使い、以下のように修正します。
class MarketCapitalization
attr_reader :stocks
# 初期化
def initialize(data)
@stocks = stock_assign(data)
end
# 時価総額計算
def calc_market_capitalization
stocks.collect do |stock|
# 株価 * 株数
stock.price.to_i * stock.num.to_i
end
end
StockInfo = Struct.new(:price,:num)
def stock_assign(data)
data.collect do |cell|
StockInfo.new(cell[0],cell[1])
end
end
end
# [0]に株価、[1]に株数とする
data = [[100,500],[200,1000],[300,320]]
mc = MarketCapitalization.new(data)
puts mc.calc_market_capitalization
Structクラスを使い、stock_assignメソッドの中でArray配列をStruct配列に変換しています。
これによって、calc_market_capitalizationメソッドでは配列の要素数を気にすることはなくなりました。
dataの要素数が増えた場合、このstock_assignメソッドのみを修正すれば、他の処理に影響することはなくなります。