2011-06-28 67 views
0

我正在重构一些使用具有out参数的方法的代码。我并不是特别反对参数,但是对于我在做的事情,我很少需要超过一个值。通用代理的扩展方法

我有一半具有相同签名 “无效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; 
    } 
} 

现在我有点撕裂。一方面,这是一个相当优雅的解决方案,另一方面,如果您之前没有看到过这种风格,那么它不完全直观。

因此,在我再次撕毁并做其他事之前,您的想法是什么?你将如何处理上述重构?我的第三个选择是返回一个有效载荷类,其中包含所有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