読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

ruby refactoring

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

メソッドにパラメータを渡し、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