轉自: http://www.cnblogs.com/zhenw/p/6160931.html html
函數式編程做爲結構化編程的一種,正在受到愈來愈多的重視。工程中不在只是面向對象編程,更多的人嘗試着開始使用函數式編程來解決軟件工程中遇到的問題。程序員
什麼是函數式編程?在維基百科中給出了詳細的定義,函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程範型,它將電腦運算視爲數學上的函數計算,而且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。並且λ演算的函數能夠接受函數看成輸入(引數)和輸出(傳出值)。編程
而在面向對象編程中,面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是種具備對象概念的程序編程範型,同時也是一種程序開發的方法。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象做爲程序的基本單元,將程序和數據封裝其中,以提升軟件的重用性、靈活性和擴展性,對象裏的程序能夠訪問及常常修改對象相關連的數據。在面向對象程序編程裏,計算機程序會被設計成彼此相關的對象。設計模式
對象與對象之間的關係是面向對象編程首要考慮的問題,而在函數式編程中,全部的數據都是不可變的,不一樣的函數之間經過數據流來交換信息,函數做爲FP中的一等公民,享有跟數據同樣的地位,能夠做爲參數傳遞給下一個函數,同時也能夠做爲返回值。安全
面向對象編程的優勢多線程
面向對象程序設計能夠看做一種在程序中包含各類獨立而又互相調用的對象的思想,這與傳統的思想恰好相反。傳統的程序設計主張將程序看做一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每個對象都應該可以接受數據、處理數據並將數據傳達給其它對象,所以它們均可以被看做一個小型的「機器」,即對象。目前已經被證明的是,面向對象程序設計推廣了程序的靈活性和可維護性,而且在大型項目設計中廣爲應用。此外,支持者聲稱面向對象程序設計要比以往的作法更加便於學習,由於它可以讓人們更簡單地設計並維護程序,使得程序更加便於分析、設計、理解。同時它也是易拓展的,因爲繼承、封裝、多態的特性,天然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,並且成本較低。併發
在面向對象編程的基礎上發展出來的23種設計模式普遍應用於現今的軟件工程中,極大方便了代碼的書寫與維護。編程語言
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。函數式編程
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。函數
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
面向對象編程的缺點
面向對象編程以數據爲核心,因此在多線程併發編程中,多個線程同時操做數據的時候可能會致使數據修改的不肯定性。
在如今的軟件工程中,因爲面向對象編程的濫用,致使了不少問題。首先就是爲了寫可重用的代碼而產生了不少無用的代碼,致使代碼膨脹,同時不少人並無徹底理解面向對象思想,爲了面向對象而面向對象,使得最終的代碼晦澀難懂,給後期的維護帶來了很大的問題。因此對於大項目的開發,使用面向對象會出現一些不適應的狀況。
面向對象雖然開發效率高可是代碼的運行效率比起面向過程要低不少,這也限制了面向對象的使用場景不能包括那些對性能要求很苛刻的地方。
函數式編程的優勢
在函數式編程中,因爲數據所有都是不可變的,因此沒有併發編程的問題,是多線程安全的。能夠有效下降程序運行中所產生的反作用,對於快速迭代的項目來講,函數式編程能夠實現函數與函數之間的熱切換而不用擔憂數據的問題,由於它是以函數做爲最小單位的,只要函數與函數之間的關係正確便可保證結果的正確性。
函數式編程的表達方式更加符合人類平常生活中的語法,代碼可讀性更強。實現一樣的功能函數式編程所須要的代碼比面向對象編程要少不少,代碼更加簡潔明晰。函數式編程普遍運用於科學研究中,由於在科研中對於代碼的工程化要求比較低,寫起來更加簡單,因此使用函數式編程開發的速度比用面向對象要高不少,若是是對開發速度要求較高可是對運行資源要求較低同時對速度要求較低的場景下使用函數式會更加高效。
函數式編程的缺點
因爲全部的數據都是不可變的,因此全部的變量在程序運行期間都是一直存在的,很是佔用運行資源。同時因爲函數式的先天性設計致使性能一直不夠。雖然現代的函數式編程語言使用了不少技巧好比惰性計算等來優化運行速度,可是始終沒法與面向對象的程序相比,固然面向對象程序的速度也不夠快。
函數式編程雖然已經誕生了不少年,可是至今爲止在工程上想要大規模使用函數式編程仍然有不少待解決的問題,尤爲是對於規模比較大的工程而言。若是對函數式編程的理解不夠深入就會致使跟面相對象同樣晦澀難懂的局面。
總結
函數式編程和麪向對象編程各有利弊,一個語法更加自由,一個健壯性更好。做爲程序員應該對兩種編程方式都有所瞭解,不論是哪一種方式,只要可以很好的解決當前的問題就是正確的方式,畢竟對於軟件工程來講解決問題是最主要的,用的工具反而沒有那麼重要,就像對程序員來講語言不重要,重要的是解決問題的思想。
如今這二者的發展趨勢是相互借鑑的,許多以面向對象做爲基礎的語言例如Java等都在新的版本中添加了對函數式編程的支持,而函數式編程則借鑑了一些在面嚮對象語言裏用的一些編譯技巧使得程序運行更快