所以我只是遇到了一些类似的代码:
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?
答案 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,我打算忘记)