这是一个小事,但我会很乐意听听其他人对它的看法。
以下两个代码片段中哪个是最佳编程实践?
var results = GetResults();
SendResults(results);
或者:
SendResults(GetResults());
我认为第一个选项更好,但另一方面,选项2需要编写(和阅读)的代码较少。你怎么想?
我知道这是一个非常基础的问题,但仍然...
这是一个小事,但我会很乐意听听其他人对它的看法。
以下两个代码片段中哪个是最佳编程实践?
var results = GetResults();
SendResults(results);
或者:
SendResults(GetResults());
GetResults
和SendResults
之间插入断点。 return Process(GetData());
在调用GetData
和Process
函数后,它们的返回值并不是直观可见的。除非我们调用的是一个没有副作用且结果显而易见的框架函数(比如int.Parse),否则我更喜欢以下格式:
var data = GetData();
var result = Process(data);
return result;
This
var results = GetResults();
SendResults(results);
使用它更易于调试...尝试在SendResults(results)
上设置断点并查看结果的值。
这非常重要,以至于在下一个版本的Visual Studio(即2013)中,他们正在添加一种查看函数返回值的方法(例如,请参见此处)
这个新功能允许您检查函数的返回值,当开发人员在调试会话期间步过或跳出函数时。当返回值未存储在本地变量中时,这尤其有用。考虑以下嵌套函数示例Foo(Bar()); 在这个示例中,当您步过那行时,现在可以检查来自Bar和Foo的返回值。
从编译的角度来看,它们通常是相同的。在IL级别上唯一的区别是堆栈中的某个插槽具有一些元信息与变量的名称(results
),或者没有名称。
我认为你应该始终追求清晰明了,所以我更喜欢:
// notice the type not var (unless it's obvious)
IEnumerable<MyClass> results = GetResults();
SendResults(results);
SendResults(GetResults(Sorter, context.GetCurrentPageInfo(userContext), ...);
。
var results = GetResults();
var pageInfo = context.GetCurrentPageInfo(userContext);
...
SendResults(results, pageInfo, ...);
正如其他答案所指出的那样,更易读的版本有一个优点 - 更容易调试,因为您可以检查所有中间值。
这完全取决于个人开发者。这是非常主观的事情。
就我个人而言,我更喜欢第一个版本,因为如果需要的话,我可以更容易地通过调试器逐步查看代码。
在TDD(测试驱动开发)的支持者中,有些人会非常狂热地认为这并不重要,因为如果你做TDD“正确”,你永远不会使用调试器。
我也更喜欢较小的行,因此,如果您有一个方法调用,该调用传递其他方法调用的结果和参数列表开始变得过多,那么阅读起来就会变得非常困难。
SendResults(GetResults(arg0, arg1, arg2), SomeOtherMethod(arg3, arg4), arg5);
这开始变得相当难以阅读和跟踪所有内容。
最终,这是你的系统,你需要维护它,所以无论你找到哪种风格更容易就采用哪种。
var results = GetResults();
SendResults(results);
这样做是可以接受的,因为它允许使用断点来检查results
的值。一些编程语言可能不会对此代码进行优化,因此代码检查可能会发出警告,表示变量results
从未被修改。C#
很可能会进行优化,所以没有问题。
对于以下示例,代码检查器可能会发出有关低效代码的警告;
var results = GetResults();
return results;
这取决于编程语言,我认为C#
在优化方面没有问题。
个人而言,我更喜欢第一个选项,因为在调试时您可以检查GetResults()的结果。
我认为这与编程实践无关,更多的是个人风格。
class SomeClass
{
private MyClass _results;
}
private void SendResults()
{
... // Implementation which sets _results
SendResults 直接从 _results 获取结果,不需要使用 GetResults(除非它被其他类使用),因此代码可以简化为:
public MyClass Results { get; private set; }