2011-06-28 18 views
0

パラメータを持つメソッドを使用するコードをリファクタリングしていました。私は特にパラメータを打ち消すわけではありませんが、私がやっていることに対して、私は値のうちの2つ以上を必要とすることはめったにありません。一般的なデリゲートの拡張メソッド

私は、私が言っての簡単な方法たかっ

同じシグネチャ "のボイドGetThings(アウトTの事、アウトx、y)は" と半ダースのメソッドを持っている "GOTY = NewMethod(Tの事を)"

私はこれを思いついた。フォローする質問:

[TestFixture] 
public class TestsBase 
{ 
    [Test] 
    public void Test1() 
    { 
     Del.ImaExtMethod(2); 
     Del2.ImanotherExtMethod(2); 
    } 

    public static MyDel Del = TestTest; 
    public static MyDel2<int> Del2 = TestTest; 

    public static void TestTest(int input, out int output) 
    { 
     output = input * 2; 
    } 
} 

public delegate void MyDel(int input, out int output); 
public delegate void MyDel2<T>(T input, out T output); 

public static class TestExts 
{ 
    public static int ImaExtMethod(this MyDel del, int input) 
    { 
     int result; 
     del(input, out result); 
     return result; 
    } 

    public static T ImanotherExtMethod<T>(this MyDel2<T> del, T input) 
    { 
     T result; 
     del(input, out result); 
     return result; 
    } 
} 

今、私は少し裂けています。一方ではそれは合理的にエレガントな解決策です。一方、このスタイルを以前に見ていないのであれば、それは直感的ではありません。

だから私はそれをもう一度切り取って何か他のことをする前にあなたの考えは何ですか?上記のリファクタリングにどのように取り組んでいますか?私の3番目の選択肢は、すべてのoutパラメータがプロパティを設定しているペイロードクラスを返すことです。 ?、個人/

答えて

2

:それは私が上記の何をやったかよりも、おそらく明確だが、あまり...楽しさを感じている...

はい、私は「クラリティは、簡潔さを切り札」と言って続けて同じ人です私はあなたがしたことと似たようにするのがはっきりしていると思いますが、拡張メソッドの使用を避けるべきです。これは、明示的なデリゲートの参照にあなたの方法を割り当てる必要がないという利点があり、そのあまり楽しいけれども、個人的に私は、その方が読みやすいと思う:

public delegate void SingleInDualOut<TIn, TOut, TOut2>(TIn input, out TOut out1, out TOut2 out2); 

public static class DelegateHelper 
{ 
    public static TOut FirstOutputParam<TIn, TOut, TOut2>(SingleInDualOut<TIn, TOut, TOut2> del, TIn input) 
    { 
     TOut out1; 
     TOut2 out2; 

     del(input, out out1, out out2); 

     return out1; 
    } 

    public static TOut2 SecondOutputParam<TIn, TOut, TOut2>(SingleInDualOut<TIn, TOut, TOut2> del, TIn input) 
    { 
     TOut out1; 
     TOut2 out2; 

     del(input, out out1, out out2); 

     return out2; 
    } 
} 

public static class DelegateTest 
{ 
    public static void TestMethod(int input, out int output1, out int output2) 
    { 
     output1 = input * 2; 
     output2 = input * 3; 
    } 
} 

を、このようにそれを呼び出します

DelegateHelper.FirstOutputParam<int, int, int>(DelegateTest.TestMethod, 1); 
+0

ええ、はい私はそれがどのように明確になるか見ることができます。さて、私は遊びに行くでしょう。いくつかの点を持って:) – Ian

関連する問題