2011-08-24 5 views
2

インタフェースを満たすメソッド/プロパティの有無をチェックすることで、ダイナミックな型指定によるインタフェースを強制するRubyの方法について準備が整いました。メンバー照合vsインタフェース

インターフェイスを使用するよりも、この全体的なデザインの原則はどのように優れていますか?賛否両論は何ですか?たとえば、C#で同じ概念を実装することができますが、私はそれが同じ値、

public class Foo 
{ 
    public Foo(dynamic _obj) 
    { 
     MethodInfo[] methods= _obj.GetType().GetMethods(); 

     if (!methods.Any(x => x.Name == "SomeRequiredMethod") 
     { 
      throw new ArgumentException("Object does not meet interface requirements."); 
     } 
    } 

    // proceed with functionality that requires the method 
} 

を持っているでしょうそしてもちろん、あなたが署名のような、単なる名前以上のものをチェックするために、これを拡張することができればわかりません返品タイプなど

思考?私はこのアプローチにはいくつかの主要な問題の問題見ることができます

答えて

1

  1. 反射が遅い
  2. 動的呼び出しも強く型付けされた通話よりもはるかに遅いです
  3. は、コードが複雑になり

おそらく非常に特殊なニーズを除いて、私はどんな利点も見当たりません...

C#は静的で強く型付けされた言語として設計されていますが、現在はいくつかの動的機能を備えていますが、強く型付けされた代替がない場合にのみ使用してください。

実際にオブジェクトを動的に使用する必要がある場合は、メンバを手動でチェックしないでください。コードをtryブロックに入れて、呼び出すメンバが見つからない場合に発生するRuntimeBinderExceptionをキャッチします。

+0

しかし、Rubyではパフォーマンスヒットがあるかどうかは分かりますか?私は39msでそれを計時した。私はそれが間違いなく加算できると思う。 –

+0

私はRubyについてはあまりよく分かりませんが、その動的言語なので、確かにこのようなことに適しています。あなたが与えるタイミングは、文脈なしでは非常に有益な情報ではありません...私はあなたの方法が何をしているのか、どのようにあなたのテストを行ったのか分かりません。 –