2010-06-03 23 views
13

假設這些參數都是相同的類型,那麼對於方法的參數數量是否有一個經驗法則?我只是想知道我應該在哪裏畫線,以及我的選擇是什麼(即界面,陣列等)。每種方法的參數數量是多少?

回答

7

我會說這真的取決於你的情況。你對整個集合做些什麼?驗證所有項目或彙總數據,例如?在這種情況下,我將傳入一個IEnumerable作爲單個參數。

傳入大量參數可能是問題分離不好的一個好兆頭(即,您的方法做得太多),但聽起來像在這種情況下,您傳遞了一組明確定義的項來迭代他們以某種方式。鑑於C#3中的集合初始值設定器語法,我會在幾乎所有情況下推薦IEnumerable,而不是像參數Type a, Type b, Type c...那樣。

當然,如果你的參數實際上被區別對待,那麼將它們分開是有道理的,但我會考慮你在這種情況下做了什麼。想到一個簡單的例子就是構建一個樹型數據結構並具有構建節點子項的功能。一個可憐的語法可能是:

Node BuildTree(Node parent, Node child1, Node child2...) 

我可能會追求更多的東西一樣:

void ConstructChildren(this Node parent, IEnumerable<Node> children) 

如果你能提供更多有關你的情況,不過,您要執行什麼樣的邏輯這些參數,可能會更容易看出它是否適合摺疊或重構。

+0

我想採取這些參數,並將它們導出到一個XML文件。我的膝蓋反應只是簡單地把它們全部串起來,但在看了你的例子之後,我認爲最好包括這個類型。這就是說,每個參數都會有所不同。 myCar(Seat bucket,Rims Spinners,Name Hoopdie)儘管可能有多個使用相同類型的參數。 – Ryan 2010-06-03 13:09:01

+1

使用原生XML序列化器還是自定義?無論哪種方式,如果您使用本機串行器或IEnumerable ,假設您有一個基本實體類(您的自定義序列化邏輯所在的位置)(我的經驗是常見的),則可能採用IEnumerable 。 – 2010-06-03 13:35:25

+0

IXMLSerializer和謝謝你! – Ryan 2010-06-03 13:51:59

2

如果您將傳遞未知數量的參數,則應使用varargs或傳遞IEnumerable。當然,有時候您會傳遞相同類型的固定數量的項目。在後一種情況下,固定數字應該遵循方法的目的。

3

我嘗試將其限制爲4左右。有些人說更少,有些人說更多。

以噸參數另一種方法是創建一個操作類,如更換:

func(boo, far, lint, pizza, flags); 

var action = new DoSomethingObject(boo, far, lint); 
action.Food = pizza; 
action.Go(flags); 

這個擁有功能的一些優勢:

  • 如果某些參數是可選的,則可以將它們公開爲屬性(如上面的pizza)。
  • 如果你的函數需要這麼多參數,它很可能會被分解成更小的函數。課堂可以幫助你乾淨地做到這一點。
+0

如果你的API有許多接受許多參數的方法會怎樣?每個方法創建一個「數據容器」類似乎是合適的嗎?這個類的唯一目的是在傳遞給它的匹配方法時使用,而不是別的。 – 2012-05-15 19:24:33

9

Steve McConnell在Code Complete中提到了這一點,理由是研究表明人們一次不能處理七個以上的信息,使得七個常識性的限制在任何實際的地方都是如此。

在該節(178頁第二版)的最後一段中,他寫道:

如果你發現自己一直 通過以上幾個參數的更多,你的程序中 耦合太 緊...如果你傳遞相同的 數據到許多不同的例程,組 例程成一個類,並把 常用的數據作爲類 數據。

1

此外,更大的通話現場的可讀性,你可以使用一個PARAMS參數列表(前面提到的可變參數),所以不是

void ConstructChildren(Node parent, IEnumerable<Node> children) 
.... 
List<Node> children = new List<Node> {child1, child2, child3}; 
ConstructChildren(parent, children); 

我會用

void ConstructChildren(Node parent, params Node[] children) 
... 
ConstructChildren(parent, child1, child2, child3); 

然而,如果在子集合中使用更多的5-6-7項目,參數語法會變得很難看。

相關問題