Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

caseやif-elseで実行コードを分配するような実装をしている時は素直に異なるメソッドとして分割してみる

個人的によくやりがちな実装法なのでメモ。

メソッドにパラメータを渡し、case文やif-else文で実行コードを分岐させるような実装は、
以下のよな手順でリファクタリングできます。

class TestClass
  def self.create_member(type)
    case type
    when :admin
      Admin.new
    when :user
      User.new
    else
      raise ArgumentError, "Incorrect type value"
    end
  end
end

class Admin
  def initialize
    puts "init"
  end
end

class User;  end

TestClass.create_member(:admin)

クラス内部で振る舞いをメソッド

class TestClass
  def self.create_member(type)
    case type
    when :admin
      create_admin
    when :user
      create_user
    else
      raise ArgumentError, "Incorrect type value"
    end
  end

  def self.create_admin; Admin.new; end
  def self.create_user;  User.new;  end
end

class Admin
  def initialize
    puts "init"
  end
end

class User;  end

TestClass.create_member(:admin)

呼び出し先を新造メソッドのものに書き換え

class TestClass;  ##同じモノなので略; end

class Admin; ##同じモノなので略; end
class User;  end

TestClass.create_admin

諸悪の根源を抹殺

class TestClass
  def self.create_admin; Admin.new; end
  def self.create_user;  User.new;  end
end

class Admin; ##同じモノなので略; end
class User;  end

TestClass.create_admin