LoginSignup
1
0

More than 5 years have passed since last update.

バージョンにより異なるメソッドをoverrideする方法に関して

Last updated at Posted at 2018-04-30

はじめに

https://github.com/joker1007/activerecord-cause を詠んでいて、以下のような箇所にでくわした。

get_bindsname_with_color sql_with_colorは、activerecord-cause独自のメソッドではなくて、
ActiveRecordのメソッドです。

def get_binds(payload)
  raise NotImplementedError
end

def name_with_color(payload_name)
  raise NotImplementedError
end

def sql_with_color(payload_sql)
  raise NotImplementedError
end

その後のコードで、このメソッドたちを持つクラスを継承したクラスでoverrideしています。
イメージとしては以下のサンプルのような感じです。

サンプル

module Test
  class HogeVer0
    def basic_method
      puts "このメソッドはversionに関係なく呼び出せます"
    end

    # メリットは?
    def special_method
      raise "VERSIONが正しくありません"
    end
  end

  class HogeVer1 < HogeVer0
    def special_method
      puts "form ONE!!"
    end
  end

  class HogeVer2 < HogeVer0
    def special_method
      puts "form TWO!!"
    end
  end
end

def set_test_obj(version)
  case version
  when 1
    Test::HogeVer1.new
  else
    Test::HogeVer2.new
  end
end

結果はこんな感じ。

obj = set_test_obj(1)
obj.basic_method          #=> このメソッドはversionに関係なく呼び出せます
obj.special_method        #=> form ONE!!

obj = set_test_obj(2)
obj.special_method        #=> form Two!!

obj = set_test_obj(100)
obj.special_method        #=> form Two!!

おそらく結論

将来的に新しいバージョンが登場した場合、新しいクラスでそのメソッドが不要になるシチュエーションもあったっりする。

そうしたケースを考えると、このようにバージョンによって異なるメソッドは、activerecord-causeが行ったように、継承前のクラスでエラー処理を行うことで拡張性と柔軟性を与えるのかもしれない。たぶん。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0