はじめに
https://github.com/joker1007/activerecord-cause を詠んでいて、以下のような箇所にでくわした。
get_binds
、 name_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が行ったように、継承前のクラスでエラー処理を行うことで拡張性と柔軟性を与えるのかもしれない。たぶん。