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