首选领域专用类型而非原始类型

Prefer Domain-Specific Types to Primitive Types

1999年9月23日,由于地球上的软件错误,价值3.276亿美元的火星气候轨道器在进入火星轨道后失联。该错误后来被称为度量混淆。地面航天站采用的单位是“磅”,而航天器采用的是“牛顿”,导致了地面站将推进器的功率低估了4.45倍。

这只是众多案例之一,如果采用更多更健全的领域专用类型就可避免的软件故障。这也是Ada语言众多特性背后的原理的一个示例,其设计的首要目标之一就是实现嵌入式安全关键软件。Ada拥有强大的类型功能,可以对原始类型和用户自定义类型进行静态类型检查:

1
2
3
4
5
6
type Velocity_In_Knots is new Float range 0.0 .. 500.00;
type Distance_In_Nautical_Miles is new Float range 0.0 .. 3000.00;
Velocity: Velocity_In_Knots;
Distance: Distance_In_Nautical_Miles;
Some_Number: Float;
Some_Number:= Distance + Velocity; -- 此处将会被编译器捕获一个类型错误。

在要求较低的领域中,开发者也能通过应用领域专用类型获益,否则他们就会继续使用语言或库提供的原始数据类型,如strings或floats。在Java、C++、Python以及其他现在语言,抽象数据类型被理解为class。采用诸如Velocity_In_KnotsDistance_In_Nautical_Miles的累定义会给代码质量方面增添价值:

  • 由于不是简单的Float或String,领域的概念可以得到体现,这样的代码变得更可读。
  • 由于代码封装了易于测试的行为,这样的代码更具备可测试性。
  • 这样的代码促进了跨平台或系统间的复用性。

这个方法对于静态或动态类型语言的用户也同样有效。唯一的区别是,静态类型语言的开发者可以从编译器获取一些放逐,而那些拥抱动态类型语言的开发者更多的需要依赖于他们的单元测试。检查的方式或许不同,但所展现的初衷是一致的。

其寓意是为了开发高质量软件而开始探索领域专用类型。

0%