淺析面向過(guò)程、面向?qū)ο蠛兔嫦騾f(xié)議編程
?面向過(guò)程編程
面向過(guò)程編程是以過(guò)程為中心的編程方式。具體來(lái)說(shuō),一個(gè)系統(tǒng)或業(yè)務(wù),從頭到尾按照步驟,用函數(shù)的形式來(lái)實(shí)現(xiàn)。
面向過(guò)程主要是分析出系統(tǒng)或業(yè)務(wù)所需要的步驟,關(guān)注的是處理好系統(tǒng)或業(yè)務(wù)的哪些步驟。
這種編程方式,典型的,也是最具代表性的就是C語(yǔ)言。
面向?qū)ο缶幊?/h4>
面向過(guò)程編程是以對(duì)象為中心的編程方式。全稱Object Oriented Programming。簡(jiǎn)稱OOP,其核心思想就是“萬(wàn)事萬(wàn)物皆為對(duì)象”,一切從對(duì)象的角度出發(fā),設(shè)計(jì)和開(kāi)發(fā)系統(tǒng),用對(duì)象來(lái)管理系統(tǒng)。這種思維方式符合人的思維,很容易被人們所理解。
面向?qū)ο笾饕前严到y(tǒng)或業(yè)務(wù)拆解成各個(gè)對(duì)象;關(guān)注的是處理好系統(tǒng)或業(yè)務(wù)中哪些對(duì)象。
它起初的編程語(yǔ)言是Small talk(Small talk是所有OOP語(yǔ)言的鼻祖), 后來(lái)是著名的是C++語(yǔ)言,當(dāng)然把OOP思想發(fā)揮到極致并讓大多數(shù)熟知的是Java語(yǔ)言。
面向協(xié)議編程
面向協(xié)議編程,全稱Protocol Oriented Programming,簡(jiǎn)稱POP, 是 Apple 在 WWDC2015 上提出的一種編程范式,其已成為 Swift 的基礎(chǔ)庫(kù)。
在講面向協(xié)議之前,介紹下協(xié)議的概念。
關(guān)于協(xié)議的概念,在蘋果的官網(wǎng)是如下定義的:“協(xié)議定義了適合特定任務(wù)或功能的方法、屬性和其他需求的藍(lán)圖。然后,類、結(jié)構(gòu)體或枚舉可以遵循該協(xié)議來(lái)提供這些需求的實(shí)際實(shí)現(xiàn)。任何滿足協(xié)議要求的類型都被稱為遵循該協(xié)議。”見(jiàn) Swift 編程語(yǔ)言(Swift 4.0.3)部分。
這個(gè)比較難理解。我就結(jié)合個(gè)人經(jīng)驗(yàn),從幾個(gè)方面理解下:
協(xié)議即Protocol,類似Java語(yǔ)言中Interface(接口),用于模塊間通訊。但是又不完全類似接口。
協(xié)議在Object-C中使用的比較多,一般是結(jié)合delegate(委托),實(shí)現(xiàn)一個(gè)VC對(duì)另一個(gè)VC傳遞數(shù)據(jù)或響應(yīng)事件。在此場(chǎng)景中的協(xié)議很像接口,定義好的一個(gè)規(guī)范。
和繼承的關(guān)系,在Object-C和Swift語(yǔ)言中,我們知道是不支持多重繼承的,然而可以通過(guò)協(xié)議來(lái)實(shí)現(xiàn)多重繼承。
協(xié)議與多態(tài),本來(lái)與多態(tài)扯不上關(guān)系,但是Swift4.0.3版本之后的協(xié)議擴(kuò)展(Protocol extension)又可以實(shí)現(xiàn)多態(tài)功能。
總得來(lái)說(shuō),協(xié)議是綜合有接口、繼承,多態(tài)三個(gè)概念。如果一定給個(gè)概念的話,那協(xié)議更像定義了一套規(guī)范,讓類,結(jié)構(gòu)體和枚舉遵循規(guī)范。
面向協(xié)議的編程又是怎么回事呢?
首先面向協(xié)議的開(kāi)發(fā)語(yǔ)言,目前來(lái)說(shuō),就只有Swift這一門語(yǔ)言, Object-C和Java等其他語(yǔ)言都不不支持。
面向協(xié)議的編程,其實(shí)就是使用Swift語(yǔ)言進(jìn)行開(kāi)發(fā)。那協(xié)議的思想又如何在Swift上體現(xiàn)呢?
未使用協(xié)議思想的方式(即平常使用的方式):
我們首先創(chuàng)建一個(gè)ViewController并生成一個(gè)實(shí)例vc,這個(gè)vc最終也會(huì)AddSubView到父類上。然后在ViewCongroller上添加自己的視圖,如UIView,UILabel或UIButton等等操作。這些控件都會(huì)生成對(duì)應(yīng)的對(duì)象。然后由這些對(duì)象來(lái)管理各個(gè)界面。
還有一種沒(méi)有界面,我們會(huì)先創(chuàng)建一個(gè)個(gè)的類。例如在學(xué)校管理系統(tǒng)中,建立Teacher、Student等類,然后在業(yè)務(wù)層創(chuàng)建Teacher,Student對(duì)應(yīng)的實(shí)例。通過(guò)操作實(shí)例來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯。
總之,首先創(chuàng)建類,然后生成對(duì)應(yīng)的實(shí)例,用實(shí)例管理業(yè)務(wù)。這個(gè)就是OOP的實(shí)現(xiàn)方式。
若采用協(xié)議思想來(lái)做的話,那首先不是建立一個(gè)個(gè)的類了,而是建立一整套協(xié)議(或者叫規(guī)范)。例如上例中的老師和學(xué)生,就有可能建立性別(Sex)、語(yǔ)言(language)、人(person)這些協(xié)議(規(guī)范)。在這些協(xié)議規(guī)范中定義屬性和方法。定義好之后,就可以針對(duì)原來(lái)的Teacher類按協(xié)議的多繼承來(lái)規(guī)范來(lái)。
例如定義一個(gè)Teacher類, 繼承Sex,language和person協(xié)議。這樣也可以實(shí)現(xiàn)Teacher類的功能。當(dāng)然在實(shí)例化上Set有男女,language上有語(yǔ)文,數(shù)學(xué),英語(yǔ)之類的,至于person就是個(gè)人的基本屬性(如姓名,地址,聯(lián)系方式)。這樣生成的Teacher實(shí)例,就可以搭配多種不同的Teacher實(shí)例。例如教英語(yǔ)的女老師,教體育的男老師。
從本質(zhì)來(lái)說(shuō),定義一整套規(guī)范(協(xié)議),如Sex,language,person等等。這些規(guī)范可以是最小原子的,例如Sex,就一個(gè)屬性(sex,1表示男,0:表示女)。這一套通用的規(guī)范定義好之后,給類,結(jié)構(gòu)體或枚舉 等類型去遵守。這就是完全不同之前的面向?qū)ο蟮姆绞健?/p>
它的好處:
1.協(xié)議可以任意擴(kuò)展,不會(huì)影響現(xiàn)有系統(tǒng)。
2.協(xié)議可以復(fù)用。更好地利用現(xiàn)有的資源。