閒談軟體設計:API Naming Style

閱讀時間約 9 分鐘
圖片來源:https://www.allbusiness.com/reasons-why-your-business-name-is-important-136804-1.html

圖片來源:https://www.allbusiness.com/reasons-why-your-business-name-is-important-136804-1.html

過去寫閒談軟體設計文章時,並沒有特別注意文章的長度,能寫多少就寫多少 (謎之音:實話是能掰多少是多少?) 在友人的提醒下,有些文章有點太長,不過,我只能說盡量,能找到合適的切割點且還要有適合的標題,有時候蠻難的。接下來想聊聊 library 和 framework 等 reusable components,目前想想可能會有點長,所以預計會拆成幾篇文章,這是第一篇。

慣例

在學習任何新程式語言,大多都用熟悉的語言習慣去看新語言有沒有類似的事物,自己也是如此,第一次擔任視窗程式設計的助教,也是我第一次認真學 C# 的時候,網路上有不少人說 C# 就是 Java,所以當時我也是以最熟悉的 Java 習慣去學 C#,在好的 model 設計基礎下,寫出來的程式其實並不會太差,但就是有那麼一點點格格不入的感覺,主要是沒有使用像是 eventdelegate 等 C# 的語言特性,及遵循 .Net 既有的 《Coding Conventions》。

大多數的語言社群或官方都會有一套該語言的 coding convention,例如 Java 官方提供 《Code Conventions for the Java Programming Language》,雖然這份 convention 已經沒有繼續維護了,但既有的 Java SE/EE framework 大都是以這份 convention 為主,所以自己在寫 Java 程式也是遵循這份 convention。公司或組織內部的 convention 大多也是以既有的基礎再做些調整,例如 Google 公開的 《Google Java Style Guide》。

Coding convention 會因為語言背後的哲學在嚴謹度上不大相同 (有的語言會管很多),相較 Java 與 .Net Framework 的《Framework Design Guidelines》 會發現 Java 的 convention 大多著重在格式上,像是空白、大括弧、換行等規則,對於 API 的命名則只有 method 以動詞開始、class 需是一個名詞盡量避免縮寫幾個簡單的規則,.Net 則有較清楚的 naming 建議,但整體來看,不論是官方或第三方函式庫,Java 和 Net 的 API 還算是相當一致的。

做什麼要像什麼

為什麼要提到 API naming style 呢?前幾天在 Facebook 上看到一段針對 Swift 2.2 轉換到 3.0 引起大量 API 變更的討論,因此我也抽空看了一下 WWDC 2016 的《Swift API Design Guidelines》,session 中出現了一個字 swifty,代表 API 的命名是合乎 Swift 風格與背後的哲學 (整段影片其實很有意思,有興趣的人可以看一下),看影片時腦中浮現了前陣子在天瓏翻閱《Fluent Python》的一段話:

One of the best qualities of Python is its consistency. After working with Python for a while, you are able to start making informed, correct guesses about features that are new to you. However, if you learned another object-oriented language before Python, you may have found it strange to spell len(collection) instead of collection.len(). This apparent oddity is the tip of an iceberg which, when properly understood, is the key to everything we call Pythonic.

試想你正在替公司開發一個 Python 的函式庫,但卻用 JavaScript 或 Java 的 naming style 設計 API 而忽視 Python 背後哲學的慣例,這恐怕不會受到 Python 社群的青睞,因為 API 不夠 Pythonic!

穩定性

設計 API 時考慮些什麼呢?對我來說穩定性是很重要的,Swift 當初推出時,既有的 Objective C 和 C API 採取不變動的原則,這個決定能讓大量 Objective C 的開發者快速上手 Swift,但老實說,混合的程式碼讀起來有種不協調感,久而久之會變成新語言的負擔,所以這次 Swift 2.2 到 3.0 以別名的方式,為大量既有的 API 加上了適合 Swift 的 API 命名,並提供 migration 工具幫助開發者轉換既有的程式碼,將開發者的負擔降到最小,不過還是引起不小的抱怨。

如果沒有像 Apple 有這麼大量的開發人力,改變 API 之外還能夠開發 migration 工具,那就盡量避免 API 的改變,如果真要改變,應該要是同時提供新舊 API,並將舊 API 宣告為捨棄,讓開發者能夠有充足的時間轉換到新 API,在多個版本後才將舊 API 移除,這在很多語言都有對應的標示方式,以 Java 來說就是在舊的 API 加上 @Deprecated,並以 JavaDoc 告知該換成哪個 API,話雖如此,API 一旦發布出去就收不回來了,這也是為什麼向下相容很辛苦,但微軟一直在做的事,辛苦了 (可參考書摘《約耳趣談軟體》 Part 2)。

