【发布时间】:2012-07-09 09:40:18
【问题描述】:
我们有几个类,其中对成员函数的调用可能会改变状态,有时不依赖于具有默认值的布尔值。
A a;
a.set( "foobar" );
assert( a.changed() == true );
对
A a;
a.set( "foobar", false );
assert( a.changed() == false );
请注意,这些成员函数是虚拟的。我倾向于使用别名来更好地阅读代码,并使私有成员函数仍然允许旧方法,并且只将包装器提供给公众:
a.silentlySet( "foobar" ) {
a.set( "foobar", false );
}
我想这无论如何都会被内联。我知道我可以编写枚举和常量,这也将提高可读性:a.set( "foobar", SILENTLY ); 但我对此感觉不好,因为问题是布尔性质的(做或不做)。另一方面。但是,我想听听您如何处理这种情况。 (我假设我会得到一个“视情况而定”的答案,因为我肯定错过了一些关键细节)接受它吗?
那些成员函数不是经常被调用和使用,但也不是很少。我担心的是,有时您可能会将布尔值误解为silent/not_silent-flag,而这有其他含义。
这也可能具有误导性的示例:
if( b->getData( false ) && something_other )
这可能与b->getData() == false混淆
【问题讨论】:
-
枚举比布尔值好。如果你意思沉默,说“沉默”,不要说“假”。只需要几个
foo(true, false, true, true)调用和随后的错误就可以真正理解二值枚举。 -
并且,枚举声明了新类型。使用类型系统对您有利。
标签: c++ boolean default-arguments member-functions