作者:Natasha The Robot,原文鏈接来氧,原文日期:2015/11/13
譯者:小袋子舒憾;校對(duì):numbbbbb;定稿:numbbbbb
Swift 一個(gè)強(qiáng)有力的語(yǔ)言特性就是能夠用多樣的函數(shù)式風(fēng)格去編寫代碼居灯。這在社區(qū)看來(lái)非常激動(dòng)人心祭务。
我在去年年底花費(fèi)了一些時(shí)間學(xué)習(xí)函數(shù)式編程,所以我可以寫更好的 Swift 代碼怪嫌。因此义锥,我非常推薦你們也花時(shí)間去學(xué)習(xí)一下!
另外岩灭,我非常推薦推薦你們?nèi)タ?Functional Swift conference上的每一個(gè)視頻拌倍。
所以在花了這么多時(shí)間后,我想要總結(jié)一下個(gè)人有關(guān)于函數(shù)式編程在 Swift 應(yīng)用的一些思考。
跟著概念走
函數(shù)式編程是令人生畏的柱恤,這要?dú)w咎于單子(monads)和 函數(shù)子(functors)数初!然而,一旦你領(lǐng)悟了它的核心概念梗顺,那么函數(shù)式編程的思想會(huì)超級(jí)簡(jiǎn)單:
“函數(shù)式編程是一個(gè)編程范例…它把計(jì)算作為數(shù)學(xué)函數(shù)的評(píng)估泡孩,并避免改變狀態(tài)和可變數(shù)據(jù)∷掳”— 維基百科
所以核心就是你應(yīng)該用數(shù)學(xué)的方式去編寫代碼仑鸥。你的函數(shù)應(yīng)該有清晰的輸入和輸出,并且不會(huì)像可變對(duì)象一樣有全局副作用矗漾。這就是了锈候!
避免可變狀態(tài)
這和上述的注意點(diǎn)類似。函數(shù)式編程要編寫的是沒有副作用的數(shù)學(xué)代碼敞贡。
在 Swift 中使用結(jié)構(gòu)體和協(xié)議幫助你避免可變狀態(tài)泵琳。
我極度推薦觀看 @andy_matuschak的 Controlling Complexity in Swift,這可以讓你理解如何去實(shí)現(xiàn)以及最終的代碼會(huì)如何地強(qiáng)大誊役。
可讀性第一
我發(fā)現(xiàn)很多高級(jí)的函數(shù)式代碼获列,通常由于五個(gè)以上的習(xí)慣性編程而變得特別難以閱讀。如果你遵從函數(shù)式編程的概念蛔垢,有很多方法讓你的代碼變得更清楚击孩。
但是在今天結(jié)束之前,還要多說(shuō)一句鹏漆,如果你在一個(gè)團(tuán)隊(duì)中工作巩梢,最重要的事就是讓代碼可讀性更強(qiáng)。如果一個(gè)內(nèi)部或者一個(gè)新的開發(fā)者加入你們的團(tuán)隊(duì)艺玲,他們會(huì)不會(huì)完全迷失了括蝠?如果你專注于編寫易讀的代碼(取代好玩和花哨的寫法),他們可能會(huì)很快就有產(chǎn)出饭聚。
記住一點(diǎn)忌警,可讀性的優(yōu)先級(jí)永遠(yuǎn)比花哨的代碼高(除非你的目標(biāo)就是用一個(gè)好玩的副作用去實(shí)現(xiàn)好玩和花哨的程序)。
不要和 framework 作對(duì)
當(dāng)然秒梳,在 iOS 編程中法绵,由于 Cocoa framework 的建立和用戶的輸入輸出,沒有副作用顯然是不可能的(在純粹的數(shù)學(xué)世界酪碘,確實(shí)存在完全沒有外部副作用朋譬,但那不是我們生活的世界!)兴垦。
例如徙赢,如果你創(chuàng)建了一個(gè)通用的轉(zhuǎn)換器(formatter)(例如貨幣轉(zhuǎn)換器)庭呜,并用在代碼中的一些地方,用單例是一個(gè)很好的方法犀忱。你還必須為UI Layer 使用 UIViewControllers
以及 UIViews
募谎。總有辦法去脫離你的邏輯阴汇,進(jìn)而讓很好的不可變組件去幫助你可變化這些東西数冬,但是不要過火地把 freamwork 改變?yōu)槊婺咳牵勺x,不可讀)的狀態(tài)搀庶。
深入學(xué)習(xí)函數(shù)式編程
再次強(qiáng)調(diào)拐纱,你不應(yīng)該執(zhí)著于在你的 Swift 代碼中使用花哨的技巧(除非你只是為了試驗(yàn)、或者好玩)哥倔。我非常推薦深入學(xué)習(xí)函數(shù)式編程的思想秸架,從而理解那些高級(jí)概念,并且更好地應(yīng)用在你的代碼中咆蒿。
推薦閱讀 Functional Programming in Swift 东抹!這里有更多的資源去幫助你開始學(xué)習(xí)!