一致性

除了穩定性,一致性亦很重要,就如同剛剛引用《Fluent Python》的那段話中,一致性能讓開發者在使用一個新的 libaray 或新功能時,能用過去的習慣去猜測新 API 該如何使用,但這真的不是件容易的事情,畢竟網路上每位貢獻者,並不一定使用相同的 convention,甚至像剛剛提到 Java 和 .Net 有 coding convention,但在我過去的經驗還是會遇到一些不一致的地方,舉例來說,Java 在 AWT/Swing 時期,蠻多 listener 的 method 以過去分詞結尾:

但也有例外,像是 CaretListener 的 method 不是 caretUpdated,但對習慣這慣例的開發者來說還算能接受,因為 IDE 應該能在前面幾個字打完後,就能找到對的 method

比較讓我稍微花點時間適應的是 JavaFX,引入了 property binding 機制,造成一些使用上的習慣和 Swing 稍有不同。這些不大的變動,也許不算是太嚴重,或是因為新機制的導入造成大變動,都會需要開發者花時間適應,所以在設計 API 前,也許可以先想想想要的一致性是什麼?這期望的一致性最好能成為一份 API design guideline,讓組織的成員能遵循,這次 Swift 3.0 就有詳列一份《API Design Guidelines》,希望開發者在設計給 Swift 使用的 API 時能遵守。

總結

整結來說,受到幾種語言的影響,我個人設計 API 時,除了合乎該語言的 convention、上述的穩定性及一致性外,大致還會注意幾點:

  • 語意清楚,雖然為了讓語意清楚,可能會讓名稱變長,但在 IDE 的協助下,即使名稱稍長,實際上不需要打這麼多字,所以語意比簡潔重要。
  • 相近的顆粒度,API 的抽象程度不應該差太多,或是說,該隱藏不必要的細節。
  • 簡要的文件,即便語意夠清楚,但還是有個文件說明用途、輸入、輸出和可能的例外。
  • 讓程式能像文章般閱讀,這要跟語言配合,像是 Objective C 需要替參數取兩個名字,一開始覺得很瑣碎,但習慣後,在讀 Objective C 程式時真的像在閱讀文章,可讀性高很多,若有合適的參數名稱,查詢 API 文件的頻率會比其他語言少很多;但不是每個語言都是如此,因此只能靠抽象,若抽象做得好,API 就能組成 domain specific language,讓程式,也能讓程式的可讀性變高。

因此,要設計好的 API 真的不容易。最後,引用 Martin Fowler 也引用的一段話做結束,因為命名真的是一件很難的事!

