そのような言語 (C#、Java など) で何かを書いて、ダックタイピングを逃したことはありますか? (ダックタイピングに対する議論については、この質問を参照してください)
4 に答える
自分が所有しておらず、適切な抽象化を持たないコードを扱う必要があるときはいつでも (HttpContext は誰ですか?)。HttpContext タイプにはそのような抽象化がないため、自分のメソッドに IHttpContext を受け入れるようにさせることはできないため、アダプターやファクトリーなどで解決する必要があります。コードで IHttpContext コントラクトを定義し、それを HttpContext のように見せ、IHttpContext を受け入れるようにメソッドを設定し、真の実際の HttpContext オブジェクトを渡して IHttpContext にダックすることができれば、非常に便利でした。
その他の質問は、ダックタイピングとはほとんど関係がありませんでした。とにかく、これが閉じられないと仮定すると、ダックタイピングを本当に見逃したのは、大きなAPIを使用してクラスをテストしようとしたときです。それらのモックを作成するための別のフレームワークが必要ですが、別のプログラミング言語では、必要なものの基本を実装する自作のクラスを渡すことができると考えられます。
たとえば、フレームワークを使用せずにJavaでJDBC ResultSetをモックしようとすると、少し面倒です。
一度もない。90 年代から Java を使用し、2001 年から Python を使用しています。
これが、私が Java のダックタイピングを見逃さなかった理由です。
"Duck Typing in Java Question" は、ポリモーフィズムを完全に理解していないことに関するものです。何らかの種類の実行時の型識別または「isinstance」機能が必要だと考えたことがある場合は、ポリモーフィズムを理解できておらず、間違っています。
Programmer Ignorance Pet Peeveの質問を参照してください。ポリモーフィズムを理解できないことは大きな問題であり、この「Java でのダックタイピング」の間違いにつながります。
ポリモーフィズムを理解していれば、ダックタイピングは必要ありませんし、Python と Java を切り替えるときにも見逃すことはありません。
関連する注意として、私は Pythonisinstance()
をアサーションの一部としてのみ使用して、整数以外の値を取得したときに整数を必要とする関数を作成します。 isinstance()
は、Java でダックタイピングのようなことをしようとするときに使用されることがあります。
要点は、私は年をとっており (52 歳)、あまり賢くないということです。そのため、Python の「強力な」クラス階層を維持する必要があります。そうしないと、混乱してしまいます。必要に応じて、より厳密なクラス階層にリファクタリングできるように、Python の設計には常にスペースを残しました。
言語がメソッド シグネチャに基づいてダックタイピングを実行することは、言語が設計上の弱点を回避しようとしている状況以外では決して必要ではありません (C#foreach
コンストラクトの場合のように)。一方で、ダックタイピングに似たようなことをインターフェイスで行うと役立つ状況も数多くあります。たとえば、インターフェイスとUseDuck
を実装するように制約されているジェネリック パラメータを受け取るメソッドがある場合、両方を実装するように制約されて に渡すことができるジェネリック型の変数を持つコードがあります。ただし、コードが終了後に渡される形式でコードを永続化する良い方法はありません。ダック型を定義できれば非常に役立ちますIWalkLikeDuck
IQuackLikeDuck
IWalkLikeDuck
IQuackLikeDuck
UseDuck
Wowzo
IWalkAndTalkLikeDuck
これは他の両方のインターフェースから継承されましたが、 と の両方を実装する任意のクラスによって実装されていると自動的に見なされ、 と を実装することIWalklikeDuck
ITalkLikeDuck
IWalkLikeDuck
がITalkLikeDuck
わかっている任意の型への参照を に格納できList<IWalkAndTalkLikeDuck>
ます。