アヒルのタイプ(wiki)
プログラム設計では、アヒルのタイプ(英語:duck typing)はダイナミックなタイプのスタイルです.このスタイルでは、オブジェクトの有効な意味は、特定のクラスから継承されたり、特定のインタフェースを実装したりするのではなく、現在のメソッドと属性の集合によって決定されます.この概念の名前はJames Whitcomb Rileyが提案したアヒルのテスト(以下の「歴史」章を参照)に由来し、「アヒルのテスト」はこのように表すことができる.
「鳥がアヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴くのを見ると、この鳥はアヒルと呼ぶことができます.」
[1]
[2]
アヒルのタイプでは、対象のタイプそのものではなく、どのように使われているかに注目します.たとえば、アヒルのタイプを使用しない言語では、アヒルのタイプのオブジェクトを受け入れ、その歩き方と呼び方を呼び出す関数を作成できます.アヒルのタイプを使用する言語では、このような関数は任意のタイプのオブジェクトを受け入れ、その歩き方と呼び方を呼び出すことができます.呼び出しが必要なメソッドが存在しない場合、ランタイムエラーが発生します.このような正確な歩き方と呼び方を持つ任意のオブジェクトが関数に受け入れられるという行為が以上の記述を引き出し,この決定タイプの方式がその名を得た.
アヒルのタイプは、通常、テスト方法や関数のパラメータのタイプではなく、ドキュメント、明確なコード、テストに依存して正しく使用されることを保証します.静的タイプ言語から動的タイプ言語に移行するユーザーは、通常、いくつかの静的(実行前の)タイプチェックを追加しようとし、アヒルのタイプの利点と伸縮性に影響を与え、言語の動的特性を制約します.
コンセプトサンプル
アヒルのタイプの言語を使用する次の偽コードを考慮します.
サンプルでは、
このように,アヒルのタイプは継承を用いずに多態を用いた.唯一の要件は、
「鳥がアヒルのように歩き、アヒルのように泳ぎ、アヒルのように鳴くのを見ると、この鳥はアヒルと呼ぶことができます.」
[1]
[2]
アヒルのタイプでは、対象のタイプそのものではなく、どのように使われているかに注目します.たとえば、アヒルのタイプを使用しない言語では、アヒルのタイプのオブジェクトを受け入れ、その歩き方と呼び方を呼び出す関数を作成できます.アヒルのタイプを使用する言語では、このような関数は任意のタイプのオブジェクトを受け入れ、その歩き方と呼び方を呼び出すことができます.呼び出しが必要なメソッドが存在しない場合、ランタイムエラーが発生します.このような正確な歩き方と呼び方を持つ任意のオブジェクトが関数に受け入れられるという行為が以上の記述を引き出し,この決定タイプの方式がその名を得た.
アヒルのタイプは、通常、テスト方法や関数のパラメータのタイプではなく、ドキュメント、明確なコード、テストに依存して正しく使用されることを保証します.静的タイプ言語から動的タイプ言語に移行するユーザーは、通常、いくつかの静的(実行前の)タイプチェックを追加しようとし、アヒルのタイプの利点と伸縮性に影響を与え、言語の動的特性を制約します.
コンセプトサンプル
アヒルのタイプの言語を使用する次の偽コードを考慮します.
function calculate(a, b, c) => return (a+b)*c
example1 = calculate (1, 2, 3)
example2 = calculate ([1, 2, 3], [4, 5, 6], 2)
example3 = calculate ('apples ', 'and oranges, ', 3)
print to_string example1
print to_string example2
print to_string example3
サンプルでは、
calculate
の呼び出しのたびに使用されるオブジェクト(数値、リスト、文字列)は、継承関係に関連付けられていません.オブジェクトが「+」メソッドと「*」メソッドをサポートしている限り、操作は成功します.たとえば、RubyまたはPython言語に翻訳すると、実行結果は次のようになります.9
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
apples and oranges, apples and oranges, apples and oranges,
このように,アヒルのタイプは継承を用いずに多態を用いた.唯一の要件は、
calculate
関数がパラメータのオブジェクトとして「+」メソッドと「*」メソッドを持つ必要があることです.以下の例(python言語)はアヒルのテストを体現している.