ハッシュで初期化時にABCサイズを小さくする

photo credit: gremionis via photopin cc

class User
  attr_accessor :id, :name, …(略)…, :email
 
  def initialize(hash)
    @id = hash[:id]
    @name = hash[:name]
    :
    (略)
    @email = hash[:email]
  end
end

としているメソッドがあり、これをRubocopにチェックさせると、ABC Sizeが基準値である15を超え、35.74と指摘されてしまった。

ちなみにABC Sizeとは、Assignments, Branches Conditionsの合計のサイズで、GMetrics – GMetrics – ABCメトリックによると、35.74は“21-40 = Might need refactoring”というようにリファクタリングを推奨される値となる。

というわけで以下のようにリファクタリングした。

class User
  attr_accessor :id, :name, …(略)…, :email
 
  def initialize(hash)
    hash.each do | key, value |
      send("#{key}=", value)
    end
  end
end

参考URL