是否有可能通过括号防止死亡?

时间:2011-08-26 19:56:05

标签: language-agnostic parentheses

偶尔,我会写一些代码的方式比我更喜欢的方法。

 if(!(new Day((((new Date()) / millisecondsPerDay) % 75)) instanceof oldDay))) { 
    // Bonus points if that condition made any sense to you
 }

很难跟踪我需要放多少个括号,特别是当我没有使用IDE时会立刻告诉我什么时候出错了。事实上,我敢打赌上面的例子与括号正确匹配。我已经被括号中的死亡错误所困扰,而不是我想承认的。

我想知道是否有办法绕过这个。我可以使用哪些技术来避免用如此多的括号包装东西?

是否有任何语言的机制可以防止需要这么多括号?例如,我想添加自动关闭括号的特殊字符和自动打开它们的特殊字符可能有所帮助。 (以下示例中为<>

if(!(new Day<new Date()) / millisecondsPerDay) % 75> instanceof oldDay>

5 个答案:

答案 0 :(得分:9)

一种可行的替代方法是在条件循环之前预先计算带括号的值。以您的代码为例:

if(!(new Day((((new Date()) / millisecondsPerDay) % 75)) instanceof oldDay))) { 
    // Bonus points if that condition made any sense to you
 }

让我们开始分手吧。

Date d1 = new Date();
var factor1 = (d1 / millisecondsPerDay ) % 75;
Day day1 = new Day (factor1);

if (!day1 instanceof oldDay) {
// do something
}

请记住,代码是为人类编写的,只有在之后才能执行。如果你发现了巨大的条件,那么就开始对它们进行预处理并将其分解。如果需要一秒多的时间才能弄清楚你的状况是什么,那么它可能太长了。

答案 1 :(得分:2)

嗯,首先,我总是喜欢重构这种代码。如果可以的话,我将部分表达式提取到变量(或函数,无论哪个套件最好),那么你可以对代码本身更有意义,并且你不需要做出如此混乱

bool isOldDay(int someFactor)
{
    if(someFactor instanceof oldDay) 
    {
        return true;
    }
    return false;

}

var today = new Date();
var particularFactor = today/millisecondsPerDay;
var someFactor = particularFactor % 75
var day = new Day(someFactor);


if(!isOldDay(day)) //Do something

编辑:顺便说一句,如果你想做一些没有括号的事情你可以尝试这样的事情:Reverse Polish Notation

你可以将5 + ((1 + 2) * 4) − 3加入到这个东西中:5 1 2 + 4 * + 3 -。当然,这个表格可能非常接近编制者计算的堆栈表示。

答案 2 :(得分:1)

如果我遵循:

var a = new Date() / millisecondsPerDay) % 75
var newDay = new Day(a);

if (! newDay instanceof oldDay) {
   //do something
}

如果您无法读取内联逻辑...只需将其放在多行! ; - )

答案 3 :(得分:1)

很多parens是一个非常好的迹象

  1. 作者不理解该语言的运算符优先级。例如,您已将构造函数调用new Date()包装在一组完全冗余的括号(new Date())中。除非您的语言与任何普通语言不同,否则该前缀new运算符将比几乎任何其他运算符更紧密地绑定。

  2. 作者并不关心可理解性。

  3. 使其更易于理解,可测试和可维护。有人下线(很可能是你,会感谢你......或者诅咒你没有这样做)。

    一些提示:

    • 了解您的语言的运算符优先级。没有正当理由不要添加括号。确实理解运算符优先级的人必须花一些时间来弄清楚为什么你把那些parens放进去了:你在做一些不明显的事情吗?

    • 打破表达。使用堆栈空间(便宜)。

    • 将每个简单的子表达式计算为一个独立的局部变量,并以之前的变量为基础。

    • 使变量名称反映它们代表的内容。

    然后只测试最后的临时。在你的情况下,它看起来像一个布尔值。

    编写这样的代码使其易于掌握(没有复杂的表达式),它使测试变得容易(简单的表达式更容易检查正确性)。它可以更容易识别/定位问题。

答案 4 :(得分:0)

我想说这个问题的答案是否定的,因为所有这些括号的全部意义在于避免表达式的含糊不清。如果删除它们,则表达式可能无法以您认为的方式进行评估。

Ergo,如果有<>这样的构造来修复/添加你丢失的parens,如果不能将它们添加到你期望的位置。

简单示例(就像需要它一样):

(90 / 100 - 1)

...将评估为......

((90 / 100) - 1) // = -0.1

...或...

(90 / (100 - 1)) // = 0.90909090...

......你没有真正的方法知道它会是哪一个。

唯一的选择是移动表达式之外的某些部分,将结果存储在变量中,这样您就可以在表达式中评估较少的部分。