變成思想-0x01 面向編程

POP (protocol Oriented Programing POP) 面向協(xié)議編程

OOP (Object Oriented Programing) 面向?qū)ο缶幊?/p>

OOP的優(yōu)點

1)封裝和權(quán)限控制

OC:.h文件負(fù)責(zé)聲明公共變量和方法,.m 文件負(fù)責(zé)聲明私有變量, 并實現(xiàn)所有方法。

Swift:也有public、internal、fileprivate、private 等權(quán)限控制;

2)命名空間

Swift:不同的class即使命名相同, 在不同的bundle中, 由于命名空間不同,它們依然可以和諧共存,毫無沖突;在App體積很大的時候,bundle很多時候,這一點特別有用;

OC: 沒有命名空間, 所以很多類在命名的時候都加入了“駝峰式”的前綴;

3)擴展性:

Swift:可以通過extension 來增加新方法, 通過動態(tài)特性亦可以增加變量, —— 可以保證在不破壞原來代碼封裝的情況下實現(xiàn)新的方法。

OC:可以使用category實現(xiàn)類似功能;

在Swift和OC中, 還可以通過protocol 和代理模式實現(xiàn)更加靈活的擴展

4)繼承和多態(tài)

同其他語言一樣, 在iOS中,可將公共的方法和變量定義在父類中,在子類繼承時再各自實現(xiàn)對應(yīng)的功能,高效實現(xiàn)代碼復(fù)用,針對不同的子類,從而大大增加代碼的靈活性;

OOP 缺點

1)隱式共享

class 是引用類型, 當(dāng)在代碼中的某處改變某個實例變量時, 另一次在調(diào)用此變量時就會受此修改的影響;
很容易造成異常, 尤其是在多線程上, 我們經(jīng)常會遇到資源競選(Race condition) 就屬于這種情況。
解決多線程時枷鎖, 加鎖有可能會引起死鎖或者代碼復(fù)雜度劇增。 解決這個問題最好的方案是諸如struct這樣的值類型取代class

2)冗余的父類

eg: UIViewController 需要加入一個handleSomethiing() 方法, OOP的是在其extension直接添加這個方法,隨著新方法越來越多, 導(dǎo)致UIViewController越來越冗余, 隨著新方法越來越多, 導(dǎo)致職權(quán)不明確、依賴、冗雜等多種問題。

3)多繼承

swift 和OC都不支持多繼承, 因為他會造成“菱形”問題,
即為:多個父類實現(xiàn)了同一個方法,子類無法判斷繼承哪個父類的情況。 C++ 就會有這種情況, 使用了抽象類的實現(xiàn)方式確定繼承方法;
在Java中, 有interface的解決方案, 在Swfit有類似的protocol


為什么Swift 要推出全新的POP?

1)OOP自身的缺點, 在繼承和代碼復(fù)用等方面, 其靈活度不高, POP恰好可以解決這個問題;

2)POP可以保證Swfit作為 靜態(tài)語言的安全性, 而OC時代的OOP, 其動態(tài)特性經(jīng)常會導(dǎo)致異常

3)OOP無法應(yīng)用于值類型, 而POP可以將其優(yōu)勢擴展到結(jié)構(gòu)體(struct)和枚舉(enum)類型中;


OOP優(yōu)點

1)更加靈活:上面的handleSomething方法, 通過服從協(xié)議的同時, 增加了代碼的可讀性;

2)減少依賴:相對于傳入具體的實例變量,可以傳入protocol來實現(xiàn)多態(tài),同時,在測試也可以利用protocol 來模擬真實的實例,減少對對象以及其它實現(xiàn)的依賴

3)消除動態(tài)分發(fā)的風(fēng)險

POP面試題: 要給一個UIButton增加一個點擊后抖動的 效果,應(yīng)該怎么實現(xiàn)?

三種方案

1)方案一:實現(xiàn)一個自定義的UIButton類, 在其中添加點擊抖動效果的方法【shake方法】;

2)方案二:寫一個UIButton的Extension, 然后在其中增加share方法

3)方案三:定義一個protocol,然后將協(xié)議擴展protocol extension中添加shake方法

分析:
1)性能擴展性不好, 復(fù)用性不好
2)可讀性很差, 因為不是每個人都知道有這個方法
3)解決了復(fù)用性、可讀性、維護(hù)性 這個三個難題。

本文由mdnice多平臺發(fā)布

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,743評論 2 370