書摘《Implementation Patterns》

更新於 發佈於 閱讀時間約 4 分鐘
raw-image

這本書在書單中很久了,前陣子有空繞去天龍書局發現有中譯版就買回家來翻翻 (沒錯,買中譯版 XD),一看很合胃口,很快就翻完了,心有戚戚焉的句子很多,特別是在最後一章關於框架設計的部分。

第三章提到三個價值觀:溝通、簡單和靈活,這也是我目前在設計與撰寫程式時考慮的優先順序,我在意的是我寫的這一段程式其他人是否容易看懂?不會刻意去用一些語法讓程式變短,事實上我自己認為讓程式變短不一定讓程式好懂:

程式應該讀起來像一本書一樣。它需要有情節和韻律,句子間應該有優雅的、小小的高低起伏。

所以我在想 Swift 的 method 和參數名稱時,介係詞用的蠻多的,就是希望能讀起來像一般的句子。靈活是放在最後,甚至現在很少想太多了,讓程式簡單好懂先能動,單元測試能過,若遇到真的要改既有的程式時,才開始想怎麼重構讓它變靈活,但也不是什麼都不想,如果知道在不久的未來一定會做的東西,還是會事先規劃一些彈性。

「簡單性和大規模測試所帶來的靈活性」比「專門設計出來的靈活性」更為有效

第五章中提到的很多概念,其實多年研究 Java 的 API 後,自然變成自己的習慣,像是什麼時候用抽象介面,什麼時候用抽象類別,又什麼時候用有版本的介面,那些 method 適合放到 library class,但看過第五章後又有更深的體會了。

Implementation pattern 其實都講些很小的東西,大多是寫程式時,時時要做決定的那種層級的 pattern,像是 delegate 該用什麼方法放入,就有不同的思維,真的很有趣。

將控制流的小片段歸類,讓不想深究的閱讀者先得到一個「抽象的理解」,同時又為需要深入領會的閱讀者提供「更詳盡的細節」。

這大概也是我設計 method 或是將一大段程式切割成數個 method 的原則,並盡量保持 method 顆粒度的一致性的原因了。

它可以告訴閱讀者這段計算的目的何在,讓閱讀者免受實作的影響。閱讀者通常只憑閱讀方法的名稱,就可以一眼分辨出哪些是自己要找的功能。

意圖比實作細節重要,少了意圖,幫忙 code review 的人其實也很辛苦,因為要從實作去猜意圖,但就可能少想到一些該 review 的東西。

呼叫方法是在講述一個故事,好的方法名稱會讓故樹講述得更流暢。

跟我共事過的 Java 工程師可能都知道我不喜歡用 Lombok 這類工具,即便是 getter 和 setter,誰說一定要有,就算有,也不一定是 public,甚至,我還會用 immutable interface 將 getter 和 setter 拆開。

更謹慎地暴露方法,從最嚴格的可見性開始,有必要時才暴露。

書中也提到了我個人很喜歡轉換方法及轉換建構函式,以及一點我個人在看一些目前 Java 第三方套件很愛使用的 builder 時,一直不解的問題:

透過提供無參數的建構函式和一系列 setting方法來建立物件。可以滿足靈活性的要求。不過這種方法無法表達出「物件需要傭有哪些參數組合才能正常運作」。

即便參數可能有點多,要 overloading 多個可省略參數的版本,但我還是偏好建構子,只有特定理由才會使用工廠方法:

工廠方法可以回傳更抽象的類型 (某個子類型或介面的某個實作),還可以根據方法的意圖來命名,不必與類別名稱一致。不過「工廠方法」也增加了複雜性,因為只有在能發揮它們的優勢時,才應該使用「工廠方法」,而不要把「工廠方法」看作是理所當然。

多年前曾在 C.C. Agile 分享過關於重構的一些想法,我還記得那時提到自己寫的 Comic Surfer 有提供 SDK 給第三方寫新的 plug-in,文件建議請繼承 SDK 提供的 abstract class 而不是實作 interface,那時我也是自己思考出來這個方法,因為即使後來 interface 有新增函式,只要在 abstract class 加入合乎邏輯的預設實作,第三方的 plug-in 在不修改程式的情況下,仍然可以在新版本中使用。

框架開發所面臨的挑戰:如何減少不相容的更新所帶來的影響;如何在設計框架時,避免不相容的更新。想要在改進框架時,把對客戶程式碼的影響降到最低,會給框架帶來額外的複雜度,同時需要向客戶隱藏一些特性,而且在做必要的修改時,必須認真仔細地對修改之處進行溝通。

有過這經驗後,一些想法也回到日常的開發中,即便這東西沒有給第三方使用,我依然會想到「責任」與「相容性」問題,這反而讓程式的邊界更清晰,也更好維護。很有意思也很值得推薦的一本書。

Apr 9, 2018

