在某些项目中,人们为所有东西创建自定义类型,而在其他项目中,他们只使用整数和浮点数来表示温度,长度和角度。
我可以看到两者的优点和缺点,我想这取决于你正在研究的项目类型,如果是一个好主意或不创建这些类型。
以下是我的想法:
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);
};
我的问题是,你在多大程度上创造了这些类型?你想在更大的项目中使用它们吗?是否有针对此类内容的现成库?
答案 0 :(得分:2)
如果没有必要,我会避免创建新类型。以下是您需要处理的一些问题:
使用标准库时会遇到问题 - 例如,在使用max(distance1,distance2)的情况下?如何排序距离?你必须明确地创建一个比较函数。它还取决于您如何定义类型。如果它是基本类型的typedef,则可能不需要创建新的比较函数或max函数。但它仍然会令人困惑。但是如果你的距离现在是一个类或一个结构,那么你必须明确地重载所有的运算符,+ - = * .....
由于您不知道它是浮点类型还是整数,您不知道是否可以安全地使用==来比较2个距离。它们可以是浮点数,如果操作不同,由于精度问题,它们最终会得到与理论上不同的结果。
我会创建新类型,如果它们根本不作为原语,你确实想要超载所有运算符或不允许某些运算符。我很难找到一个好的例子,但是一个例子可以是"二进制数"所以如果你将BinaryNumber定义为一个类/结构而不是将它用作一个有意义的整数,因为如果你有一个int binaryNumber1 = 1,binaryNumber2 = 1;在你进行binaryNumber1 + binaryNumber2的过程中你会期望结果是10而不是2,对吧?因此,您将定义BinaryNumber类/结构并重载运算符+ - * / etc。