函數式編程與物件導向編程的比較_編程思想

來源:互聯網
上載者:User

函數式編程作為結構化編程的一種,正在受到越來越多的重視。工程中不在只是物件導向編程,更多的人嘗試著開始使用函數式編程來解決軟體工程中遇到的問題。

            什麼是函數式編程。在維基百科中給出了詳細的定義,函數式編程(英語:functional programming)或稱函數程式設計,又稱泛函編程,是一種編程範型,它將電腦運算視為數學上的Function Compute,並且避免使用程式狀態以及易變對象。函數程式設計語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。

             而在物件導向編程中,物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程式編程範型,同時也是一種程式開發的方法。它可能包含資料、屬性、代碼與方法。對象則指的是類的執行個體。它將對象作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充性,對象裡的程式可以訪問及經常修改對象相關連的資料。在物件導向程式編程裡,電腦程式會被設計成彼此相關的對象。

            對象與對象之間的關係是物件導向編程首要考慮的問題,而在函數式編程中,所有的資料都是不可變的,不同的函數之間通過資料流來交換資訊,函數作為FP中的一等公民,享有跟資料一樣的地位,可以作為參數傳遞給下一個函數,同時也可以作為傳回值。

 

物件導向編程的優點

            物件導向程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反。傳統的程式設計主張將程式看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。物件導向程式設計中的每一個對象都應該能夠接受資料、處理資料並將資料傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,物件導向程式設計推廣了程式的靈活性和可維護性,並且在大型項目設計中廣為應用。此外,支援者聲稱物件導向程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。同時它也是易拓展的,由於繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴充,而且成本較低。

            在物件導向編程的基礎上發展出來的23種設計模式廣泛應用於現今的軟體工程中,極大方便了代碼的書寫與維護。

            建立型模式,共五種:Factory 方法模式、抽象原廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、面板模式、橋接模式、組合模式、享元模式。

行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解譯器模式。

 

物件導向編程的缺點

            物件導向編程以資料為核心,所以在多線程並發編程中,多個線程同時操作資料的時候可能會導致資料修改的不確定性。

            在現在的軟體工程中,由於物件導向編程的濫用,導致了很多問題。首先就是為了寫可重用的代碼而產生了很多無用的代碼,導致代碼膨脹,同時很多人並沒有完全理解物件導向思想,為了物件導向而物件導向,使得最終的代碼晦澀難懂,給後期的維護帶來了很大的問題。所以對於大項目的開發,使用物件導向會出現一些不適應的情況。

            物件導向雖然開發效率高但是代碼的運行效率比起面向過程要低很多,這也限制了物件導向的使用情境不能包括那些對效能要求很苛刻的地方。

 

函數式編程的優點

            在函數式編程中,由於資料全部都是不可變的,所以沒有並發編程的問題,是多安全執行緒的。可以有效降低程式運行中所產生的副作用,對於快速迭代的項目來說,函數式編程可以實現函數與函數之間的熱切換而不用擔心資料的問題,因為它是以函數作為最小單位的,只要函數與函數之間的關係正確即可保證結果的正確性。

            函數式編程的表達方式更加符合人類日常生活中的文法,代碼可讀性更強。實現同樣的功能函數式編程所需要的代碼比物件導向編程要少很多,代碼更加簡潔明晰。函數式編程廣泛運用於科學研究中,因為在科研中對於代碼的工程化要求比較低,寫起來更加簡單,所以使用函數式編程開發的速度比用物件導向要高很多,如果是對開發速度要求較高但是對運行資源要求較低同時對速度要求較低的情境下使用函數式會更加高效。

 

函數式編程的缺點

            由於所有的資料都是不可變的,所以所有的變數在程式運行期間都是一直存在的,非常佔用運行資源。同時由於函數式的先天性設計導致效能一直不夠。雖然現代的函數式程式設計語言使用了很多技巧比如惰性計算等來最佳化運行速度,但是始終無法與物件導向的程式相比,當然物件導向程式的速度也不夠快。

            函數式編程雖然已經誕生了很多年,但是至今為止在工程上想要大規模使用函數式編程仍然有很多待解決的問題,尤其是對於規模比較大的工程而言。如果對函數式編程的理解不夠深刻就會導致跟面相對象一樣晦澀難懂的局面。

 

總結

            函數式編程和物件導向編程各有利弊,一個文法更加自由,一個健壯性更好。作為程式員應該對兩種編程方式都有所瞭解,不管是哪種方式,只要能夠很好的解決當前的問題就是正確的方式,畢竟對於軟體工程來說解決問題是最主要的,用的工具反而沒有那麼重要,就像對程式員來說語言不重要,重要的是解決問題的思想。

現在這兩者的發展趨勢是相互借鑒的,許多以物件導向作為基礎的語言例如Java等都在新的版本中添加了對函數式編程的支援,而函數式編程則借鑒了一些在物件導向語言裡用的一些編譯技巧使得程式運行更快。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.