閒談軟體設計:API Naming Style

更新於 2024/09/28閱讀時間約 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
avatar-img
53會員
104內容數
這是從 Medium 開始的一個專題,主要是想用輕鬆閒談的方式,分享這幾年軟體開發的心得,原本比較侷限於軟體架構,但這幾年的文章不僅限於架構,也聊不少流程相關的心得,所以趁換平台,順勢換成閒談軟體設計。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
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 大作都可以多玩一小時呢!這麼香的更新,怎麼不給他買下去呢 😄
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
今天來聊個最近很夯的主題 DDD,但不是 DDD 的本尊 Domain Driven Design,而是無所不在的 Database Driven Design,Database Driven Design 不是不好,只是你的模型容易變成貧血模型,邏輯都集中在 service 層等等。
Thumbnail
有趣的是,Model 其實沒什麼嚴格的定義,所以每個人對 Model 的解讀也不盡相同,有人覺得資料怎麼儲存屬於 Model 的一部份 (受 ORM 工具的影響),有人覺得工作流程 (workflow) 是 Model 的一部份,我個人也有自己的想法,而且隨專案的規模和特性,也不是總是一樣的。
Thumbnail
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
Thumbnail
我自己偏好用 Repository 搭配 decorator 來管理 cache,而不是在 controller 層或是到處都有快取的邏輯,如果程式都是透過 Repository 更新資料,Repository 就會是一個不錯的地方更新快取,邏輯也就不會散亂在各處了。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
塔西佗陷阱(Tacitus Trap),一個得名於古羅馬歷史學家塔西佗的政治學理論,意指倘若公權力失去其公信力,無論如何發言或是處事,社會均將給予其負面評價。 當然信著恆信、不信者恆不信,這就是真實的人生。
Thumbnail
關於片名   台灣片名《花漾女子》,原文片名《Promising Young Woman》,台灣譯名將時間定格在悲劇發生前,而原文片名則進一步帶我們看見另一個可能性結果
Thumbnail
前幾年因為身體的關係,當了幾年的律師逃兵,當時開了之前的事務所以後,一時間也沒有特別想要做甚麼事情,所以就邊讀一點書、早晚運動一下,剛好聽到當年同梯朋友進去金融業工作,因此也抱著嘗(ㄊㄠˊ)試(ㄅㄧˋ)的心態,找了份銀行法令遵循的工作
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
這篇文章探討了在軟體開發中的技術債可能來自哪些原因,以及如何自動化偵測與修復技術債。作者透過分享不同情境下的技術債選擇,提供了對於技術債的思考與建議,針對開發人員在需要做出無奈的技術決策時,提供了一些建議。此外,還提供了一些在做出技術決策時的方法,如保留抽象層和避免vendor lock-in。
Thumbnail
今天來聊個最近很夯的主題 DDD,但不是 DDD 的本尊 Domain Driven Design,而是無所不在的 Database Driven Design,Database Driven Design 不是不好,只是你的模型容易變成貧血模型,邏輯都集中在 service 層等等。
Thumbnail
有趣的是,Model 其實沒什麼嚴格的定義,所以每個人對 Model 的解讀也不盡相同,有人覺得資料怎麼儲存屬於 Model 的一部份 (受 ORM 工具的影響),有人覺得工作流程 (workflow) 是 Model 的一部份,我個人也有自己的想法,而且隨專案的規模和特性,也不是總是一樣的。
Thumbnail
起源是當時 Facebook 有篇文章討論不少人分不清楚上述二者的差別,當時寫了首部曲《閒談軟體設計:API Naming Style》,接著是《閒談軟體設計:內部函式庫》,但始終沒談到 library 和 framework 的差別,主要是沒有好的例子,這次這例子還蠻不錯的。
Thumbnail
我自己偏好用 Repository 搭配 decorator 來管理 cache,而不是在 controller 層或是到處都有快取的邏輯,如果程式都是透過 Repository 更新資料,Repository 就會是一個不錯的地方更新快取,邏輯也就不會散亂在各處了。
Thumbnail
最近身旁有幾位正在懷孕、或剛生產完的朋友,讓我想起自己在懷孕期間印象最深刻的三件「怪事」,其中又以第三件事最誇張。
Thumbnail
不知道大家在買房之前是不是都會參考親朋好友的意見,或是上網看一些買房注意事項,有時候考慮了這塊就忘了那塊,考慮的那塊又忘了這塊.......
Thumbnail
塔西佗陷阱(Tacitus Trap),一個得名於古羅馬歷史學家塔西佗的政治學理論,意指倘若公權力失去其公信力,無論如何發言或是處事,社會均將給予其負面評價。 當然信著恆信、不信者恆不信,這就是真實的人生。
Thumbnail
關於片名   台灣片名《花漾女子》,原文片名《Promising Young Woman》,台灣譯名將時間定格在悲劇發生前,而原文片名則進一步帶我們看見另一個可能性結果
Thumbnail
前幾年因為身體的關係,當了幾年的律師逃兵,當時開了之前的事務所以後,一時間也沒有特別想要做甚麼事情,所以就邊讀一點書、早晚運動一下,剛好聽到當年同梯朋友進去金融業工作,因此也抱著嘗(ㄊㄠˊ)試(ㄅㄧˋ)的心態,找了份銀行法令遵循的工作