對使用多傳回值的一點看法和建議
背景
近期維護的一個項目(基于.net framework 4.0)中,看到了不少使用out關鍵字來傳回多個傳回值的方法,方法的簽名很長很長,
沒用out關鍵字辨別的參數就一兩個,用out關鍵字辨別的參數卻有三四個。
對于多傳回值,不同的人可能會有不同的看法:
- 有的人可能會認為多傳回值根本就不應該存在,一個方法應該最多有一個傳回值就夠了,多了可能就是設計什麼的有問題
- 有的人可能會認為多傳回值很有存在的意義,因為多傳回值很靈活,能适應更多不同場景的設計和業務
簡單的例子
虛拟場景:現在要寫一個方法,這個方法做的事是計算兩個數加減乘除的結果。
用out的做法就是将計算的4個結果,通過用out辨別的參數傳出去。示例如下:
private static void GetResult(int num1, int num2,out int add,out int multi,out int sub, out int div)
{
add = num1 + num2;
multi = num1 * num2;
sub = num1 - num2;
div = num2 == 0 ? 0 : num1 / num2;
}
在調用之前,我們需要先定義4個變量用于接收調用方法要傳出來的4個計算結果,示例如下:
int num1 = 2;
int num2 = 3;
int add, multi, sub, div;
GetResult(num1, num2, out add, out multi, out sub, out div);
Console.WriteLine($"add={add};multi={multi};sub={sub};div={div}");
輸出結果如下:
add=5;multi=6;sub=-1;div=0
這樣的做法是能完成我們定義的場景,但是,一個方法有6個參數,是否有點不盡人意呢?如果沒點注釋或命名不好,估計這幾個參數用來
做什麼的都沒人知道,重要的是如果方法很長很長,不能一眼就看到這些參數的話,估計就會感覺有點迷糊。
在C#4中,有一個新特性 Tuple 很适合用來傳回多個結果,下面來看看針對這個場景的實作:
private static Tuple<int, int, int, int> GetResultWithTuple(int num1, int num2)
{
int add = num1 + num2;
int multi = num1 * num2;
int sub = num1 - num2;
int div = num2 == 0 ? 0 : num1 / num2;
return Tuple.Create<int, int, int, int>(add,multi,sub,div);
}
調用比較簡單,像一般方法一樣,定義一個變量去接收方法傳回的結果即可。不同的是,這個結果包含了多個值,就像一個類有多個屬性那樣。
int num1 = 2;
int num2 = 3;
var res = GetResultWithTuple(num1, num2);
Console.WriteLine($"add={res.Item1};multi={res.Item2};sub={res.Item3};div={res.Item4}");
輸出結果和上面使用out的方法是一緻的。
用這種方法來處理的好處是無論方法内部還是調用都是很簡潔,唯一的缺點就是Item1~Item4,不能見名知意,尤其是不熟悉Tuple這一類型的。
說到多傳回值(Tuple),就不得不提Python了,因為Python中也有相似的東西,同樣的例子,看看Python中如何實作:
def getResult(num1,num2):
add = num1+num2;
multi = num1*num2;
sub = num1-num2;
div = num1/num2 if num2!=0 else 0;
return add,multi,sub,div;
調用如下:
add,multi,sub,div = getResult(2,3);
print(type(getResult(1,2)));
print('add={};multi={};sub={};div={};'.format(add,multi,sub,div))
輸出如下:
<class 'tuple'>
add=5;multi=6;sub=-1;div=0.6666666666666666;
在調用的時候,特地輸出了getResult的類型(tuple),這個類型和C#中的Tuple是一樣的,都是建立的時候就定死了内容,後面不能修改的。
看起來,似乎Python用起來更加簡單哈。
不得不說的是,在最新的C# 7.0中,也已經有了基于Tuple的多傳回值方法,用法和Python的類似,可以說是一樣的了,具體内容如下:
What’s New in C# 7.0
總結
處理多傳回值的方法遠不止隻有out和Tuple兩種,有人會用Dictionary來處理,有人會封裝一個類來處理,有人會用dynamic來處理...
但是我個人是更傾向于用Tuple來處理多傳回值,雖然感覺ItemX不那麼友好,但是除了這點,其他方面還是很好用、很不錯的。不用為了
一個方法特地去定制一個類做為傳回值。更重要的是在7.0的文法中,也是用基于Tuple的實作,是以我又有什麼理由不用呢?
當然要用Tuple也是有個大前提的,那就是.net framework 必須是要4.0或更高的版本,3.5及更低的版本就隻能用其他的辦法了。
最後,就順手将項目中使用了out關鍵字的部分方法重構成了用Tuple作為傳回值,讓這些方法有了更高的可讀性和簡潔性!!
如果您認為這篇文章還不錯或者有所收獲,可以點選右下角的【推薦】按鈕,因為你的支援是我繼續寫作,分享的最大動力!
作者:Catcher Wong ( 黃文清 )
來源:http://catcher1994.cnblogs.com/
聲明:
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。如果您發現部落格中出現了錯誤,或者有更好的建議、想法,請及時與我聯系!!如果想找我私下交流,可以私信或者加我微信。