2021-10-16

《Thinking in Java》 的時代眼淚

最近接了一個 Java 家教,目前在上 OO 概念的部份。因為本來就不是靠唸書學會 OO 的(而且也沒學得多好),加上閒來無事,所以拿起塵封已久的《Thinking in Java》中文版(2002 初版)來看一下有沒有啥遺漏的。

等等… 「(p.252) 利用 imports 來改變行為」?這是什麼鬼?書上是這樣寫的:

Java 並不具備 C 的「條件編譯(conditional compilation)」功能。此功能讓你得以切換開關,令程式產生不同行為,無須更動程式碼。Java 拿掉這個功能的原因,可能是因為此功能在 C 語言中多半被用來解決跨平台問題,也就是根據不同的平台編譯程式碼中的不同部份。由於 Java 本身的設計可自動跨越不同平台,所以應該不需要此功能。

不過條件編譯仍具有其他實用價值。除錯便是常用的用途之一:在開發過程開啟除錯功能,在出貨產品中關閉除錯功能。Allen Holub(www.holub.com)提出了以 packages 來模擬條件編譯的想法。根據這一想法,他在 Java 裡頭產生原本在 C 語言中極為有用的 assertion 機制。

基本上就是寫兩個叫做 Assert 的 class、擺在不同 package 下,要出貨的時候把 Assert 的 import 改成空殼 Assert 的路徑。

真的是時代的眼淚阿… [遠目]

其實中文版出版的同一年,Java 1.4 也出了,其中一個重大的改進就是導入 assert

這裡還有個不可靠的印象,就是當年有些人認為:「 assert 導入的太晚,現在用(誕生於 1997 年,正逐漸統治世界 XD) JUnit 就好了」

時至今日,JUnit 勉強算是有用一點,assert 則是從來沒用過,只有在追 GXT 的 source code 有看到過。至於「利用 imports 來改變行為」這事… 連我這種不碰 Spring 的咖小都知道應該要套個 DI 什麼的,而不是去動 import 這種鬼想法…

當然,現在回頭用吐槽的姿態看二十年前的概念實在沒什麼太大的意義,那時本來就還在盤古開天,連 design pattern 都還是浪頭上的顯學,殺個豬公也不是什麼太奇怪的事情,就只能說是時代的眼淚。

BTW… Allen Holub 的網站還在… 不知道當事人還記不記得這段黑歷史… wwwww