Rub*_*bys 17 local-variables function-parameter
这样的事情(是的,这不涉及一些边缘情况 - 这不是重点):
Run Code Online (Sandbox Code Playgroud)int CountDigits(int num) { int count = 1; while (num >= 10) { count++; num /= 10; } return count; }
你对此有何看法?也就是说,使用函数参数作为局部变量.
两者都放在堆栈上,性能几乎相同,我想知道这方面的最佳实践方面.
当我为这个函数添加一个额外的冗余线路时,我觉得自己像个白痴int numCopy = num,但它确实让我感到烦恼.
你怎么看?这应该避免吗?
Ber*_*t F 17
作为一般规则,我不会将函数参数用作本地处理变量,即我将函数参数视为只读.
在我看来,直观地理解代码对于可维护性是至关重要的,并且修改函数参数以用作本地处理变量往往与该目标背道而驰.我已经开始期望参数在方法的中间和底部具有与顶部相同的值. 另外,一个恰当命名的本地处理变量可以提高可理解性.
尽管如此,正如@Stewart所说,这个规则或多或少取决于函数的长度和复杂性.对于简短的简单函数,例如你所展示的函数,简单地使用参数本身可能比引入一个新的局部变量(非常主观)更容易理解.
然而,如果我要写一些简单的东西countDigits(),我倾向于使用remainingBalance本地处理变量来代替修改num参数作为本地处理的一部分 - 对我来说似乎更清楚.
有时,我会在方法的开头修改一个局部参数来规范化参数:
void saveName(String name) {
name = (name != null ? name.trim() : "");
...
}
Run Code Online (Sandbox Code Playgroud)
我理解这是可以的,因为:
一个.在方法的顶部很容易看到,
湾 参数保持其原始的概念意图,和
C.该参数对于该方法的其余部分是稳定的
然后,有一半时间,我只是倾向于使用局部变量,只是为了得到一些额外的finals(好吧,这是一个不好的理由,但我喜欢final):
void saveName(final String name) {
final String normalizedName = (name != null ? name.trim() : "");
...
}
Run Code Online (Sandbox Code Playgroud)如果,99%的时间,代码保留未修改的函数参数(即,此代码库的变异参数不直观或意外),那么,在其他1%的时间内,在顶部删除关于变异参数的快速评论一个长/复杂的函数可能是一个可理解性的大福音:
int CountDigits(int num) {
// num is consumed
int count = 1;
while (num >= 10) {
count++;
num /= 10;
}
return count;
}
Run Code Online (Sandbox Code Playgroud)PS :-)
参数与参数
http://en.wikipedia.org/wiki/Parameter_(computer_science)#Parameters_and_arguments
这两个术语有时可以互换使用; 特别是,"论证"有时用来代替"参数".然而,存在差异.正确地,参数出现在过程定义中; 参数出现在过程调用中.
所以,
int foo(int bar)
Run Code Online (Sandbox Code Playgroud)
bar 是一个参数.
int x = 5
int y = foo(x)
Run Code Online (Sandbox Code Playgroud)
值x是参数的bar参数.
当我这样做时,我总觉得有点好笑,但这并不是一个避免它的好理由.
您可能想要避免它的一个原因是出于调试目的.当您进行调试的一半时,能够区分"暂存器"变量和函数输入之间的区别非常有用.
我不能说这件事情,来了非常以我的经验往往-而且经常可以发现它的价值引入另一个变量只是具有不同的缘故名字,但如果这是代码,否则清洁最终改变值变量,那就这样吧.
这种情况可以出现并且完全合理的一种情况是你有一些价值意味着"使用默认值"(通常是Java或C#等语言中的空引用).在这种情况下,我认为将参数的值修改为"真实"默认值是完全合理的.这在C#4中特别有用,您可以在其中使用可选参数,但默认值必须是常量:
例如:
public static void WriteText(string file, string text, Encoding encoding = null)
{
// Null means "use the default" which we would document to be UTF-8
encoding = encoding ?? Encoding.UTF8;
// Rest of code here
}
Run Code Online (Sandbox Code Playgroud)
关于 C 和 C++:
我的观点是将参数用作函数的局部变量是可以的,因为它已经是局部变量了。那么为什么不这样使用它呢?
当将参数复制到一个新的局部变量只是为了有一个可修改的变量来使用时,我也觉得很傻。
但我认为这几乎是个人意见。随心所欲。如果你因为这个而觉得自己抄不了参数,说明你的性格不喜欢,那你就不要这样做了。
| 归档时间: |
|
| 查看次数: |
4043 次 |
| 最近记录: |