初探函數式編程和面對對象式編程

文章目錄

  • 目錄
    • 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的思想。函數式編程具有:不可變性和并行操作性兩個特點,使得函數式編程思想在并行計算中發揮比較大的作用。這也是函數式編程興起的原因。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445232.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445232.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445232.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux常用解壓和壓縮文件的命令

linux常用解壓和壓縮文件的命令 .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是壓縮!)———————————————.gz解壓1:gunzip FileN…

Python外(4)-讀寫mat文件

讀寫mat文件1.讀取2.寫入.mat 是matlab中數據存儲的標準格式,Python中能夠通過庫scipy讀取和保存。導入scipy庫 from scipy import io 1.讀取 io.loadmat(file_name, mdictNone, appendmatTrue, **kwargs) 簡便方式: io.loadmat(file_name) append mat–…

Linux下的xml文件的創建

創建一個xml文檔流程如下: l 用xmlNewDoc函數創建一個文檔指針doc; l 用xmlNewNode函數創建一個節點指針root_node; l 用xmlDocSetRootElement將root_node設置為doc的根結點; l 給root_node添加一系列的子節點&#x…

壓力測試http_load 通過修改配置測試https協議成功了。

到http://www.acme.com/software/http_load/ 下載http_load ,安裝也很簡單直接make;make instlall 就行。 如果你需要測試https,你必須將 Makefile中 # CONFIGURE: If you want to compile in support for https, uncomment these # definitions. You w…

面向對象設計與分析40講(16)靜態工廠方法模式

前面我們介紹了簡單工廠模式,在創建對象前,我們需要先創建工廠,然后再通過工廠去創建產品。 如果將工廠的創建方法static化,那么無需創建工廠即可通過靜態方法直接調用的方式創建產品: // 工廠類,定義了靜…

搜索詳解

搜索 一.dfs和bfs簡介 深度優先遍歷(dfs) 本質: 遍歷每一個點。 遍歷流程: 從起點開始,在其一條分支上一條路走到黑,走不通了就往回走,只要當前有分支就繼續往下走,直到將所有的點遍歷一遍。 剪枝&a…

Python外(5)-for-enumerate()-zip()

for循環小技巧技巧1:enumerate()技巧2:打包兩個可遍歷數據,一起循環-zip()技巧1:enumerate() 在使用pytorch訓練網絡的過程中,官方教程給出了 for i, data in enumerate(trainloader, 0): 這涉及到enumerate函數的使用…

特征工程總結

目錄1 特征工程是什么? 2 數據預處理   2.1 無量綱化     2.1.1 標準化     2.1.2 區間縮放法     2.1.3 標準化與歸一化的區別   2.2 對定量特征二值化   2.3 對定性特征啞編碼   2.4 缺失值計算   2.5 數據變換 3 特征選擇   3.1 Filter …

Jmeter測試并發https請求成功了

Jmeter2.4 如何測試多個并發https請求,終于成功了借此機會分享給大家 首先要安裝jmeter2.4版本的,而且不建議大家使用badboy,因為這存在兼容性問題。對于安裝,我就不講了,我就說說如何測試https,想必大家都…

關系數據庫——sql基礎1定義

關系數據庫標準語言SQL 基本概念 SQL語言是一個功能極強的關系數據庫語言。同時也是一種介于關系代數與關系演算之間的結構化查詢語言(Structured Query Language),其功能包括數據定義、數據查詢、數據操縱和數據控制。 SQL的特點&#xff…

libcurl編程

一、curl簡介 curl是一個利用URL語法在命令行方式下工作的文件傳輸工具。它支持的協議有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理服…

大數據學習(09)--Hadoop2.0介紹

文章目錄目錄1.Hadoop的發展與優化1.1 Hadoop1.0 的不足與局限1.2 Hadoop2.0 的改進與提升2.HDFS2.0 的新特性2.1 HDFS HA2.2 HDFS Federation3. 新一代的資源管理器YARN3.1 MapReduce1.0 缺陷3.2 YARN的設計思路3.3 YARN 體系結構3.4 YARN工作流程3.5 YARN框架與MapReduce1.0框…

Java多線程常用方法

start()與run() start() 啟動線程并執行相應的run()方法 run() 子線程要執行的代碼放入run()方法 getName()和setName() getName() 獲取此線程的名字 setName() 設置此線程的名字 isAlive() 是判斷當前線程是否處于活動狀態。活動狀態就是已經啟動尚未終止。 curren…

MachineLearning(2)-圖像分類常用數據集

圖像分類常用數據集1 CIFAR-102.MNIST3.STL_104.Imagenet5.L-Sun6.caltech-101在訓練神經網絡進行圖像識別分類時,常會用到一些通用的數據集合。利用這些數據集合可以對比不同模型的性能差異。下文整理常用的圖片數據集合(持續更新中)。基本信息對比表格…

Linux網絡編程實例詳解

本文介紹了在Linux環境下的socket編程常用函數用法及socket編程的一般規則和客戶/服務器模型的編程應注意的事項和常遇問題的解決方法,并舉了具體代 碼實例。要理解本文所談的技術問題需要讀者具有一定C語言的編程經驗和TCP/IP方面的基本知識。要實習本文的示例&…

python的命令解析getopt.getopt()函數分析

【轉自http://hi.baidu.com/javalang/blog/category/Python】 可以參考http://docs.python.org/lib/module-getopt.html # -*- coding: cp936 -*-import getoptimport sysdef usage():print Help Information:-h: Show help information-xValue:...if __name____main__:#set d…

博弈論基礎

博弈論總結 什么是博弈論: 多人進行博弈,假設每個人都采取最優策略,一定有一個人勝出,在知道初態及規則的情況下,求解出 何人勝出的一類問題的理論及方法。 博弈論的一些性質 P點:必敗點,N…

矩陣論-范數理論及其應用

范數理論及其應用2.1向量范數及其性質2.2矩陣范數本系列博文主要總結學習矩陣論的心得筆記,參考數目《矩陣論》–張凱院;整個文章的整理體系參照行書過程。范數–非負實數,用于衡量線性空間元素(如:向量,矩…

大數據學習(09)--spark學習

文章目錄目錄1.spark介紹1.1 spark介紹1.2 scale介紹1.3 spark和Hadoop比較2.spark生態系統3.spark運行框架3.1 基本概念3.2 架構的設計3.3 spark運行基本流程3.4 spark運行原理3.5 RDD運行原理3.5.1 設計背景3.5.2 RDD概念和特性3.5.3 RDD之間的依賴關系3.5.4 stage的劃分3.5.…

探索 Pexpect

概述 通過本系列第一部分 《探索 Pexpect,第 1 部分:剖析 Pexpect 》(請參閱參考資料)的介紹,相信大家已經對 Pexpect 的用法已經有了比較全面的了解,知道 Pexpect 是個純 Python 語言實現的模塊&#xff…