メタプログラミング 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 はほんとにすごい言語だなーと思います。
話が逸れましたが、ダックタイピングとは仮想の型をつくって、型宣言っぽいことをしているんだなーということが分かってよかったです。