创建临时变量以增强可读性

时间:2010-08-05 04:43:23

标签: optimization variables

我想知道为在小范围内多次访问的值创建临时变量是否存在任何明显的缺点。

例如:

filep->waypt[rp->leg[j]].ID

(*(filep->route + filep->nroutes - 1))->number

这些是最近一个项目的例子,我强迫自己避免几乎任何变量引用的简化,以便用C指针提高我的技能(这很痛苦)。然而,习惯似乎坚持。我发现我尝试引入变量以简化代码(可读性和打字量)越多,就越难以清楚地记住每个新变量引用的内容。

我只是在教育环境中审查过我的代码,我想知道其他人更容易理解的内容以及性能权衡(如果有的话)。

什么时候分配一个值的内存地址需要几个算术运算来计算它自己的变量start会导致性能问题?如果在循环中完成一次会有所作为吗?一次嵌套循环怎么样?如何在循环中为其自己的变量赋值,但是在内循环中访问它?

这会如何改变解释语言? 用PHP说(请原谅语法错误,我是PHP的新手):

$employees[$i][$phone]['Home']['number'];

VS

$home = $employees[$i][$phone]['Home']['number'];

最后,如果它不太主观(代码可读性不应该!),这被认为是编写可读代码的最佳实践?我编写尽可能自我记录的代码,但如果变量开始变得过于人为并被多次引用,我将为它们分配自己的变量。然而,这对我有用的原因可能是我已经习惯了自己的风格。

3 个答案:

答案 0 :(得分:9)

任何体面的编译器都有可能检测到常见的子表达式并为您优化它们。

但是,如果它提高了我的代码的可读性,我会选择一个临时变量,尽管它引入了额外的存储空间(尽管很少)。

我认为代码的可维护性比微小的存储更重要。通过(人为的)例子,我可能会取代很多:

item[last_item-1].id = 14860;
item[last_item-1].name.first = "pax";
item[last_item-1].name.last = "diablo";

拨打电话:

tItem lastItem = &(item[last_item-1]);
lastItem->id = 14860;
: : :
// and so on.

至于解释型语言,我对此的了解较少。我对如何优化汇编代码知之甚多(虽然远不及编写编译器的半神半导体,这就是我通常把它留给他们的原因)。我对大多数解释器中运行的虚拟机知之甚少。

但是为了便于阅读,我仍然仍然代码。我不希望在代码中看到大量$employees[$i][$phone]['Home']['number']个代码段。我宁愿添加

$homePhone = $employees[$i][$phone]['Home']['number'];

在某处,从那时起只使用$homePhone

答案 1 :(得分:1)

我强烈建议您将变量用于完全重用的值。关键是使用实际描述您正在使用值的变量名称或值是什么。同时使用变量来存储值然后使用变量使得将来修改更容易,并且更不容易出错。

以下是一些命名资源,可以帮助您更好地命名变量。另外,不要害怕评论您的代码,以便您知道每个变量,函数,类等是什么意图。 Microsofts Naming guidelines

Stackoverflow Post on PHP naming guidelines

更新:删除了我的示例,因为它在下面的评论中指出是错误的。我仍然建议在函数中重用的值使用变量,因为它提高了可读性和可维护性。

答案 2 :(得分:1)

使用它们以提高可读性,并且当您知道调用返回临时变量值的方法时也很昂贵(例如,当您从外部机构请求信用评分时,可能会导致性能损失和成本)。

在某些情况下,我不仅引入了临时(也称为本地)变量以提高可读性,但有时我甚至会为单行代码提取方法(通过重构工具支持),如果方法名称更容易理解代码是什么约。

当且仅当系统行为正确但速度不够快时,我会调查性能。这样我就可以避免优化尚未处于最终形式或首先不需要优化的代码。