一件小事,但我很乐意听到其他人的想法。
以下两个代码段中哪一个是最佳编程习惯?
var results = GetResults();
SendResults(results);
OR:
SendResults(GetResults());
我认为第一个选项更好,但另一方面,选项2是更少的代码来编写(和读取)。你觉得怎么样?
我知道这是一个非常基本的问题,但仍然......
答案 0 :(得分:9)
我通常会选择第一个选项,因为我可以在GetResults
和SendResults
的调用之间插入断点。
如果代码位于方法的中间,通常不是那么大的交易,但如果它的形式为:
return Process(GetData());
GetData
和Process
来电的返回值并不容易看到。除非我们讨论的框架函数没有副作用并且有明显的结果(例如int.Parse),我更喜欢格式:
var data = GetData();
var result = Process(data);
return result;
答案 1 :(得分:5)
此
var results = GetResults();
SendResults(results);
更好,因为它是可调试的...尝试在SendResults(results)
上添加一个breakpoin并观察结果的值。
这非常重要,在 Visual Studio 的下一个版本中, 2013 他们正在添加一种查看函数返回值的方法(参见例如{{ 3}})
这个新功能允许您在开发人员在调试会话期间跨越或退出函数时检查函数的返回值。当返回值未存储在局部变量中时,这尤其有用。考虑以下嵌套函数示例Foo(Bar());在这个例子中,当你跨过那条线时,你现在可以检查Bar和Foo的返回值。
从编译的角度来看,它们通常是相同的。 IL级别的唯一区别是堆栈中的一个插槽有一些带有变量名称的元信息(results
)或者是无名的。
答案 2 :(得分:4)
在我看来,你必须始终努力澄清,所以我更愿意:
// notice the type not var (unless it's obvious)
IEnumerable<MyClass> results = GetResults();
SendResults(results);
答案 3 :(得分:1)
处理此类问题时的第一个原则应该是可读性(如果不处理某些低级优化)。在您的简单示例中,可读性具有可比性,但请考虑以下代码:
SendResults(GetResults(Sorter, context.GetCurrentPageInfo(userContext), ...);
当然,更清楚的是:
var results = GetResults();
var pageInfo = context.GetCurrentPageInfo(userContext);
...
SendResults(results, pageInfo, ...);
正如其他答案中正确指出的那样,更易读的版本还有一个优点 - 它更容易调试,因为您可以检查所有中间值。
答案 4 :(得分:1)
我个人更喜欢第一个,至少在你调试时你可以检查GetResults()的结果。
我认为这与编程实践无关,而是更个人风格。
答案 5 :(得分:1)
var results = GetResults();
SendResults(results);
是可以接受的,因为它允许使用断点来检查results
的值。某些编程语言不会优化此代码,因此代码检查可能会发出警告,表明变量results
永远不会被修改。 C#
可能会优化,因此没有问题。
代码检查员可能会针对以下示例的低效代码发出警告;
var results = GetResults();
return results;
这取决于语言,我认为C#
在优化时没有问题。
答案 6 :(得分:0)
如果你在其他任何地方都不需要结果,我的意见是第二种选择更好。它读取速度更快,写入的代码确实更少。但是,它更难阅读,因此正在阅读代码的程序员应该更好并更快地理解事物。
答案 7 :(得分:0)
这完全取决于个人开发者。这是一个非常主观的事情。
就个人而言,我更喜欢第一个版本,因为如果需要,我可以更轻松地逐步调试调试器中的代码。
在TDD(测试驱动开发)的支持者的更狂热的结尾会说它没关系,因为如果你正确地做TDD,你将永远不会使用你的调试器。
我也更喜欢较小的行,所以如果你有一个方法调用传入其他方法调用的结果并且参数列表开始变得过多,那么它就变得非常难以阅读
SendResults(GetResults(arg0, arg1, arg2), SomeOtherMethod(arg3, arg4), arg5);
开始变得非常难以阅读和跟踪所有内容。
最终,这是你的系统和你的系统,所以你发现的风格更容易。
答案 8 :(得分:0)
如果以这种方式使用结果,我可能会寻求另一种解决方案:
class SomeClass
{
private MyClass _results;
}
private void SendResults()
{
... // Implementation which sets _results
SendResults直接从_results获取结果,而不需要GetResults(除非它被其他类使用,所以它将是:
public MyClass Results { get; private set; }
答案 9 :(得分:0)
我知道这已经很老了,但是在Visual Studio 2017中,参数不再需要基于调试的方便性。有一种处理嵌套调用的新方法。在嵌套调用的行上设置断点。遇到断点时,您可以使用“进入特定上下文”菜单(右键单击)命令进入任何级别的嵌套。这将从最内到最外显示呼叫从上到下。这包括lambda函数(例如LINQ谓词)。
答案 10 :(得分:-1)
在我看来它并不重要,但我对第一个有一个小的偏好,因为它使它更容易阅读,并且稍微更容易扩展和维护。更重要的是我认为的一致性。做一个或另一个,但不是两个。
答案 11 :(得分:-1)
两者都可以......这只是你的编程风格和经验的问题......但如果我不得不选择我会选择1.更清晰...