0
0

More than 3 years have passed since last update.

ダックタイピング

Posted at

ダックタイピングとは

もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない

(wikipediaより)

Rubyの例
 def test(foo)
   puts foo.sound
 end

 class Duck
   def sound
     'quack'
   end
 end

 class Cat
   def sound
     'myaa'
   end
 end

test(Duck.new)
test(Cat.new)
出力結果
quack
myaa

wikipedia読んでもだからなんなのというか、なんにも特別なことをしているように感じなかったのですが、調べるとどうやらそうではないことに気づきました。

型を意識しなくて良い

Javaと比較しているサイトがあり、そのコード例によりメリットが理解できました。

ruby
def test(foo)
  puts foo.sound
end

java
void test(Duck foo) {
   foo.sound();
}

もしもそのオブジェクトが Duckオブジェクト のように Walk()メソッド を呼び出すことができ、Duckオブジェクトのように Sound()メソッド を呼び出すことができるのなら、それは Duckオブジェクト として扱える。

私はpythonを主に使うので、型に対して意識することがほぼありません。rubyも同じでしょう。

しかし、Javaは違います。上記のコードでは、testは受け取るDuckの型を予め指定しています。これにより、型がなんであれ、振る舞いが同じならそれは問題ないという処理ができないわけです。

「引数 foo がどのようなオブジェクトであれ、 sound メソッドを呼び出せれば良い」と割り切っていることが、ダックタイピングです。

なるほどと思いました。
Rustは静的型付け言語ですが、トレイトという機能を使うことによりダックタイピングに似たコーディングができます。

参考文献

https://ja.wikipedia.org/wiki/ダック・タイピング
https://blog.mmmcorp.co.jp/blog/2018/10/26/go-duck-typing/

0
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
0
0