Edited at

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

More than 1 year has passed since last update.


はじめに

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が行ったように、継承前のクラスでエラー処理を行うことで拡張性と柔軟性を与えるのかもしれない。たぶん。