個人的によくやりがちな実装法なのでメモ。
メソッドにパラメータを渡し、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