動的バインディングとは
コンピューターサイエンスでは、名前のバインドは、関数名や変数名などの識別子をコードまたはデータのセクションに関連付けることです。 最も一般的なシナリオである静的バインディングでは、このマッピングはコンパイル時に認識されます。 動的バインディングでは、関数によってマップされたオブジェクトはコンパイル時には認識されず、プログラムの実行中にのみ決定できます。 このため、動的バインディングは遅延バインディングとも呼ばれます。 動的バインディングは、静的バインディングでは利用できない柔軟性を提供しますが、静的バインディングよりもパフォーマンスコストが高くなります。
動的バインディングは、オブジェクト指向プログラミングの一部であるポリモーフィズムと密接に関連しています。 多態性により、同じメソッド名をさまざまな方法で実装できます。 コンパイル時に正確なメソッドを決定できないような方法でコードが記述されていない場合は、動的バインディングを使用する必要があります。
たとえば、「Shape」クラスには「GetArea」というメソッドがあります。これは、すべてのシェイプに領域があるためです。 ただし、「Shape」の「Circle」サブクラスは、「Square」サブクラスとは異なる方法で「GetArea」を実装します。 したがって、タイプ "Shape"の新しいオブジェクトが作成され、コードがその形状に対してメソッド "GetArea"を呼び出す場合、コンパイラーは形状が最終的に円形か正方形かを知る方法がありません。どのGetAreaメソッドを呼び出すかはわかりません。 これは、プログラムがオブジェクトの形状を認識した後、正しいGetAreaメソッドが実行時にのみマップされるため、動的バインディングの例です。
動的バインディングにより、どの特定の実装が使用されるかわからなくても、抽象メソッドを柔軟に使用できます。 「Shape」の例では、このロジックを明示的に使用することにより、動的バインディングを回避するコードを記述できます。形状が円の場合、円のGetAreaメソッドを呼び出します。 それ以外の場合、形状が正方形の場合は、正方形の特定のGetAreaメソッドを呼び出します。 動的バインディングの利点は、コードが代替よりもクリーンで保守性が高いことです。 静的バインディングの例では、コードの重複があり、新しいタイプの形状が追加されるたびにコードを更新する必要があります。
動的バインディングの欠点は、パフォーマンスと安全性です。 静的バインディングでは、コンパイラは呼び出すコードを正確に認識し、コードを最適化してより効率的に実行できます。 型の安全性が問題になる可能性があるのは、動的バインディングの一部の実装では、メソッドをサポートしていないオブジェクトでメソッドを呼び出すことができるためです。 たとえば、「GetArea」メソッドは、シェイプではないオブジェクトで呼び出されるため、「GetArea」メソッドがなく、実行時エラーが発生する可能性があります。 静的バインディングは、コンパイルエラーを発生させることにより、このシナリオを防ぎます。