2011-06-28 65 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