【问题标题】:Enabling usage of feature with boolean variable and value使用布尔变量和值启用功能的使用
【发布时间】:2019-07-07 05:36:57
【问题描述】:

有时在实现某种算法的类中,我希望用户能够启用或禁用某些功能,比如缩放某些输入值。有时我会看到以下代码(在构造函数中设置了 bool/float 值):

class A
{
private:
  bool enableScaling;
  float scaleFactor;

public:
  float foo(float x) const {
    ...

    if(enableScaling) {
      x *= scaleFactor;
    }

    ...
  }
};

我不清楚为此目的的两个变量,我正在寻找针对这种情况的建议。

在规模的情况下,我可以完全省略布尔变量并设置默认scaleFactor = 1.0f(中性),我想这对我来说没问题。有时“特征参数值”只能是正数,所以我可能会将其默认值设置为 -1 以表明该参数已禁用,但有时情况并非如此(所有值都允许)。

一般情况下您的处理方法是什么?

【问题讨论】:

  • 如果您没有enableScaling 变量,则必须始终进行乘法运算。即使scaleFactor 等于1.0,编译器也无法知道它,因此无法对其进行优化。检查布尔变量几乎总是比您要启用/禁用的任何操作更有效。更不用说可选处理并不总是那么简单,所以可能没有任何可能的默认值可以使用。
  • Software Engineer SE 中可能有更多的主题。
  • 是的,@FranklinYu,但不确定

标签: c++ oop architecture


【解决方案1】:

您可以将enableScalingscaleFactor 折叠成std::optional<scaleFactor>

这是 C++17 的方式。

在此之前,boost::optional 是一个选择。

在您的特定情况下,默认 scaleFactor1.0f 是一个选项,因为将 float 乘以 1.0f 必须通过 IEEE754 标准保留原始 float(假设您的平台符合该标准)。

【讨论】:

    【解决方案2】:

    一般情况下您的处理方法是什么?

    这不能一劳永逸地回答,这取决于情况,可能的其他选项可以改变你的班级的行为等(正如你已经说过的,整数值-1 可能有意义表明一种特殊情况,如果有效范围是正数或非负数)。

    但是,您描述了一个可以以统一方式处理的常见场景,即,您有一个特定的值,可以更改您的类的行为,但前提是它已设置/存在。在这种情况下,使用一个std::optional(或者,如果你不能使用C++17,boost::optional)数据成员来存储有问题的值(或者不是)。它为您的数据成员添加了一个空状态,准确地表达了您想要实现的目标:如果该值存在,则使用它,否则,不要。这更具表现力,因为它记录了您的意图,而不是依赖于特定的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多