2013年11月19日

Review: Functional Programming for Java Developers, Dean Wampler, O'Reilly (函數型程式設計)

Functional Programming for Java Developers

在熟悉結構化與物件導向程式設計後,Java 開發者的學習之路,可以往函數型程式設計(Functional Programming,簡稱 FP)邁進。

過去 Java 開發者比較少接觸 FP,因為 Java API 及多數的 3rd Party Library,都是物件導向的設計,Design Pattern 也是從頭到尾都以 OO 做基礎。

OO 沒什麼不好,它也是目前設計中大型系統必要的方法論,只是在有些情況下,使用 FP 的設計會更好。

作者 Dean Wampler 在第一章,就開宗明義說明 FP 為何更好?主要的原因包括 concurrency 時代來臨,現代連手機都有四核心架構,單一執行緒的程式根本浪費資源。

但是在 OO 世界中做 multi-thread、concurrency、asynchronous,需要有相當經驗的程式設計師,才不會做出效率高但爆炸也快的程式。

舉例來說,List simpleList = new ArrayList(); 很單純地建立一個 List 物件,然後我們也設計標準的 Getter / getSimpleList() 來取得資料。但是試想在多執行緒的世界中,有多個程式同時修改 List 會造成什麼後果?

於是我們看到 Java 創造更多語法來處理同步與非同步,事情變得更加複雜。

另一件 OO 造成的 overhead,是不斷被創造出來的 middleware;很顯然 Object-relational mapping(ORM)就是這麼一回事,為了避免直接使用 Relational Data,讓程式碼更加 OO 且 Type-safe,於是我們不斷創造 Model 去封裝資料,為了簡單的資料存取動作,需要有 Context、EntityManager 等額外的負擔。

我在大學的第一門程式設計課,很幸運地教授不是教我們 Java,而是採用國內比較少見的 Scheme(類似 LISP)程式語言;很早就開始接觸 Functional Programming 的訓練,認識如 High-order procedure 等觀念。

有 FP 的觀念,就更容易理解為何 Java 世界不斷出現 Polyglot 語言;如 Groovy、Scala、Clojure 等,甚至在 JVM 環境寫 JavaScript。這些新語言的出現,直接修正了老舊 Java 的不足,把開發者的期待更直接注入。

老舊 Java 的不足,不是開發社群的新鮮事,像 Lambda / Closure 的特性在 Java 8 終於出現,才慢慢讓 Java 更能支援 FP 的設計。

儘管我們有 JVM Polyglot Language 可用,但許多情況如開發 Android App 或設計基礎 API Library,仍免不了直接面對 Java 語言。

談論 Java Hight Performance 與 Concurrency 的書籍不少;但談論 Java Functional Programming 的書卻有限。這本書的出現彌補了一些缺憾,我們終於有一本合適的 Java 書籍,重新認識不同的程式設計方法論如何解決問題。

從 OO 到 FP 的學習之路需要花上不少時間,所以愈早開始起步愈好。學習 FP 的觀念,並不是讓我們丟掉 OO 的舊程式,然後全部重新用 FP 重寫一次,並非如此。

我常說這是一個流行 Hybrid 的時代,電動車不會馬上取代汽油動力車;但開始設計油電混合車勢在必行。程式設計的世界也是如此,Node 的出現不會讓你丟掉手邊的 RoR、PHP、Java EE 程式碼,但如果必要時不懂混搭 Node 的 Socket IO,肯定會浪費更多自己的時間造輪子。

程式設計的觀念也是相同的,FP 讓你可以用另一種角度思考程式如何設計,就像你需要有 OO 的觀念才能寫好 Java。在可以預見的未來,缺乏 FP 的觀念,可能讓你無法跟上時代演變的腳步。

Buy "Functional Programming for Java Developers" from O'Reilly Book Store


By lyhcode, an article for O'Reilly blogger review program.

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!