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