MixinによるDuck Typing
- d.y.d: イヌネコ (http://www.kmonos.net/wlog/88.html#_1337080801)
リンク先の話題とは何も関係ないが、PythonでMixinを使用してDuck Typingを書いてみた。speakメソッド以外に共通のメソッドが増えれば、DRY原則から通常は継承することになるが、別に継承しなくても同じことがMixinで実現可能。
In [1]: s=''' ...: def speak(self): ...: print self.word ...: ''' In [2]: class Dog: ...: exec(s) ...: word = 'woof!' ...: In [3]: class Cat: ...: exec(s) ...: word = 'meow!' ...: In [4]: [p.speak() for p in [Dog(), Cat()]] woof! meow! Out[4]: [None, None]
static/dynamic duck typingの違いが良く分からなかったが、機能的な違いを言っているのではなく、実装する際に使うテクニックということだろうか?Duck Typingなので型安全になるということでもなさそうだし。
しかし、JavaでDuck Typingするには、Genericsで無理なので諦めていたが、Reflectionを使用すれば可能だったのか。知らなかった。Javaでは、実践でReflection多用するとブログに書いている人もいたが、Reflectionは上記リンクの例を見る限り型安全ではなさそうで、それだったら動的型付けとかeval()と大差ないなあと思ってしまった。Javaは色々な機能をReflectionで逃げているような…。というか、初期の設計ミスによる苦肉の策?
以下はGenericsとReflectionを組み合わせた例だが、これは尋常じゃない。
- プログラミング日記: "汎用配列を作成します"エラーと戯れる (http://d.hatena.ne.jp/morchin/20080219#p4)
まあ、Reflectionがなければ実現できないと思うけど。JavaのReflectionもきちんと勉強しないとなあ。基礎的な良い本ないかな。