创建自定义或使用内置类型

时间:2015-06-04 15:19:33

标签: c++

在某些项目中,人们为所有东西创建自定义类型,而在其他项目中,他们只使用整数和浮点数来表示温度,长度和角度。

我可以看到两者的优点和缺点,我想这取决于你正在研究的项目类型,如果是一个好主意或不创建这些类型。

以下是我的想法:

class SomeClass
{
    Physics::Temperature TemperatureOnMoon(Geometry::Distance distanceFromSun);

    Geometry::Area Shadow(Geometry::Angle xAngle, Geometry::Angle yAngle, Geometry::Triangle triangle);
};

Temperature类型将具有Fahrenheit()和Celsius()方法,Area类型将具有带两个Point类型的构造函数,依此类推。

这提供了很好的类型安全性,我认为它提高了可读性,但它也产生了很多依赖性。突然之间,使用SomeClass的每个人都必须包含所有这些其他标题,因此当您的创建单元测试时,您必须做更多的工作。开发所有类型也需要时间。

使用内置类型的方法使用起来更简单,依赖性更低:

class SomeClass
{
    double TemperatureOnMoon(double distanceFromSun);

    double Shadow(double xAngle, double yAngle, double triangle);
};

我的问题是,你在多大程度上创造了这些类型?你想在更大的项目中使用它们吗?是否有针对此类内容的现成库?

1 个答案:

答案 0 :(得分:2)

如果没有必要,我会避免创建新类型。以下是您需要处理的一些问题:

  1. 它隐藏了有关精度的信息 - 就像距离的情况一样,距离是多少?它是一个整数,它是一个浮点数是双倍的吗?
  2. 使用标准库时会遇到问题 - 例如,在使用max(distance1,distance2)的情况下?如何排序距离?你必须明确地创建一个比较函数。它还取决于您如何定义类型。如果它是基本类型的typedef,则可能不需要创建新的比较函数或max函数。但它仍然会令人困惑。但是如果你的距离现在是一个类或一个结构,那么你必须明确地重载所有的运算符,+ - = * .....

  3. 由于您不知道它是浮点类型还是整数,您不知道是否可以安全地使用==来比较2个距离。它们可以是浮点数,如果操作不同,由于精度问题,它们最终会得到与理论上不同的结果。

  4. 要维护的文件数量会更大,构建过程将不再需要更长时间。
  5. 我会创建新类型,如果它们根本不作为原语,你确实想要超载所有运算符或不允许某些运算符。我很难找到一个好的例子,但是一个例子可以是"二进制数"所以如果你将BinaryNumber定义为一个类/结构而不是将它用作一个有意义的整数,因为如果你有一个int binaryNumber1 = 1,binaryNumber2 = 1;在你进行binaryNumber1 + binaryNumber2的过程中你会期望结果是10而不是2,对吧?因此,您将定义BinaryNumber类/结构并重载运算符+ - * / etc。