サカナ未遂

プログラミング、筋トレ、子育て

RubyでStruct.newを使って構造を包み隠す

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