簡體   English   中英

限制每種方法的參數數量?

[英]Limit number of parameters per method?

假設參數類型相同,那么方法的參數數量是否有經驗法則? 我只是想知道我應該在哪里繪制線和我的替代品(即接口,數組等)。

史蒂夫麥康奈爾在Code Complete中解決了這一問題,理由是研究表明人們一次無法真正處理超過七個信息塊,在任何實際情況下都會將七個信息作為常識限制。

在該節的結論段落(第二版第178頁)中,他寫道:

如果您發現自己一直傳遞多個參數,則例程之間的耦合太緊......如果您將相同的數據傳遞給許多不同的例程,請將例程分組到一個類中,並將常用數據視為類數據。

我會說這真的取決於你的情況。 你在為整套做些什么嗎? 例如,驗證所有項目或聚合數據? 在這種情況下,我會將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)

但是,如果您可以提供有關您的案例的更多信息,以及您對參數執行的邏輯類型,則可能更容易看出它是否是折疊或重構的良好候選者。

我試着把它限制在4左右。 有人說少說,有些人說更多。

大量參數的替代方法是創建一個操作類,即替換:

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

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

這比功能有一些優點:

  • 如果某些參數是可選的,您可以將它們公開為屬性(例如上面的pizza )。
  • 如果你的函數接受了那么多參數,那么很可能它會做很多事情,並且可以分解成更小的函數。 一堂課幫助你干凈利落地完成這項工作。

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

此外,為了獲得更好的呼叫站點可讀性,您可以使用params參數列表(之前提到的varargs),而不是

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個項目,則params語法會變得難看。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM