ダックタイピングの考え方は理解できたので、コードでもっと頻繁に使用したいと思います。ただし、潜在的な問題が 1 つあります。名前の衝突です。
オブジェクトに何かをさせたいとします。適切なメソッドを知っているので、それを呼び出して何が起こるかを確認するだけです。一般に、次の 3 つの結果が考えられます。
メソッドが見つからず、
AttributeError
例外が発生します。これは、オブジェクトが私が思っているものではないことを示しています。ダックタイピングを使用すると、そのような例外をキャッチするか、外側のスコープにそれを処理させる (またはプログラムを終了させる) ことをいとわないので、それは問題ありません。メソッドが見つかり、まさに私が望んでいることを実行し、すべてが素晴らしいです。
メソッドは見つかりましたが、必要なメソッドではありません。これは、まったく無関係なクラスの同じ名前のメソッドです。矛盾した状態が後で検出されるか、最悪の場合、プログラムが暗黙のうちに誤った出力を生成するまで、実行が続行されます。
これで、質の高い名前が結果 #3 の可能性をいかに減らすことができるかがわかります。しかし、プロジェクトが結合され、コードが再利用され、ライブラリが交換され、ある時点で 2 つのメソッドが同じ名前を持ち、完全に無関係である可能性が非常に高くなります (つまり、ポリモーフィズムで互いに置き換えられることを意図していません)。
私が考えていた解決策の 1 つは、メソッド名のレジストリを追加することです。各レジストリ レコードには、次のものが含まれます。
- メソッド名 (一意、つまり、名前ごとに 1 つのレコードのみ)
- その一般化された説明 (つまり、それが呼び出される可能性のあるすべてのインスタンスに適用可能)
- 使用する予定のクラスのセット
メソッドが新しいクラスに追加された場合、そのクラスを (手動で) レジストリに追加する必要があります。その時点で、プログラマーはおそらくメソッドが既に付けられている意味と一致していないことに気付き、必要に応じて別の名前を使用します。
メソッドが呼び出されるたびに、プログラムは名前がレジストリにあり、インスタンスのクラスがレコード内のクラスの 1 つであることを自動的に確認します。そうでない場合は、例外が発生します。
これが非常に難しいアプローチであることは理解していますが、精度が重要な場合には、役立つ可能性があることがわかります。(Python またはその他の動的型付け言語で) 試しましたか? 似たようなことをするツールはありますか?検討する価値のある他のアプローチはありますか?
注: 名前空間の汚染を回避することが正しいアプローチであるグローバル レベルでの名前の競合については言及していません。メソッド名の衝突について言及しています。これらは名前空間の影響を受けません。