布尔参数 - 我应该命名吗?

时间:2013-10-25 13:48:40

标签: coding-style

所以我只是遇到了一些类似的代码:

checkCalculationPeriodFrequency("7D", "7D", SHOULD_MATCH);

checkCalculationPeriodFrequency("7D", "8D", SHOULD_NOT_MATCH);

让我们不要担心代码现在(或者实际上)的代码所做的事情,而是让我们担心最后一个参数 - SHOULD_MATCH和SHOULD_NOT_MATCH

我之前想到的东西,但想到可能是“坏事”(因为“坏”在后现代主义世界中具有任何真正意义)。

以上,声明了这些值(正如您所假设的那样):

private boolean SHOULD_MATCH = true;
private boolean SHOULD_NOT_MATCH = false;

我不记得读过关于“命名”传递给方法调用的布尔参数以简化可读性,但它确实有意义(为了便于阅读,但是,它也隐藏了价值,如果只是一点点)。这是其他人发现的风格的东西是Instagram还是喜欢,soooo facebook?

4 个答案:

答案 0 :(得分:5)

命名参数有助于提高可读性,尤其是当替代方法通常类似于

checkCalculationFrequency("7D",
                          "8D",
                          true /* should match */);

这很难看。具有特定于上下文的常量可以解决此问题。

我实际上更进一步,重新定义函数原型以接受enum代替:

enum MatchType {
    ShouldMatch,
    ShouldNotMatch
};

void checkCalculationFrequency(string a, string b, MatchType match);

我更喜欢这个布尔值,因为它可以让你灵活地扩展函数以便以后接受其他MatchTypes

答案 1 :(得分:3)

我建议你不要这样做。

首先,对于每个对象,重新生成两个成员SHOULD_MATCH和SHOULD_NOT_MATCH。这并不好,因为它不是对象的行为。所以你要使用的是,至少将其描述为STATIC FINAL。

其次,我更喜欢使用枚举,因为你可以完全控制参数的值,即当你使用它时,你必须使用SHOULD_MATCH或SHOULD_NOT_MATCH,而不仅仅是真或假。这也增加了可读性。

问候。

答案 2 :(得分:1)

确实是为了可读性。这个想法是函数调用的读者可能不会立即知道函数调用中true值的含义,但SHOULD_MATCH会立即传达含义(如果需要查找实际值,你可以这么做而不费力。)

如果函数调用中有多个布尔参数,这就更容易理解了:true意味着什么?

此逻辑的下一步是为参数值创建命名对象值(例如,通过枚举):您不能将错误的值传递给函数(例如,在三个布尔参数的示例中,没有什么能阻止我传递在SHOULD_MATCH中为所有这些,即使它对于该函数在语义上没有意义)。

答案 3 :(得分:1)

这绝对不仅仅是一种风格。

我们有一个类似的系统,它以布尔值1或0的形式从交换机获取输入,这与true或false非常相似。

在这个系统中,我们声明变量OPEN = true和CLOSED = false *并将它们传递给根据开关状态执行不同操作的函数。现在,如果有人碰巧以不同的方式连接开关,那么我们现在可以在OPEN时获得值0,在CLOSED时获得1。

通过命名布尔变量,我们可以轻松地调整系统,而无需在整个过程中更改逻辑。代码变成了自我记录,因为开发人员可以更清楚地看到在哪种情况下采取的操作,而不必担心会带来什么价值。

当然,布尔值的真正目的应该记录在其他地方,并且它在我们的系统中......诚实......

*(也许我们使用OPEN,我打算忘记)