是否应该经常跳过捷径,简洁和聪明,以支持清晰度?

时间:2010-11-21 18:40:13

标签: c++ c coding-style

看到这段简单的代码后,我想到了这个问题:

if (!x%y)
{
    // do something
}

也许这是早期C书(K& R?)的影响,但如果不是那么可爱的话,不是以下总是首选吗?

if (x%y != 0)
{
    // do something
}

8 个答案:

答案 0 :(得分:7)

This quote回答了您的问题。

  

“调试是写入的两倍   代码首先。   因此,如果您将代码编写为   尽可能巧妙地,你是   定义,不够智能调试   它。“ - Brian W. Kernighan

答案 1 :(得分:5)

您确定该代码吗? !x%y表示(!x)%y,因为!%更紧密。

(仅凭这个原因,我更喜欢x % y != 0。)

答案 2 :(得分:5)

首先,每个人都注意到(!x%y)不等同于(!(x%y))的道具,但更重要的是,它们都不等同于:

if (x % y != 0)

有一个更好的形式:

if (x % y)

我个人尝试不使用==0替换!而不引入过多的括号,我绝对不会使用!=0,但这是一个讨论,开始火焰战争。 : - )

答案 3 :(得分:2)

更喜欢简洁明了。第二个例子x % y != 0更清楚。

当然,构成清晰度的内容有点主观,但我更喜欢为布尔变量或返回布尔值的函数保留一元!运算符。

当我编写代码时,我通常会尝试衡量清晰度的方式是问自己:如果1)其他人写的话,我会轻松地阅读和理解这一行吗?2)我必须在2年后再次阅读它这条线。

答案 4 :(得分:2)

应该跳过聪明才智。它不聪明......或者更重要的是可维护。

捷径和简洁可能会或可能不会被接受:我们都采取捷径,但几乎有“行业标准”的捷径,因为我们都这样做。虽然没有聪明的捷径

答案 5 :(得分:1)

在我看来,Clarity每天都在赢得简洁。我有时觉得编写代码如:

if(!(x = func(y)) && ++z == x)

...相当于汽车上更快的条纹。它可能感觉很快,但事实并非如此。我也不认为使用难以理解的变量名(例如在上面的例子中)来节省打字是一个好主意。

这里有什么好处:

for(int x(0) x < managers.size(); ++x)
    managers[x]->initialise();

或:

for(int mgr(0); mgr < managers.size(); ++mgr)
    managers[mgr]->initialise();

他们都做了同样的事情,有人可能会认为让mgr更清楚是没有意义的(甚至有其他论据要说mgr应该更清楚 :)) 。但是,如果这部分例程变得更复杂,那可能非常重要:

for(int mgr(0); mgr < managers.size(); ++mgr)
{
    for(int dependentMgr(0); dependentMgr < managers[mgr].dependents().size(); ++dependentMgr)
    {
        // init these first
    }
}

显然,这不是关于是否使用迭代器的讨论,而是仅仅是否应该使用明确的名称。

当我查看一段我以前从未见过的代码时,变量名称就是一切。当我看到tmptempt2以及vec2时,我感到畏缩。它们毫无意义。

严重的是,如果你担心自己打字的数量,那就得到一个自动完成的IDE,或者去斐济养鸡:)

答案 6 :(得分:1)

实际上,如果你想让你的代码自我记录(Martin Fowler Style),你可以使用更详细的:

every_player_gets_equal_points = x%y;
if (!every_player_gets_equal_points) { //Some players get more: now base on completion time

答案 7 :(得分:0)

您提供的第一个代码段,...

if (!x%y)
{
    // do something
}

...没有意义,因此很可能不正确,因为!x%y等同于!x,除了y等于-1,0或1的情况,并且y等于0,它是未定义的行为(即%y通常没有意义)。

其他人已经说过,第一个片段并不等同于第二个冗长的片段。但是,人们可能想知道哪个片段表达了意图。我的观点是,第一个片段并不等同于任何可能正确的内容。

所以这很好地说明了清晰度是一个好主意。

干杯&amp;第h。,