今日読んでたオブジェクト指向設計実践ガイドで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メソッドのみを修正すれば、他の処理に影響することはなくなります。