RubyでInterface

そもそもRubyにInterfaceが必要とか、必要じゃないとかの議論は置いておいて、 無いのであれば、類似したことをやりたい場合はどうすればいいのかが気になって調べてた。

1. まずは簡単にやってみる

module TestInterface
  def method1
    raise NotImplementError
  end
end

class SomeClass
  include TestInterface
  def method1
    puts "hoge"
  end
end

SomeClass.new.method1

実装はココから拝借。

blog.wktk.co.jp

愚直にmoduleで書いたほうが良いんじゃないかなぁと思っている。 そのほうが明示的でわかりやすいというか… 業務でどうしても欲しい場合は、消去法でコレで良いんじゃないんですか。という感じ。

2. Gem使う

その名もズバリなInterFaceというGemがあるので、コレを使ってみることにする。

github.com

実装もここから読めるし、100行もないくらいの短いコードなので、興味がある人は読んでみて欲しい。 interface/interface.rb at master · djberg96/interface · GitHub

require 'rubygems'
require 'interface'

TestInterface = interface{
  required_methods :method1
}

class SomeClass
  def method1
    puts "hoge"
  end
  implements TestInterface
end

SomeClass.new.method1

Interfaceをそれっぽく、かつRubyっぽい感じ*1でかける。 ただ一番しっくりこないのは、implements*2を必ずメソッドの定義よりも下に書かないと動かないことだろう。 多分これは実装上の都合なだけな気がするので、もしかすると修正されて、メソッド定義よりも上に書いてみても大丈夫になるかもしれない。 業務で使うのはあまりオススメ出来ない…

まとめ

結局少し試してみたけど、これならやらんでもいいかな…となってしまった。

*1:ココでいうRubyっぽいというのは簡潔という意味で、そもそもInterface使おうとしている時点でRubyっぽくないのは間違いない。

*2:コード見れば解るけど、このGemのimplementsの実体はただのincludeのエイリアスだったりする。 https://github.com/djberg96/interface/blob/master/lib/interface.rb#L106