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

Creating custom or using built in types

本文关键字:内置 置类型 自定义 类型 创建      更新时间:2023-10-16

在一些项目中,人们为所有东西创建自定义类型,而在其他项目中,他们只是使用int和float来表示温度,长度和角度。

我可以看到两者的优点和缺点,我想这取决于你所从事的项目类型,是否创建这类类型是一个好主意。

我是这么想的:

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. 它隐藏了关于精度的信息——就像在距离的情况下,距离可以是什么?是整型,是浮点型还是双精度型?
  2. 您将在使用标准库时遇到问题-例如,您可以使用max(distance1, distance2)吗?排序距离呢?您必须显式地创建一个比较函数。这也取决于你如何定义你的类型。如果它是基本类型的类型定义,则可能不需要创建新的比较函数或max函数。但它仍然会令人困惑。但是,如果您的Distance现在是一个类或结构,那么您将不得不显式重载所有操作符,+ - = *.....

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

  4. 要维护的文件数量将更大,构建过程将不必要地更长。

如果它们作为基本类型根本没有意义,并且您确实想重载所有操作符或不允许某些操作符,那么我会创建新类型。我正在努力寻找一个很好的例子,但一个例子可以是"一个二进制数",所以如果你定义一个BinaryNumber作为一个类/结构体,而不是使用它作为一个整数,这将是有意义的,因为如果你有一个int binaryNumber1=1, binaryNumber2=1;在这个过程中你用binaryNumber1+binaryNumber2你会期望结果是10而不是2,对吧?因此,您可以定义一个BinaryNumber类/结构体并重载操作符+ - */等。