1. 程式人生 > >函數語言程式設計與面向物件程式設計的比較

函數語言程式設計與面向物件程式設計的比較

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

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

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

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

面向物件程式設計的優點

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

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

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

結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

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

面向物件程式設計的缺點

            面向物件程式設計以資料為核心,所以在多執行緒併發程式設計中,多個執行緒同時操作資料的時候可能會導致資料修改的不確定性。

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

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

函數語言程式設計的優點

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

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

函數語言程式設計的缺點

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

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

總結

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