Swift 中的面向協(xié)議編程是如何點亮我的人生的

面向?qū)ο缶幊讨两褚呀?jīng)使用了數(shù)十年了,并且成為了構(gòu)建大型軟件約定俗成的標(biāo)準(zhǔn)杯矩。作為iOS編程的中心思想博助,遵循面向?qū)ο笠?guī)范來編寫一個 iOS 的應(yīng)用幾乎不可能實現(xiàn)。雖然面向?qū)ο笥泻芏鄡?yōu)點比如封裝性甸鸟,訪問控制和抽象性谋右,但是它也自帶有固有的缺點舔清。

  1. 大多數(shù)類的情況下觅彰,當(dāng)一個單繼承的類需要更多不同類中的函數(shù)功能時,你會傾向于使用多繼承來實現(xiàn)替裆。 但是大部分的編程語言不支持這一特性校辩,而且會導(dǎo)致類的繼承關(guān)系變得復(fù)雜。

  2. 在多線程環(huán)境下辆童,如果所有對象在函數(shù)中都是通過引用來傳遞會導(dǎo)致意想不到的問題宜咒。

  3. 因為類與類之間的高耦合性,為一個單獨的類寫測試單元會很困難胸遇。

下面是網(wǎng)上大量的對面向?qū)ο蟮谋г?/p>

All evidence points to OOP being bullshit | Pivotal

Object Oriented Programming is an expensive disaster which must end | Smash Company

Swift 嘗試引入一種叫做面向協(xié)議的編程新規(guī)范來解決傳統(tǒng)的面向?qū)ο缶幊讨泄逃械膯栴}荧呐。WWDC2015 演講做了一個令人驚嘆的關(guān)于面向協(xié)議編程的介紹汉形。我迫不及待的想推薦它了纸镊。

Swift 在最初的時候是包含值類型的概念。結(jié)構(gòu)體和枚舉都是 Swift 中的一等公民概疆,還擁有很多像 propertites, methods 和 extensions 等在大多數(shù)語言只有類才有的特點逗威。雖然在Swift中值類型不支持繼承,但是通過遵循協(xié)議的方式一樣能夠享受到面向協(xié)議的好處岔冀。

Ray Wunderlich 的面向協(xié)議編程的教程展示了它的能力凯旭。

Introducing Protocol-Oriented Programming in Swift 2

現(xiàn)在我將向你展示面向協(xié)議編程是如何點亮我的人生的。我的應(yīng)用程序遵循經(jīng)典的左側(cè)菜單導(dǎo)航模式(附帶一些選項)使套。這個應(yīng)用大概有十個不同的 view controller,它們都是繼承自一個擁有基礎(chǔ)函數(shù)和各個界面所需樣式的基類 view controller侦高。

和我的應(yīng)用相似的左側(cè)菜單的應(yīng)用例子

這個應(yīng)用依賴于 Webscokets 來與服務(wù)器交互。服務(wù)器可以隨時發(fā)送事件奉呛,而應(yīng)用根據(jù)用戶所在的界面來進(jìn)行相應(yīng)的事件響應(yīng)。舉個事件例子的話瞧壮,比如登出事件登馒,當(dāng)用戶收到了服務(wù)器關(guān)于這個狀態(tài)的事件時,應(yīng)用需要登出并顯示登錄界面咆槽。

在我腦中的第一想法是把登出事件寫在基礎(chǔ)的 view controller 里面,當(dāng)事件發(fā)生的時候,在需要的 view controller 進(jìn)行調(diào)用麦射。

// BaseViewController.swift

class BaseViewController {

func logout() {

//Perform Logout

print("Logout User")

}

}

這一步的問題就是并不是每個 view controller 都必須實現(xiàn)這個登出的功能,但是它還是都會繼承這個登出的函數(shù)法褥。此外不同的 view controller 需要響應(yīng)不同的事件茫叭,所以在基礎(chǔ) view controller 中包含所有的函數(shù)并沒有什么意義。

幸運地是面向協(xié)議編程拯救了我半等,我聲明一個 Logoutable 的協(xié)議揍愁,那些需要登出功能的 view controller 遵循這個 Logoutable 的協(xié)議就可以了杀饵。

// Logoutable.swift

protocol Logoutable {

func logout()

}

// ViewController.swift