There are only two hard things in Computer Science: cache invalidation and naming things. — Phil Karlton
52會員
102內容數
這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
留言0
查看全部
發表第一個留言支持創作者!
Spirit的沙龍 的其他內容
在上回,我們已經把工作視覺化成看板,但這只是第一步,要想用看板方法優化工作的流程,我們得設置 WIP 限制,讓團隊開始知道瓶頸在哪裡,然後才能開始改善,這一回就來看 WIP 限制的設置。
意外的是這本書中提到蠻多首席設計師或是架構師的重要性,他確保系統的概念整體性,定義規格但對實作持開放讓開發者能夠發揮創意,自己的工作經驗中,第一份工作有和一位頗厲害的架構師合作過,第二份工作後來自己也當上架構師,甚至在另一家公司還曾經有過首席架構師的頭銜,但說實話,自己仍在摸索怎麼當一個好的架構師?
這本書裡很多的內容是寫於千禧年世代,現在回頭看很多內容的發展方向已經大不相同,像是訂閱制慢慢開始興起,App 在手機上崛起,Web 大鳴大放,但讀起來還是很有滋味,很推薦給大家。
第三方套件用了Promise或是Reactive,導致所有business logic都要做調整,這就違反「只能有對內的相依方向」的原則。business logic大多數情況下與效能優化無關,通常需要優化的是I/O的存取,這些既然都在外層,就應該在外層做優化,外層的優化不該影響核心,這才是好架構。
在上一回 說明看板方法相關的精實精神與原則與實務,這一回則是來設計看板,包含看板的範圍應該多廣、有哪些狀態、工作的顆粒度,以及 DoD 的呈現。
這本書以小說形式,把建構管理、看板方法、限制理論、三步工作法及 DevOps 以活靈活現的例子串在一起,十分有趣。很推薦給所有從事 IT 相關產業的工程師。
在上回,我們已經把工作視覺化成看板,但這只是第一步,要想用看板方法優化工作的流程,我們得設置 WIP 限制,讓團隊開始知道瓶頸在哪裡,然後才能開始改善,這一回就來看 WIP 限制的設置。
意外的是這本書中提到蠻多首席設計師或是架構師的重要性,他確保系統的概念整體性,定義規格但對實作持開放讓開發者能夠發揮創意,自己的工作經驗中,第一份工作有和一位頗厲害的架構師合作過,第二份工作後來自己也當上架構師,甚至在另一家公司還曾經有過首席架構師的頭銜,但說實話,自己仍在摸索怎麼當一個好的架構師?
這本書裡很多的內容是寫於千禧年世代,現在回頭看很多內容的發展方向已經大不相同,像是訂閱制慢慢開始興起,App 在手機上崛起,Web 大鳴大放,但讀起來還是很有滋味,很推薦給大家。
第三方套件用了Promise或是Reactive,導致所有business logic都要做調整,這就違反「只能有對內的相依方向」的原則。business logic大多數情況下與效能優化無關,通常需要優化的是I/O的存取,這些既然都在外層,就應該在外層做優化,外層的優化不該影響核心,這才是好架構。
在上一回 說明看板方法相關的精實精神與原則與實務,這一回則是來設計看板,包含看板的範圍應該多廣、有哪些狀態、工作的顆粒度,以及 DoD 的呈現。
這本書以小說形式,把建構管理、看板方法、限制理論、三步工作法及 DevOps 以活靈活現的例子串在一起,十分有趣。很推薦給所有從事 IT 相關產業的工程師。
本篇參與的主題策展
先前麥克買了在預算及性能方面都十分複合需求的NXTPAPER 11平板,但拿到辦公室使用後便發現因為時不時有簡報需求,主機本身不支援有線視訊輸出實在是非常不方便,因又開始尋找新歡。最終麥克選擇了算是還滿熟悉的品牌小米旗下的小米平板6,以下為麥克這一個月下來的使用心得。
從預計的十月底出貨經過重重波折,Pubu自家開發的10寸彩色閱讀器Pubook Pro終於是送到第一批集資者手中了。究竟這台閱讀器有沒有本事撼動目前的電子紙閱讀器市場?有達到集資時承諾的各項功能嗎?且讓身為首批集資者之一的麥克跟大家談談收到主機後使用數天的感想。
Steam Deck 迎來大改版,最重要的更新就是換成 OLED 螢幕。使用 OLED 螢幕帶來更好看的顏色,大小還小幅提升到 7.4 吋。關係續航力的電池也從 40 瓦小時升級到 50 瓦小時, 3A 大作都可以多玩一小時呢!這麼香的更新,怎麼不給他買下去呢 😄
先前麥克買了在預算及性能方面都十分複合需求的NXTPAPER 11平板,但拿到辦公室使用後便發現因為時不時有簡報需求,主機本身不支援有線視訊輸出實在是非常不方便,因又開始尋找新歡。最終麥克選擇了算是還滿熟悉的品牌小米旗下的小米平板6,以下為麥克這一個月下來的使用心得。
從預計的十月底出貨經過重重波折,Pubu自家開發的10寸彩色閱讀器Pubook Pro終於是送到第一批集資者手中了。究竟這台閱讀器有沒有本事撼動目前的電子紙閱讀器市場?有達到集資時承諾的各項功能嗎?且讓身為首批集資者之一的麥克跟大家談談收到主機後使用數天的感想。
Steam Deck 迎來大改版,最重要的更新就是換成 OLED 螢幕。使用 OLED 螢幕帶來更好看的顏色,大小還小幅提升到 7.4 吋。關係續航力的電池也從 40 瓦小時升級到 50 瓦小時, 3A 大作都可以多玩一小時呢!這麼香的更新,怎麼不給他買下去呢 😄
你可能也想看
Thumbnail
作家 Morgan Housel 在《華爾街日報》中提出一個觀點:我們是用理解知識的方式在思考、學習金錢觀,而不是用理解心智與行為模式的方式學習理財。這段話讓我意識到,我們的財務決策並非總是理性的,情緒因素也扮演著重要角色。通過掌握金錢心理學,能夠幫助我們改善用錢習慣,使財務決策更為理性和長遠。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
塔西佗陷阱(Tacitus Trap),一個得名於古羅馬歷史學家塔西佗的政治學理論,意指倘若公權力失去其公信力,無論如何發言或是處事,社會均將給予其負面評價。 當然信著恆信、不信者恆不信,這就是真實的人生。
Thumbnail
關於片名   台灣片名《花漾女子》,原文片名《Promising Young Woman》,台灣譯名將時間定格在悲劇發生前,而原文片名則進一步帶我們看見另一個可能性結果
Thumbnail
前幾年因為身體的關係,當了幾年的律師逃兵,當時開了之前的事務所以後,一時間也沒有特別想要做甚麼事情,所以就邊讀一點書、早晚運動一下,剛好聽到當年同梯朋友進去金融業工作,因此也抱著嘗(ㄊㄠˊ)試(ㄅㄧˋ)的心態,找了份銀行法令遵循的工作
Thumbnail
那天我問隊友,怎樣才算是一部小說呢?按字數計算嗎? 他說:「故事內起承轉合都有,就算」 所以我大膽地按著他的標準,將自己寫過的故事,粗略整理出一個明細。
纏中說禪,本名李彪,專欄筆名木子,其人是中國股市比較早期的操盤手,所以他比較熟悉a股的市場情況。他以“纏中說禪”為筆名,從2002年開始寫博客,直到2008年癌症病重停更,期間寫下了不少文章。而博客文章中最為著名的就是他的“教你炒股票”系列文章,他在這個系列裡講到的炒股理論和方法被粉絲稱為“纏論
Thumbnail
婚姻是人生大事,對溥儀尤其如此,因為如果皇帝大婚,就代表溥儀可以脫離眾多便宜老媽的束縛而得以親政。 但詭異的是,這個可以讓他脫離便宜老媽掌控的婚姻,卻還是要由便宜老媽進行主導並且居中角力......
Thumbnail
上次我提到:溥儀就是個死小孩。其實這不能全怪溥儀,而要怪詭異的宮廷教育及生活制度......
Thumbnail
近期電影「末代皇帝」重新修復上映。 為了推坑這部經典之作,本人決定以溥儀本身的自傳《我的前半生》為主要基底,和大家談一些電影中礙於篇幅或是藝術改編,而不容易察覺或是沒有呈現的真實歷史。
Thumbnail
作家 Morgan Housel 在《華爾街日報》中提出一個觀點:我們是用理解知識的方式在思考、學習金錢觀,而不是用理解心智與行為模式的方式學習理財。這段話讓我意識到,我們的財務決策並非總是理性的,情緒因素也扮演著重要角色。通過掌握金錢心理學,能夠幫助我們改善用錢習慣,使財務決策更為理性和長遠。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
塔西佗陷阱(Tacitus Trap),一個得名於古羅馬歷史學家塔西佗的政治學理論,意指倘若公權力失去其公信力,無論如何發言或是處事,社會均將給予其負面評價。 當然信著恆信、不信者恆不信,這就是真實的人生。
Thumbnail
關於片名   台灣片名《花漾女子》,原文片名《Promising Young Woman》,台灣譯名將時間定格在悲劇發生前,而原文片名則進一步帶我們看見另一個可能性結果
Thumbnail
前幾年因為身體的關係,當了幾年的律師逃兵,當時開了之前的事務所以後,一時間也沒有特別想要做甚麼事情,所以就邊讀一點書、早晚運動一下,剛好聽到當年同梯朋友進去金融業工作,因此也抱著嘗(ㄊㄠˊ)試(ㄅㄧˋ)的心態,找了份銀行法令遵循的工作
Thumbnail
那天我問隊友,怎樣才算是一部小說呢?按字數計算嗎? 他說:「故事內起承轉合都有,就算」 所以我大膽地按著他的標準,將自己寫過的故事,粗略整理出一個明細。
纏中說禪,本名李彪,專欄筆名木子,其人是中國股市比較早期的操盤手,所以他比較熟悉a股的市場情況。他以“纏中說禪”為筆名,從2002年開始寫博客,直到2008年癌症病重停更,期間寫下了不少文章。而博客文章中最為著名的就是他的“教你炒股票”系列文章,他在這個系列裡講到的炒股理論和方法被粉絲稱為“纏論
Thumbnail
婚姻是人生大事,對溥儀尤其如此,因為如果皇帝大婚,就代表溥儀可以脫離眾多便宜老媽的束縛而得以親政。 但詭異的是,這個可以讓他脫離便宜老媽掌控的婚姻,卻還是要由便宜老媽進行主導並且居中角力......
Thumbnail
上次我提到:溥儀就是個死小孩。其實這不能全怪溥儀,而要怪詭異的宮廷教育及生活制度......
Thumbnail
近期電影「末代皇帝」重新修復上映。 為了推坑這部經典之作,本人決定以溥儀本身的自傳《我的前半生》為主要基底,和大家談一些電影中礙於篇幅或是藝術改編,而不容易察覺或是沒有呈現的真實歷史。