Swift的官方網(wǎng)站上的About頁面列出了三個關(guān)鍵字:
- 安全(Safe):為了最大限度地減少開發(fā)人員的錯誤;
- 迅速(Fast):執(zhí)行的速度要快;
- 表現(xiàn)力(Expressive):因?yàn)镾wift的目標(biāo)是盡可能清晰易懂。
是什么使代碼 “Swifty”? —— Safe 介紹了如何有選擇地使用類型系統(tǒng)的各個方面和功能,以使我們的代碼更易于理解和使用。
是什么使代碼 “Swifty”? —— Fast 介紹了如何利用系統(tǒng)的一些內(nèi)置方法來提示性能
清晰明確的命名(Clear, expressive naming)
最后,讓我們看一下第三個關(guān)鍵字——富有表現(xiàn)力(Expressive)。盡管很容易將表現(xiàn)力視為純粹的修飾,并且涉及挑剔的方法名稱,直到它們都被閱讀成語法上完美的英語句子為止,但最終還是要使我們的代碼清楚地傳達(dá)其含義。
假設(shè)我們編寫了一個當(dāng)前稱為getContent
的函數(shù),該函數(shù)會為捆綁的Content
模型加載數(shù)據(jù),然后對其進(jìn)行解碼:
func getContent(name: String) -> Content? {
guard let url = Bundle.main.url(
forResource: name,
withExtension: "json"
) else {
return nil
}
guard let data = try? Data(contentsOf: url) else {
return nil
}
return try? JSONDecoder().decode(Content.self, from: data)
}
同樣,乍看之下,上面的功能似乎非常好。沒有明顯的錯誤,可以完成工作。但是,就表達(dá)能力而言,絕對可以改進(jìn)。
首先,它的當(dāng)前名稱“get content”并沒有真正告訴我們?nèi)绾螜z索內(nèi)容。
- 是否將其簡單地創(chuàng)建為新實(shí)例?
- 是否將其通過網(wǎng)絡(luò)加載或其他?
- 此外,萬一發(fā)生錯誤,它僅返回
nil
的事實(shí)會使萬一發(fā)生任何故障而使調(diào)試變得更加困難——因?yàn)槲覀儗o法得知實(shí)際出了什么問題。
因此,讓我們先將功能重命名為loadBundledContent
(以明確我們正在從應(yīng)用程序包中加載內(nèi)容),看看我們是否可以改善這些問題。我們還將為它提供一個外部參數(shù)標(biāo)簽,使它讀起來更好一些,最后,使它通過拋出它來報(bào)告遇到的任何錯誤,如下所示:
func loadBundledContent(named name: String) throws -> Content {
guard let url = Bundle.main.url(
forResource: name,
withExtension: "json"
) else {
throw Content.Error.missing
}
guard let data = try? Data(contentsOf: url) else {
throw Content.Error.missing
}
do {
return try JSONDecoder().decode(Content.self, from: data)
} catch {
throw Content.Error.decodingFailed(error)
}
}
有關(guān)上述設(shè)計(jì)拋出API的方式的更多信息,請查看Swift: 提供統(tǒng)一的錯誤API。
更改前后,調(diào)用的對比如下:
// Before
let content = getContent(name: "Onboarding")
// After
let content = try loadBundledContent(named: "Onboarding")
重要的是不要過分依賴我們命名的函數(shù)和類型(畢竟,通常這取決于口味和偏好),但如果我們能夠找到更清晰地傳達(dá)每個API的功能的方法,那巨大的勝利——因?yàn)樗粌H使新開發(fā)人員更容易熟悉我們的代碼庫,而且通常還可以使我們的代碼更加愉快的長期使用。
結(jié)語
在我看來,編寫“ Swifty”代碼不是要使用盡可能多的語言功能,也不是通過部署Swift的最高級功能來解決簡單的問題來使我們的代碼不必要地變得復(fù)雜——而是要調(diào)整我們設(shè)計(jì)和表達(dá)代碼的方式,并它具有Swift的核心原則集的各種API。
通過充分利用標(biāo)準(zhǔn)庫,并通過表達(dá)性命名和API設(shè)計(jì)傳達(dá)我們的代碼意圖,使我們的代碼使用Swift的類型系統(tǒng)來確保正確性并使其功能更加清晰,我們常常最終得到了更好的代碼匹配Swift本身,這難道不是編寫“ Swifty Code”要講述的嗎?
文章來自 John Sundell的What makes code “Swifty”?中關(guān)于Expressive的內(nèi)容
是什么使代碼 “Swifty”? —— Safe 介紹了如何有選擇地使用類型系統(tǒng)的各個方面和功能,以使我們的代碼更易于理解和使用。
是什么使代碼 “Swifty”? —— Fast 介紹了如何利用系統(tǒng)的一些內(nèi)置方法來提示性能