Small Changes

ようやくダックタイピングの意味が分かった



メタプログラミングRuby 第2版のP120でダックタイピングというキーワードが出てきます。

2,3回くらい読んでも意味が分からなかったのですが、「オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方」の5章を読んでやっと意味が分かったので書き留めておこうと思います。

メタプログラミングRuby 第2版のP120のダックタイピング

後者のような流動的な型のことをダックタイピングと呼ぶ。この名前は「アヒルのように歩いて、アヒルのように鳴けば、それはアヒルに違いない」という話に由来する。言い換えれば、あるオブジェクトがDuckクラスのインスタンスかどうかを気にする必要はないということだ。

ここを読んでいて、???となっていたのですがオブジェクト指向設計実践ガイドの5章を読んでからは意味がわかるようになりました。

オブジェクト指向設計実践ガイドの5章

オブジェクト指向設計実践ガイドの5章ではダックを見つけて、それをコードに起こすということを1章通して行っています。この章を通じて、ダックタイピングとは共通のインターフェイス(型 ※厳密には動的型付けのRubyでは型ではない)を定義することだと理解しました。

先ほどのメタプロの例でいえば、どんなクラスでもquack(アヒルの鳴き声)に応答するメソッド(共通のインターフェイス)を定義すれば、それはアヒルのように鳴くのでアヒルといえるよということでした。

なぜ、ダックタイピングの話が出てくるのか

ダックタイピングの話はメタプロRubyもオブジェクト指向設計実践ガイドでも静的型付け言語、動的型付け言語の文脈として挙げられているようでした。

静的型付け言語(あまり詳しくないですが)であれば、型定義を行うことでコード上からその処理が何をするのかが明確になりコンパイラ的にもメリットがあるようです。動的型付け言語では型定義は行いませんが、ダックタイピングのようにそのオブジェクトがどんなメッセージに応答するという共通のインターフェイスを定義(型付けっぽいこと)することで柔軟にコードを書けるようです。

まとめ

バックエンドではRuby、フロントエンドではTypeScriptを用いたプロジェクトに参画していますが、チーム開発するうえでバグの混入をできるだけ防ぐ、ほかの人がコード上からどんな値が入ってくるか読み取れるという点では静的型付けはメリットが大きそうです。

Rubyは書きやすい、読みやすいとは言え複雑なコードになるとやはりどのような値が入ってくるのかはコード上から読み取るのが難しいときもあります。そんなRubyもRuby3からはRBSという静的型付けのための機能が入ってきているようです。

今の時代の流れを汲んでどんどん進化していくRubyはほんとにすごい言語だなーと思います。

話が逸れましたが、ダックタイピングとは仮想の型をつくって、型宣言っぽいことをしているんだなーということが分かってよかったです。

References