文章目錄
- 目錄
- 1.函數式編程和面向對象編程概念
- 1.1 函數式編程
- 1.2 面向對象編程
- 2.函數式編程和面向對象編程的優缺點
- 2.1 函數式編程
- 優點
- 缺點
- 2.2 面對對象編程
- 優點
- 缺點
- 3.為什么在并行計算中函數式編程比較好
- 3.1 什么是并行計算
- 3.2 函數式編程興起原因
目錄
1.函數式編程和面向對象編程概念
1.1 函數式編程
什么是函數式編程?在維基百科中給出了詳細的定義,函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程范型,它將電腦運算視為數學上的函數計算,并且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)
函數式編程,顧名思義,這種編程是以函數思維做為核心,在這種思維的角度去思考問題。這種編程最重要的基礎是λ演算,接受函數當作輸入和輸出。
1.2 面向對象編程
面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程序編程范型,同時也是一種程序開發的方法。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性,對象里的程序可以訪問及經常修改對象相關連的數據。在面向對象程序編程里,計算機程序會被設計成彼此相關的對象。
對象與對象之間的關系是面向對象編程首要考慮的問題,而在函數式編程中,所有的數據都是不可變的,不同的函數之間通過數據流來交換信息,函數作為FP中的一等公民,享有跟數據一樣的地位,可以作為參數傳遞給下一個函數,同時也可以作為返回值。
面向對象編程,這種編程是把問題看作由對象的屬性與對象所進行的行為組成。基于對象的概念,以類作為對象的模板,把類和繼承作為構造機制,以對象為中心,來思考并解決問題。
2.函數式編程和面向對象編程的優缺點
2.1 函數式編程
優點
- 支持閉包和高階函數,閉包是一種可以起函數的作用并可以如對象般操作的對象;而高階函數是可以以另一個函數作為輸入值來進行編程。支持惰性計算,這就可以在求值需要表達式的值得時候進行計算,而不是固定在變量時計算。還有就是可以用遞歸作為控制流程。函數式編程所編程出來的代碼相對而言少很多,而且更加簡潔明了。
- 在函數式編程中,由于數據全部都是不可變的,所以沒有并發編程的問題,是多線程安全的。可以有效降低程序運行中所產生的副作用,對于快速迭代的項目來說,函數式編程可以實現函數與函數之間的熱切換而不用擔心數據的問題,因為它是以函數作為最小單位的,只要函數與函數之間的關系正確即可保證結果的正確性。
- 函數式編程的表達方式更加符合人類日常生活中的語法,代碼可讀性更強。實現同樣的功能函數式編程所需要的代碼比面向對象編程要少很多,代碼更加簡潔明晰。函數式編程廣泛運用于科學研究中,因為在科研中對于代碼的工程化要求比較低,寫起來更加簡單,所以使用函數式編程開發的速度比用面向對象要高很多,如果是對開發速度要求較高但是對運行資源要求較低同時對速度要求較低的場景下使用函數式會更加高效。
缺點
- 由于所有的數據都是不可變的,所以所有的變量在程序運行期間都是一直存在的,非常占用運行資源。同時由于函數式的先天性設計導致性能一直不夠。雖然現代的函數式編程語言使用了很多技巧比如惰性計算等來優化運行速度,但是始終無法與面向對象的程序相比,當然面向對象程序的速度也不夠快。
- 函數式編程雖然已經誕生了很多年,但是至今為止在工程上想要大規模使用函數式編程仍然有很多待解決的問題,尤其是對于規模比較大的工程而言。如果對函數式編程的理解不夠深刻就會導致跟面相對象一樣晦澀難懂的局面。
2.2 面對對象編程
優點
- 面向對象編程:面向對象有三個主要特征,分別是封裝性、繼承性和多態性。類的說明展現了封裝性,類作為對象的模板,含有私有數據和公有數據,封裝性能使數據更加安全依賴的就是類的特性,使得用戶只能看到對象的外在特性,不能看到對象的內在屬性,用戶只能訪問公有數據不能直接訪問到私有數據。類的派生功能展現了繼承性,繼承性是子類共享父類的機制,但是由于封裝性,繼承性也只限于公有數據的繼承(還有保護數據的繼承),子類在繼承的同時還可以進行派生。而多態性是指對象根據接收的信息作出的行為的多態,不同對象接收同一信息會形成多種行為。
- 面向對象程序設計可以看作一種在程序中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反。傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據并將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,面向對象程序設計推廣了程序的靈活性和可維護性,并且在大型項目設計中廣為應用。此外,支持者聲稱面向對象程序設計要比以往的做法更加便于學習,因為它能夠讓人們更簡單地設計并維護程序,使得程序更加便于分析、設計、理解。同時它也是易拓展的,由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
- 在面向對象編程的基礎上發展出來的23種設計模式廣泛應用于現今的軟件工程中,極大方便了代碼的書寫與維護。
- 創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
- 結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
- 行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
缺點
- 面向對象編程以數據為核心,所以在多線程并發編程中,多個線程同時操作數據的時候可能會導致數據修改的不確定性。
- 在現在的軟件工程中,由于面向對象編程的濫用,導致了很多問題。首先就是為了寫可重用的代碼而產生了很多無用的代碼,導致代碼膨脹,同時很多人并沒有完全理解面向對象思想,為了面向對象而面向對象,使得最終的代碼晦澀難懂,給后期的維護帶來了很大的問題。所以對于大項目的開發,使用面向對象會出現一些不適應的情況。
- 面向對象雖然開發效率高但是代碼的運行效率比起面向過程要低很多,這也限制了面向對象的使用場景不能包括那些對性能要求很苛刻的地方。
3.為什么在并行計算中函數式編程比較好
3.1 什么是并行計算
并行計算或稱平行計算是相對于串行計算來說的。它是一種一次可執行多個指令的算法,目的是提高計算速度,及通過擴大問題求解規模,解決大型而復雜的計算問題。所謂并行計算可分為時間上的并行和空間上的并行。 時間上的并行就是指流水線技術,而空間上的并行則是指用多個處理器并發的執行計算。[百度百科]
3.2 函數式編程興起原因
隨著web2.0的到來,無論是數據的數量還是數據的形式都大大的增加。而隨著芯片制造工藝的限制,硬件摩爾定律的失效,而大數據的摩爾定律的發展,對計算機的計算能力要求越來越高,壓力也越來越大。其中并行計算是一個很好的解決方法。而目前比較流行的一種并行計算方式是使用集群進行并行計算。這就需要我們把一個大的任務進行拆解成很多小問題,然后在不同的機器上單獨進行運行,最終將計算結果進行合并,這便是Hadoop中MapReduce的思想。函數式編程具有:不可變性和并行操作性兩個特點,使得函數式編程思想在并行計算中發揮比較大的作用。這也是函數式編程興起的原因。