Einar Landre
火星氣候軌道器的教訓#
1999 年 9 月 23 日,價值 3.276 億美元的**火星氣候軌道器(Mars Climate Orbiter)**因為軟體錯誤而失聯。這個錯誤後來被稱為 metric mix-up:
- 地面站軟體使用磅(pounds)作為單位
- 太空船預期接收的是牛頓(newtons)
- 導致地面站低估了推進器的推力,偏差倍數達 4.45
這是一個本可透過更強的型別系統來避免的軟體失誤。
領域特定型別的力量#
以 Ada 語言為例,它具有強型別檢查,支援基本型別和使用者自訂型別:
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;如果嘗試將 Distance 與 Velocity 相加,編譯器會將其視為型別錯誤而阻止。
現代語言中的應用#
在 Java、C++、Python 等現代語言中,抽象資料型別以 class 的形式存在。使用像 Velocity_In_Knots 和 Distance_In_Nautical_Miles 這樣的類別,而非單純的 Float 或 String,能大幅提升程式碼品質:
- 更易讀:程式碼表達的是領域概念,而非只是基本型別
- 更易測試:程式碼封裝了可測試的行為
- 更易重用:跨應用程式和系統的重用更加容易
靜態與動態型別語言皆適用#
這個方法對靜態型別和動態型別語言都同樣有效:
- 靜態型別語言的開發者從編譯器獲得幫助
- 動態型別語言的開發者更依賴單元測試
- 檢查方式不同,但動機和表達風格相同
開始探索**領域特定型別(domain-specific types)**來開發高品質軟體。不要讓原始型別成為隱藏領域錯誤的溫床。