class ViewController : Logoutable {

func logout() {

//Perform Logout

print("Logout User")

}

}

這一個進(jìn)步帶來的問題是我必須在每個需要遵循這個協(xié)議的 view controller 中重復(fù)這個登出函數(shù)的實現(xiàn)。

這正是面向協(xié)議編程在 Swift 中的閃光點切距,因為它給我們提供了協(xié)議拓展功能,可以在一個協(xié)議中定義一個默認(rèn)的函數(shù)的行為谜悟。所以我所需要做的僅僅是在 Logoutable 的協(xié)議中寫一個帶有默認(rèn)登出行為的實現(xiàn)的拓展,這樣這個函數(shù)對那些遵循這個協(xié)議的 view controller 的來說就是可選的葡幸。

//LogoutableExtension.swift

extension Logoutable where Self : BaseViewController {

func logout() {

//Perform Logout

print("Logout User")

}

}

面向協(xié)議編程完全就像魔法一樣,不定義任何復(fù)雜的繼承就夠就實現(xiàn)這些功能∥颠叮現(xiàn)在我就能為不同的事件定義不同的協(xié)議并且各自 view controller 就能夠遵循它所需要的協(xié)議。

面向協(xié)議編程是真正地點亮了我的人生蔑水,現(xiàn)在每當(dāng)我需要使用繼承或者其他面向?qū)ο蟮脑韥順?gòu)建我的代碼時,我會想這能否通過使用面向協(xié)議編程的方法來更好的完成這項工作丹擎。我不是說它是完美的解決方案但是它仍然值得一試。

如果你喜歡這篇文章的話鸥鹉,請推薦它,這樣其他人也可以欣賞它毁渗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末单刁,一起剝皮案震驚了整個濱河市灸异,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檐春,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疟暖,死亡現(xiàn)場離奇詭異田柔,居然都是意外死亡俐巴,警方通過查閱死者的電腦和手機硬爆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀磕,“玉大人,你說我怎么就攤上這事袜蚕。” “怎么了廷没?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵垂寥,是天一觀的道長。 經(jīng)常有香客問我滞项,道長,這世上最難降的妖魔是什么文判? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮戏仓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赏殃。我一直安慰自己,他們只是感情好仁热,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般思劳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潜叛,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天壶硅,我揣著相機與錄音钠导,去河邊找鬼森瘪。 笑死牡属,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扼睬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼措伐,長吁一口氣:“原來是場噩夢啊……” “哼军俊!你這毒婦竟也來了侥加?” 一聲冷哼從身側(cè)響起粪躬,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镰官,沒想到半個月后提前,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡狈网,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年笨腥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脖母。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镶奉,靈堂內(nèi)的尸體忽然破棺而出崭放,到底是詐尸還是另有隱情鸽凶,我是刑警寧澤币砂,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布决摧,位于F島的核電站,受9級特大地震影響掌桩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜波岛,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一音半、第九天 我趴在偏房一處隱蔽的房頂上張望则拷。 院中可真熱鬧曹鸠,春花似錦、人聲如沸彻桃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耗溜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖拴,已是汗流浹背腥椒。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洒放,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓往湿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親领追。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • Swift 中面向協(xié)議編程的應(yīng)用棕孙,與面向?qū)ο蟛煌木幊棠J健T?Swift 這個現(xiàn)代化的編程語言中蟀俊,感受面向協(xié)議帶...
    風(fēng)之谷等風(fēng)來閱讀 522評論 1 4
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫订雾、插件肢预、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,033評論 4 62
  • 第一章.面向?qū)ο笈c面向協(xié)議編程 本書是關(guān)于面向協(xié)議編程洼哎。當(dāng)蘋果2015年的開發(fā)者大會上發(fā)布了Swift2,他們也宣...
    醬油不愛醋閱讀 1,373評論 0 7
  • 或許你沒有在意 那個多雨的節(jié)氣 不經(jīng)意說出的話語 玩笑似的公開秘密 我篤定的說不可能會愛上你 或許你不會想起 那個...
    河顏月瑟閱讀 197評論 0 0
  • 今天測試自己的QQ企業(yè)郵箱配置為Laravel的發(fā)送郵箱窑邦,故而去配置 .env 和 config/mail.php...
    Jason_Simple閱讀 2,348評論 0 0