pthon_函数式编程与面向对象编程的比较
? 函數式編程作為結構化編程的一種,正在受到越來越多的重視。工程中不在只是面向對象編程,更多的人嘗試著開始使用函數式編程來解決軟件工程中遇到的問題。
??????????? 什么是函數式編程?在維基百科中給出了詳細的定義,函數式編程(英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程范型,它將電腦運算視為數學上的函數計算,并且避免使用程序狀態以及易變對象。函數編程語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。
??????????? ?而在面向對象編程中,面向對象程序設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程序編程范型,同時也是一種程序開發的方法。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性,對象里的程序可以訪問及經常修改對象相關連的數據。在面向對象程序編程里,計算機程序會被設計成彼此相關的對象。
??????????? 對象與對象之間的關系是面向對象編程首要考慮的問題,而在函數式編程中,所有的數據都是不可變的,不同的函數之間通過數據流來交換信息,函數作為FP中的一等公民,享有跟數據一樣的地位,可以作為參數傳遞給下一個函數,同時也可以作為返回值。
?
面向對象編程的優點
??????????? 面向對象程序設計可以看作一種在程序中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反。傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據并將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,面向對象程序設計推廣了程序的靈活性和可維護性,并且在大型項目設計中廣為應用。此外,支持者聲稱面向對象程序設計要比以往的做法更加便于學習,因為它能夠讓人們更簡單地設計并維護程序,使得程序更加便于分析、設計、理解。同時它也是易拓展的,由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
??????????? 在面向對象編程的基礎上發展出來的23種設計模式廣泛應用于現今的軟件工程中,極大方便了代碼的書寫與維護。
??????????? 創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
?
面向對象編程的缺點
??????????? 面向對象編程以數據為核心,所以在多線程并發編程中,多個線程同時操作數據的時候可能會導致數據修改的不確定性。
??????????? 在現在的軟件工程中,由于面向對象編程的濫用,導致了很多問題。首先就是為了寫可重用的代碼而產生了很多無用的代碼,導致代碼膨脹,同時很多人并沒有完全理解面向對象思想,為了面向對象而面向對象,使得最終的代碼晦澀難懂,給后期的維護帶來了很大的問題。所以對于大項目的開發,使用面向對象會出現一些不適應的情況。
??????????? 面向對象雖然開發效率高但是代碼的運行效率比起面向過程要低很多,這也限制了面向對象的使用場景不能包括那些對性能要求很苛刻的地方。
?
函數式編程的優點
??????????? 在函數式編程中,由于數據全部都是不可變的,所以沒有并發編程的問題,是多線程安全的。可以有效降低程序運行中所產生的副作用,對于快速迭代的項目來說,函數式編程可以實現函數與函數之間的熱切換而不用擔心數據的問題,因為它是以函數作為最小單位的,只要函數與函數之間的關系正確即可保證結果的正確性。
??????????? 函數式編程的表達方式更加符合人類日常生活中的語法,代碼可讀性更強。實現同樣的功能函數式編程所需要的代碼比面向對象編程要少很多,代碼更加簡潔明晰。函數式編程廣泛運用于科學研究中,因為在科研中對于代碼的工程化要求比較低,寫起來更加簡單,所以使用函數式編程開發的速度比用面向對象要高很多,如果是對開發速度要求較高但是對運行資源要求較低同時對速度要求較低的場景下使用函數式會更加高效。
?
函數式編程的缺點
??????????? 由于所有的數據都是不可變的,所以所有的變量在程序運行期間都是一直存在的,非常占用運行資源。同時由于函數式的先天性設計導致性能一直不夠。雖然現代的函數式編程語言使用了很多技巧比如惰性計算等來優化運行速度,但是始終無法與面向對象的程序相比,當然面向對象程序的速度也不夠快。
??????????? 函數式編程雖然已經誕生了很多年,但是至今為止在工程上想要大規模使用函數式編程仍然有很多待解決的問題,尤其是對于規模比較大的工程而言。如果對函數式編程的理解不夠深刻就會導致跟面相對象一樣晦澀難懂的局面。
?
總結
??????????? 函數式編程和面向對象編程各有利弊,一個語法更加自由,一個健壯性更好。作為程序員應該對兩種編程方式都有所了解,不管是哪種方式,只要能夠很好的解決當前的問題就是正確的方式,畢竟對于軟件工程來說解決問題是最主要的,用的工具反而沒有那么重要,就像對程序員來說語言不重要,重要的是解決問題的思想。
現在這兩者的發展趨勢是相互借鑒的,許多以面向對象作為基礎的語言例如Java等都在新的版本中添加了對函數式編程的支持,而函數式編程則借鑒了一些在面向對象語言里用的一些編譯技巧使得程序運行更快。
?
函數是Python內建支持的一種封裝,我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把復雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程序設計。函數就是面向過程的程序設計的基本單元。
而函數式編程(請注意多了一個“式”字)——Functional Programming,雖然也可以歸結到面向過程的程序設計,但其思想更接近數學計算。
我們首先要搞明白計算機(Computer)和計算(Compute)的概念。
在計算機的層次上,CPU執行的是加減乘除的指令代碼,以及各種條件判斷和跳轉指令,所以,匯編語言是最貼近計算機的語言。
而計算則指數學意義上的計算,越是抽象的計算,離計算機硬件越遠。
對應到編程語言,就是越低級的語言,越貼近計算機,抽象程度低,執行效率高,比如C語言;越高級的語言,越貼近計算,抽象程度高,執行效率低,比如Lisp語言。
函數式編程就是一種抽象程度很高的編程范式,純粹的函數式編程語言編寫的函數沒有變量,因此,任意一個函數,只要輸入是確定的,輸出就是確定的,這種純函數我們稱之為沒有副作用。而允許使用變量的程序設計語言,由于函數內部的變量狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函數是有副作用的。
函數式編程的一個特點就是,允許把函數本身作為參數傳入另一個函數,還允許返回一個函數!
Python對函數式編程提供部分支持。由于Python允許使用變量,因此,Python不是純函數式編程語言。
轉載于:https://www.cnblogs.com/ne-zha/p/7429962.html
總結
以上是生活随笔為你收集整理的pthon_函数式编程与面向对象编程的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开始我的blog之旅
- 下一篇: bzoj3638