留言
avatar-img
留言分享你的想法!
avatar-img
Spirit的沙龍
53會員
104內容數
這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
Spirit的沙龍的其他內容
2024/05/23
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
2024/05/23
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
2024/05/11
實際就業後,會發現收集與分析需求,通常都不是工程師在做,會有另一群人,以非工程的角度收集及分析需求,然後在開發過程中蹦出不同的火花,於是很好奇另一群人的想法是什麼?我不敢說這本書能完全代表另一群人的想法,但確實能夠得到很多有用的思維。推薦給所有的軟體工程師。
Thumbnail
2024/05/11
實際就業後,會發現收集與分析需求,通常都不是工程師在做,會有另一群人,以非工程的角度收集及分析需求,然後在開發過程中蹦出不同的火花,於是很好奇另一群人的想法是什麼?我不敢說這本書能完全代表另一群人的想法,但確實能夠得到很多有用的思維。推薦給所有的軟體工程師。
Thumbnail
2024/05/09
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
2024/05/09
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
default methods 似乎也引起不小的討論,因為 default methods 加上可以實作多個介面,已經有點像 C++ 的多重繼承了,只差在沒辦法繼承成員變數而已,是好是壞就看怎麼使用了。我個人覺得還蠻方便的
Thumbnail
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
Thumbnail
我個人是盡可能不寫 switch statement,但觀察這幾年程式語言的趨勢,會發現許多語言把 switch statement 擴充成為實作 pattern matching 的工具,說不定以後 switch statement 會越來越廣泛使用也說不定。
Thumbnail
整結來說,受到幾種語言的影響,我個人設計 API 時,除了合乎該語言的 convention、上述的穩定性及一致性外,大致還會注意幾點:語意清楚、相近的顆粒度、簡單的文件、讓程式能像文章般閱讀。
Thumbnail
整結來說,受到幾種語言的影響,我個人設計 API 時,除了合乎該語言的 convention、上述的穩定性及一致性外,大致還會注意幾點:語意清楚、相近的顆粒度、簡單的文件、讓程式能像文章般閱讀。
Thumbnail
不管用哪種語言開發軟體,除非是那種一個 function 寫個幾萬行的人 (來人啊,把這種人拖去砍了),不然,一般都會根據某些因素,切割成模組或是特定功能的區塊 (一個 class 或是一個 function),但要完成一個特定功能,這些模組或區塊勢必要一起合作,因此這些模組與區塊就發生了關係。
Thumbnail
不管用哪種語言開發軟體,除非是那種一個 function 寫個幾萬行的人 (來人啊,把這種人拖去砍了),不然,一般都會根據某些因素,切割成模組或是特定功能的區塊 (一個 class 或是一個 function),但要完成一個特定功能,這些模組或區塊勢必要一起合作,因此這些模組與區塊就發生了關係。
Thumbnail
在軟體開發領域,乾淨程式碼是一個極為重要的概念。乾淨程式碼不僅僅是讓代碼運作正確,更是確保代碼易於閱讀、理解和維護的關鍵。本文將深入探討如何撰寫乾淨程式碼,並介紹一些提升代碼可讀性與維護性的最佳實踐方法。
Thumbnail
在軟體開發領域,乾淨程式碼是一個極為重要的概念。乾淨程式碼不僅僅是讓代碼運作正確,更是確保代碼易於閱讀、理解和維護的關鍵。本文將深入探討如何撰寫乾淨程式碼,並介紹一些提升代碼可讀性與維護性的最佳實踐方法。
Thumbnail
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
Thumbnail
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
Thumbnail
方法鏈接和流暢接口在許多現代編程語言和框架中都有使用。這兩個概念有時互相重疊,因為流暢接口通常使用方法鏈接來實現。使用這些技巧可以提高程式碼的可讀性和維護性,使得編碼更符合人類語言的結構。這對於在專案中協同工作的團隊尤為重要,因為它可以讓每個人更容易理解和使用代碼。
Thumbnail
方法鏈接和流暢接口在許多現代編程語言和框架中都有使用。這兩個概念有時互相重疊,因為流暢接口通常使用方法鏈接來實現。使用這些技巧可以提高程式碼的可讀性和維護性,使得編碼更符合人類語言的結構。這對於在專案中協同工作的團隊尤為重要,因為它可以讓每個人更容易理解和使用代碼。
Thumbnail
這篇文章將會分享 Clean Code 關於函式的重點,內容主要以個人閱讀後有印象的部分著手,有興趣了解更多請自行購買這本書。
Thumbnail
這篇文章將會分享 Clean Code 關於函式的重點,內容主要以個人閱讀後有印象的部分著手,有興趣了解更多請自行購買這本書。
Thumbnail
在學Java的人也許多少人會跟小的一樣不是很理解functional interface到底在幹嘛,也覺得語法很多此一舉。希望能夠在此拋磚引玉
Thumbnail
在學Java的人也許多少人會跟小的一樣不是很理解functional interface到底在幹嘛,也覺得語法很多此一舉。希望能夠在此拋磚引玉
Thumbnail
問了問身邊的同事:「把你的Java Code改成用C的源碼風格呈現的話,你會因此就難以理解同一份程式嗎?」,或是反過來:「若同事的源碼和你的Domain完全不同,但和你的源碼風格一致,你會因此覺得這份源碼比較容易理解嗎?」 我真的都得到肯定的答案,雖然有點難以理解…
Thumbnail
問了問身邊的同事:「把你的Java Code改成用C的源碼風格呈現的話,你會因此就難以理解同一份程式嗎?」,或是反過來:「若同事的源碼和你的Domain完全不同,但和你的源碼風格一致,你會因此覺得這份源碼比較容易理解嗎?」 我真的都得到肯定的答案,雖然有點難以理解…
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News