【问题标题】:Improve code readability without performance loss在不损失性能的情况下提高代码可读性
【发布时间】: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


【解决方案1】:

但我对 [在此处使用枚举] 感觉不太好,因为问题在于布尔性质(做或不做)

不,枚举是完美的,使用它。 FWIW,CodeReview 上有another discussion about this case

也就是说,是的,包装函数很可能是内联的。 C++ 就是提供没有运行时成本的抽象。内联函数调用是这方面的基本工具,因此编译器会在适用的情况下使用它。

【讨论】:

  • 我刚加入 Code Review(不知道有这样的 SE 网站),所以任何有适当权利的人都可以将其移至 CR,因为我想它更适合那里。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多