【问题标题】:Creating types with restricted properties创建具有受限属性的类型
【发布时间】:2019-05-18 03:48:39
【问题描述】:

在某些情况下,需要根据某些属性来限制类型的可能值。需要对示例浮点数或数学向量进行归一化。为这些情况创建类并使用运算符重载在类型之间切换是一种好习惯吗?

例如,有一个vector2 和vector2_normalized 类,其中vector2_normalized 的运算符可以改变向量的长度(+、-、标量* 和/、..)返回一个vector2 实例,而其他的返回一个vector2_normalized 实例。然后使用隐式转换在两者之间自动转换。这样必须归一化的向量可以使用这种类型,并且可以消除归一化错误。

【问题讨论】:

  • 请尽量使用伪代码甚至图表来解释抽象概念。正确地提出问题也是自己找到答案的最佳方式之一。

标签: c++ design-patterns architecture


【解决方案1】:

是的

您所说的这些“限制”称为class invariants,类是构造域对象以限制其有效的一种方式。这是使用类的主要动机之一。

Arno Lepsik 最近在 CppCon 2018 上做了一场精彩的演讲,名为 "Avoiding disasters with strongly typed C++"

John Lakos 在 CppCon 2015 上也做了精彩的演讲"Value semantics. It ain't about the syntax"

您的问题的完整答案会很长,所以我希望这个简短的讨论是有用的。

Boost.Units 就是一个很好的例子。

如果您曾经处理过编程科学应用程序,那么您就会知道处理单位是一件很痛苦的事情。

您如何确保数据之间的操作有效?您不想将米添加到英尺,这就是您使火箭坠毁的方式。当您的值使用您的单位进行强类型化时,这样的操作在编译时就变得不可能

【讨论】:

    【解决方案2】:

    是的,这正是我们拥有private 成员的整个概念的原因。 它的存在是为了消除由于无效成员值而可能发生的所有错误。 它通过公开一个接口(重载的运算符和函数)而不是成员本身来做到这一点,以便您可以以受控方式更改这些成员,并相应地调整内部值。

    【讨论】:

      【解决方案3】:

      是的 - 与 AndyG 关于类不变量和域对象的所有内容相呼应 - 有一个警告。

      允许类型之间的隐式转换可能会导致代码累积无提示转换。使用显式转换函数通常会更好。例如,与

      vec2 fun_a();
      vec2 fun_b(norm_vec2 const&);
      vec2 fun_c(norm_vec2 const&);
      

      你可以写

      norm_vec2 v = fun_c(fun_b(fun_a()));
      

      并且不会注意到发生的隐式转换的数量。至少如果转换是显式的,您可以决定编写函数的 norm_vec2 重载,或者如果它不重要,则仅在向量类型上对其进行模板化。

      【讨论】:

        【解决方案4】:

        嗯,有std::stringstd::filesystem::path。但是既没有std::uppercase_string,也没有std::russian_string,也没有任何其他......

        看看这些限制是否对你的特定类的接口产生了巨大的影响。如果限制允许一些全新的操作,在一般类中是不可想象的,那么它当然值得一个具有扩展公共接口的专用类。

        对于将有意义的操作伪装成隐式转换,我肯定会说一个响亮的“不”。如果转换是不可逆的,则更是如此。这样的转换可能看起来很诱人,它可以很好地消除一些由于疏忽而导致的当前错误,但是如果在您甚至没有注意到的情况下发生了不需要的转换,它也可能会引入全新的错误。

        否则这个问题太笼统了......我想没有适合所有情况的解决方案。因此,您应该在每种特定情况下比较利弊。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多