書籍代碼

2007 年 12 月 4 日

如今我寫的生產程式碼不多,但我仍花費相當多時間撰寫程式碼。這些程式碼是一種特殊的程式碼形式,用於說明書中的概念。書中程式碼與實際程式碼不太相同,在撰寫時需要考慮一些不同的因素。

一個問題是語言選擇。我需要使用大多數讀者都能閱讀和理解的語言來撰寫程式碼。我嘗試撰寫與平台無關的概念,但我需要程式碼精確。因此,我需要選擇一些廣泛易讀且人們可以理解的語言。

在我早期,兩種最大的 OO 語言是小語和 C++。兩者都有缺點,小語對非小語使用者來說太奇怪,而 C++ 則有太多需要正確處理的尖銳邊緣。Java 對我來說簡直是天賜良機。任何有 C/C++ 背景的人都可以閱讀它。甚至大多數小語使用者都可以捏著鼻子理解我在編寫什麼程式碼。這就是重構書使用 Java 的原因。

後來出現了 .NET。這裡的好處是 C# 與 Java 大多相同,因此我可以相當互換地使用這兩種語言。我喜歡同時使用這兩種語言來強調我所撰寫的概念在兩種情況下都有用。

如今,這種情況變得更加困難,特別是在撰寫有關 特定領域語言 時。Java 和 C# 正在分歧,而我想說明的一些事情需要它們都沒有的功能。我在 Ruby 中進行許多個人程式設計,它非常適合 DSL,因此在這種情況下,我會將 Ruby 作為我的首選。但其他語言也有貢獻。我需要平衡說明各種語言的 DSL 功能,避免讓這本書成為語言瑣事的雜燴。

書中程式碼的另一個問題是要小心使用語言的模糊功能,其中模糊是指對我的普通讀者而言,而不是對我正在使用的語言流利的人而言。一個很好的例子是,當我使用 Ruby 撰寫範例時,我經常迴避使用 集合管線,即使我在自己的 Ruby 程式碼中大量使用它們。這是因為我認為來自大括號背景的程式設計師會發現更難理解這些類型的表達式。因此,我犧牲流利的 Ruby 以接觸這些讀者。

對於 DSL 書籍而言,這又更困難了。內部 DSL 傾向於濫用原生語法以獲得可讀性。許多這樣的濫用都涉及語言的古怪角落。我必須再次平衡顯示可讀的 DSL 程式碼與沉溺於怪癖之間。