Types are moving to the right
如果你看一眼上世紀(2000年以前)設計現在依舊流行的靜態程式語言,你會發現其中的大多數,同時也是更受還原和主流的語言,比如說 C 語言(約 1972 年),C++(1985 年),還有 Java(1995 年),將型別寫在名字的左邊:
Dog fido = ...
^^^ ^^^^
Type Name
複製程式碼
當你編寫大量宣告時,閱讀起來也很好:
int count = ...
double average = ...
List<String> strings = ...
Map<Warehouse, List<OrderItem>> items = ...
複製程式碼
然而,如果你看一下二十一世紀設計的現代語言,你不禁會發現,一些受歡迎的語言越來越多地將型別放在名字的右邊:
為什麼會發生這種事情呢?對於已經習慣於上世紀 type-name 風格的開發者而言,這似乎有點奇怪,但是現代語言設計者們仍然會冒著打破傳統的風險這樣做。難不成他們都是 Pascal 粉絲?
這裡有一個是似而非的解釋。最初,這和 Pascal(約 1970 年)的歷史原因甚至 Visual Basic(1991 年)無關,真正的原因其實是我們進入了型別推導(type inference)的時代。
型別推導,曾是程式語言設計中的一個小眾特色,現在卻成為主流。它現在也出現在我們的舊程式語言中,我們可以通過使用 var
和 auto
關鍵字來省略型別。甚至在已有的程式語言中,我們也開始看到這樣的程式碼:
var count = ...
var average = ...
var strings = ...
var items = ...
複製程式碼
哇!這看起來很好而且對齊。但是當型別推斷型別過於複雜,或需要偶爾拼寫出讓人類讀者理解時會發生什麼?看:
var count = ...
var average = ...
var strings = ...
Map<Warehouse, List<OrderItem>> items = ...
複製程式碼
呃...這會打破整個程式碼閱讀流程。因此,如果你處於型別推導時代,正在從頭開始設計一門程式語言的話,然後你通過在名字右側放置一個可選的型別批註解決了上述問題:
var count = ...
var average = ...
var strings = ...
var items: Map<Warehouse, List<OrderItem>> = ...
複製程式碼
現在程式碼看起來又很棒了。這實際上就是 Scala (2004, F# (2005), GO (2009), Rust (2010), Kotlin (2011), TypeScript (2012) 和 Swift (2014) 這些程式語言做的事情。這些程式語言之間存在許多語法差異,但是有一點是共同的——先名稱後型別的順序:
fido Dog
^^^^ ^^^
Name Type
複製程式碼
這種編寫程式碼的方式現在正在興起,它未來會成為主流嗎?現在很難說一定會如此,但從趨勢上看起來會是這樣。
更多
儘管年代久遠,我仍然認為 Java 是二十一世紀最偉大的語言之一。瞭解更多請閱讀 "Tribute to Java"
如果你喜歡這個故事,那麼你也可能喜歡我另一個故事 "Dealing with absence of value".