是什么使代碼 “Swifty”? —— Expressive

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)置方法來提示性能

Swifty Code —— Expressive

清晰明確的命名(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 SundellWhat makes code “Swifty”?中關(guān)于Expressive的內(nèi)容

是什么使代碼 “Swifty”? —— Safe 介紹了如何有選擇地使用類型系統(tǒng)的各個方面和功能,以使我們的代碼更易于理解和使用。
是什么使代碼 “Swifty”? —— Fast 介紹了如何利用系統(tǒng)的一些內(nèi)置方法來提示性能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容