9

A small thing, but I will be happy to hear what other people think about it.

Which of the 2 code segments below is the best programming practice?

var results = GetResults();

SendResults(results);

OR:

SendResults(GetResults());

I think that the first option is better, but on the other hand option 2 is less code to write (and read). What do you think?

I know it's a very basic question, but still...

4

12 回答 12

9

我通常选择第一个选项,因为这样我可以在 和 的调用之间插入一个GetResults断点SendResults

如果代码位于方法的中间,通常没什么大不了的,但如果它的形式是:

 return Process(GetData());

GetData和调用的返回值Process都不容易看到。除非我们谈论的是没有副作用且结果明显的框架函数(例如 int.Parse),否则我更喜欢以下格式:

var data = GetData();
var result = Process(data);
return result;
于 2013-08-15T10:04:08.730 回答
6

这个

var results = GetResults();
SendResults(results);

更好,因为它是可调试的...尝试设置断点SendResults(results)并观察结果的值。

这非常重要,以至于在下一版本的Visual Studio 2013中, 他们添加了一种查看函数返回值的方法(例如,请参见此处

当开发人员在调试会话期间跳过或退出函数时,此新功能允许您检查函数的返回值。这在返回值未存储在局部变量中时特别有用。考虑以下嵌套函数示例 Foo(Bar()); 在本例中,当您越过该行时,您现在可以检查 Bar 和 Foo 的返回值。

从编译的角度来看,它们通常是相同的。IL 级别的唯一区别是堆栈中的插槽具有一些元信息,带有变量的名称 ( results) 或者是无名的。

于 2013-08-15T10:06:43.747 回答
4

在我看来,您必须始终争取清晰,所以我宁愿拥有:

// notice the type not var (unless it's obvious)
IEnumerable<MyClass> results = GetResults();

SendResults(results);
于 2013-08-15T10:04:13.450 回答
1
var results = GetResults();
SendResults(results);

可以接受,因为它允许使用断点检查results. 某些编程语言不会优化此代码,因此代码检查可能会发出警告,指出该变量results永远不会被修改。C#可能会优化所以没有问题。

对于以下示例,代码检查员可能会针对低效代码发出警告;

 var results = GetResults();
 return results;

这取决于语言,我认为C#优化它没有问题。

于 2013-08-15T10:08:17.387 回答
1

处理此类问题的首要原则应该是可读性(如果不处理一些低级优化)。在您的简单示例中,可读性是相当的,但请考虑如下代码:

SendResults(GetResults(Sorter, context.GetCurrentPageInfo(userContext), ...);

当然,更清楚的是:

var results = GetResults();
var pageInfo = context.GetCurrentPageInfo(userContext);
...
SendResults(results, pageInfo, ...);

正如其他答案中正确指出的那样,更具可读性的版本还有一个优势 - 更容易调试,因为您可以检查所有中间值。

于 2013-08-15T10:04:59.610 回答
1

我个人更喜欢第一个,至少在调试时可以检查 GetResults() 的结果。

我认为这与编程实践无关,而是更个人化的风格。

于 2013-08-15T10:05:33.693 回答
0

这实际上取决于个人开发人员。这是一件很主观的事情。

就个人而言,我更喜欢第一个版本,因为如果需要,我可以更轻松地在调试器中单步执行代码。

在更狂热的 TDD(测试驱动开发)的支持者会说这没关系,因为如果您“正确”地执行 TDD,您将永远不会使用您的调试器。

我也更喜欢更小的行,所以如果你有一个方法调用传递了其他方法调用的结果并且参数列表开始变得过多,那么它就会变得非常难以阅读

SendResults(GetResults(arg0, arg1, arg2), SomeOtherMethod(arg3, arg4), arg5);

这开始变得非常难以阅读和跟踪所有内容。

归根结底,它是您的系统和您的维护,所以无论您发现什么风格都更容易。

于 2013-08-15T10:07:31.420 回答
0

如果以这种方式使用结果,我可能会寻求另一种解决方案:

class SomeClass
{
    private MyClass _results;
}

private void SendResults()
{
   ... // Implementation which sets _results

SendResults 直接从 _results 获取结果并且不需要 GetResults 的地方(除非它被其他类使用,所以它是:

public MyClass Results { get; private set; }
于 2013-08-15T10:09:54.577 回答
0

如果您在其他任何地方都不需要结果,我的意见是第二种选择更好。它的读取速度更快,并且确实需要编写更少的代码。但是,它更难阅读,因此阅读您的代码的程序员应该更好并且更快地理解事物。

于 2013-08-15T10:06:16.557 回答
0

我知道这已经很老了,但是在 Visual Studio 2017 中,这个论点不再需要基于易于调试。有一种处理嵌套调用的新方法。在嵌套调用的行上设置断点。当断点命中时,您可以使用 Step Into Specific 上下文菜单(右键单击)命令进入任何级别的嵌套。这将从最里面到最外面显示从上到下的调用。这包括 lambda 函数(例如 LINQ 谓词)。

在此处输入图像描述

于 2018-08-22T12:54:33.023 回答
-1

在我看来,这并不重要,但我对第一个有一点偏好,因为它使它更容易阅读,并且更容易扩展和维护。在我看来,更重要的是一致性。做一个或另一个,但不要两者都做。

于 2013-08-15T10:04:28.693 回答
-1

两者都可以...这只是您的编程风格和经验的问题...但是如果我必须选择,我会选择选项1。更清晰...

于 2013-08-15T10:04:40.023 回答