2007年11月24日土曜日

ダック・タイピング

Duck Typing (ダック・タイピング) という言葉が気になったので調べてみました。

動的言語のデメリット

動的言語と静的言語を比較するとき、動的言語のデメリットとそれに対する解答は以下になります。
  • コンパイル時にエラーが見つけられない。⇒ エラーはユニットテストで見つければ良い
  • 最適化の情報が少ない。⇒ 昨今では実行効率よりもプログラムの柔軟性や生産性の方が重要
  • 型情報がないので、コード読解のヒントが少ない。⇒ ドキュメントによる支援で解決する。
特に、静的なプログラム言語と動的なプログラム言語で同様の処理をするとき、多くの場合静的なプログラム言語が実行速度で勝つことについて、この理由として言及されるのは、以下の点です。
  • 動的なプログラミング言語には大抵型チェックが必要。
  • 静的型なプログラミング言語はソース・コードを直接実行できる形式に変換するコンパイル型処理系が多い
  • 動的型のプログラミング言語はインタプリタ型処理系が多い。
一方で、動的プログラミング言語のメリットとしては、
  • ソースコードが簡潔になりやすい。⇒ 処理の本質部分に集中してプログラムを書けるので、生産性向上
  • 柔軟性 ⇒ 型宣言がないので、開発時に想定していなかったデータを取り扱うことが容易
とういことがあります。この柔軟性を実現するのが ダック・タイピング です。

ダック・タイピングとは??

動的プログラミング言語の柔軟性を表現するのがダック・タイピングです。
Wikipedia をチェックしてみるとこんな風に書いてあります。
In Computer Programming, duck typing is a style of dynamic typing in which an object's current set of methods and properties determines the valid semantics, rather than its inheritance from a particular class. The name of the concept refers to the duck test, attributed to James Whitcomb Riley, which may be phrased as follows:
If it walks like a duck and quacks like a duck, I would call it a duck.Wikipedia--Duck Typing
この文章にもあるように、ダック・タイピングは、

If it walks like a duck and quacks like a duck, I would call it a duck.
アヒルのように歩いたり鳴いたりするものはアヒルであろう。


という表現に由来します。あるオブジェクトがどのクラスに所属するオブジェクトなのかを考慮せず、どのようなメソッドを持つか、に注目してプログラムするのがダック・タイピングです。

ダック・タイピングの原則

ダック・タイピングにおける原則は次のようなものです。
基本的な原則はたった1つ,最低限これだけを覚えておけば大丈夫です。
明示的な型チェックを避けるまつもと直伝 プログラミングのオキテ 第4回(3)
つまり型チェックをするのではなく、メソッドを持っているかでチェックする、ということになります。例えば、
if not obj.kind_of?(String)
raise TypeError, 'not a String'
end
とすると型チェックをするので静的な言語と変わらなくなる。
if not obj.kind_of?('to_str')
raise TypeError, 'not a String'
end
とすればメソッドを持っているかの判定になる。ということです。

※self.kind_of?(mod) メソッドは、self が、
  • クラス mod とそのサブクラス
  • モジュール mod をインクルードしたクラスとそのサブクラス
のいずれかのインスタンスであるとき真を返すメソッドです。