書摘《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

    52會員
    102內容數
    這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
    留言0
    查看全部
    發表第一個留言支持創作者!
    你可能也想看
    書摘《遠距團隊的高效領導法則》:遠距工作是組織文化與個人紀律的試煉受到疫情的影響,許多企業嘗試遠距工作、在家工作或是混合辦公方式持續維持營運,但疫情逐漸消退後的「後疫情時代」,卻發現員工已回不了辦公室。過去我們的生活是圍繞著工作所建構,例如交通、住屋、生活圈都以工作為考量遷移。然而疫情期間,生活反倒成為了重心,各式工具滿足在生活中工作的需求,人們關注工作生生活
    Thumbnail
    avatar
    鄭智維 Wesley
    2022-05-31
    書摘《一流的人如何保持顛峰》:正向心理、實踐使命更拚命不會更成功 第一本結合最新績效科學實證 揭開讓你充分發揮實力 同時避免倦怠與過勞的秘密!
    Thumbnail
    avatar
    鄭智維 Wesley
    2022-01-31
    書摘《生存的12條法則》你可以思考這句話:人生沒有什麼問題......或許你想要的東西阻擋你看到別的可能性
    Thumbnail
    avatar
    司馬儀
    2021-08-11
    書摘《精準回饋》:用回饋力創造正向連結、成長心態的職場人生本書作者Chandler及Grealish長期以來協助非營利組織及跨國企業改善「績效管理」的制度,發現績效管理不彰的重點就在於缺乏回饋。HR除了改善績效管理制度面向外,也應該教育主管使用正確的回饋方式,讓績效管理功能得以發揮。
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-08-07
    書摘《成長駭客》:從網絡產業借鏡,以成長為中心的新世代工作思維自從上次看了商業思維學院產品經理Final Pitch後,覺得同學們的報告也太強,不僅透過市場規模了解潛在商機、蒐集需求設計APP原型,或針對現有APP的用戶使用體驗作改善、各個決策的步驟都輔以用戶心理及數據做佐證,讓我不禁懷疑,產品經理平常的工作內容,是什麼養成他們信手拈來跨學科的思考。
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-07-25
    書摘《教練:價值兆元的管理課》-人性管理中的正面價值管理與領導技巧固然重要,這都是工作技能的一部份。然而真正的教練與頭銜無關。你可以是自己的教練、也可以是同事的教練、朋友的教練。但謹記這些管理叢書的原則是人實踐出來的,而非唯一參照準則。真正重要的是在異化的職場中,不論遭受到多少的批判、掙扎、落在何種困境,你都能在自我對話中保有自己、練習先回到「人性」
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-07-21
    書摘《懂用人,當主管心不累》:所有主管都是人資主管在聊這本書前,我想說一個概念,那就是: 「所有主管都是人資主管」 這個概念是我第一份工作時的經理不斷叮嚀我的。那時候公司在推「四角色模型」的專案時,把所有的單位主管都拉進來參加,但有些主管反對、消極應付,有些主管則是很認真地思考策略,定時回復資料。
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-07-11
    書摘《情緒經濟時代》:打造正向情緒的企業管理本質邁入情緒經濟學 「如果光看交易所裡的價值升降,而不考慮其心理作用,不考慮大眾因企望和沮喪而生的情緒反應,以及引發投機客狂熱的好壞消息如何傳播,那麼這些數字一點意義都沒有。」──塔德 早在行為經濟學盛行前的十九世紀末,社會學家塔德已觀察到許多經濟行為的背後並非理性的算計,而是充滿了許多激情。
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-07-03
    書摘《讓大象跳起來》:組織轉型的關鍵是找回人與人之間的連結。「人與人之間的連結」一詞雖然在疫情的脈絡下有種被汙名化的意涵。但是在社會學者的眼中,「人與人之間的連結」—也就是關係,卻是建立團體、組織、社群等群體社會構成的基礎。
    Thumbnail
    avatar
    鄭智維 Wesley
    2021-06-24
    書摘《訂閱經濟》將顧客轉換為訂戶(subscriber),以創造經常性收入。稱為「訂閱經濟」(Subsrciption Economy)。
    Thumbnail
    avatar
    two
    2019-10-17