開始學習函數式編程後對編程的一些新感覺

咱們絕大多數程序員都是用命令式編程,由於學校教的編程就是命令式的,什麼C、Java等等(固然他們也能夠用函數式編程)。函數式編程和命令式編程不是一個相對應層次的概念。理論上,函數式編程的理論基礎是Lambda演算,指令式編程基於圖靈機。從程序員角度來看,函數式編程不支持賦值操做,一個函數的執行只會返回一個值,不會有任何反作用,因此看上去,一個函數就是一個大的表達式。程序員

這裏再也不深刻去談函數式編程,更多能夠看看前面提到的那個專題。算法

1. 編程究竟是什麼?

編程(程序設計)其實是一個對現實世界中的事物抽象,並由計算機語言實現的過程。核心的步驟就包含三個:理解、抽象、實現。數據庫

不一樣的理解思路,會致使徹底不一樣的抽象結果;不一樣的抽象結果就會提供各不一樣的理解。最後根據理解和抽象,由特定的語言完成時間,但其結果要想徹底理解還須要前兩個步驟支撐。編程

有點像建築中的「房子是什麼,房地產設計,蓋房子」。數據結構

2. 編程的發展過程到底有哪些?

程序設計的歷史,按照個人理解大體的幾個主要階段:併發

  1. 計算機程序設計歷史前階段;主要是紙帶、存儲器等原始方式。編程語言

  2. 計算機語言初級階段;主要以彙編語言爲主,面向的主要內容是「數據存儲+指令集」;函數式編程

  3. 計算機普遍工業語言設計階段;主要以C語言爲主的大面積應用,此時由C語言更面向人易懂的方向發展。而且操做系統,編譯器,數據庫軟件開始發展;面向的主要內容是「程序=算法+數據結構」。此時在計算機軟件設計學科中主要運用的仍是「面向過程」的設計思路。函數

  4. 計算機語言高級發展階段。主要是一些面嚮對象語言的出現。主要體如今C++語言的出現。主要面向的內容是「應用=對象+通信」的方式。甚至不少語言開始「一切皆對象」的設計理念。面向對象的語言主要在該階段獲得了大力提倡。由於C++的複雜,Java的出現下降了複雜度,又充分利用了面向對象的特色。讓面向對象的設計更是獲得了大面積的推廣和應用,尤爲在企業級應用開發中。高併發

  5. 各種語言頻繁出現的繁榮各階段。各種變成設計語言如面向WEB變成,函數式語言,面向併發的語言,終端設備的編程語言等等;這個階段很差作評論。

3. 編程的過程解決的問題有哪些?

  1. 彙編語言:解決CPU指令集和存儲系統的交互問題,提供「可編程」的能力

  2. 面向過稱語言:提供小面積的問題解決思路,一個系統的代碼若是很少,經過面向過程思路將系統劃分爲多個過程(多個函數+各種數據結構)進行系統設計。提供了初級規模的系統設計問題。

  3. 面嚮對象語言:當面向過程面對複雜的系統,複雜的世界時。如何「更好的理解和抽象」編程問題,變得更加劇要。經過面嚮對象語言的特色「封裝、繼承、多態」,讓程序分析和設計能容納更大的編程範圍和系統規模,也讓程序設計人員更好的理解和抽象提供了很是重要的做用。

  4. 面向**語言:面向WEB,面向高併發,面向切面,函數式語言,終端開發等是在現有程序設計語言基礎上不斷改進,並解決特定領域特定問題的發展衍生;

4. 面向對象編程思想的重要性體現是什麼?

你們都知道,面向對象的三大特性「封裝、繼承、多態」,但我的認爲其中的「封裝」是面向對象的最核心的特色。

究其緣由,主要是「封裝」讓一我的能夠理解的系統範圍能夠變得更廣,可讓咱們「更好的理解和抽象」咱們所看到的世界。以前一個老師提到面向對象時,提到的是「間接」,我想間接也能夠認爲是「封裝」的升級版。面向對象的思想帶來「可維護性,可擴展性,可理解性」等讓咱們能在效率和水平上更加長進的東西。

5. 編程,就是控制複雜性

且慢!

面向對象雖然有如此多好處,C++與Java都所以得以普遍地使用。可是,一味地追求可維護性,卻忽略了一點:編程,就是控制複雜性。還記得編程發展史初級階段那會的「數據存儲+指令集」,「程序=算法+數據結構」麼?函數式編程語言,可以讓你的編程更純粹,更加直接地面向問題的本質。(《函數式編程有哪些優勢?》

6. 總結一句話

不管是面向過程、面向對象、仍是函數式編程,都是編程範式,即編程的方法。而具體用什麼編程語言則是工具。

咱們編程的目的就是解決具體問題,而不是說比較工具與方法的優劣。好比你要砍一棵樹,用斧子橫砍可以砍倒,用鋸子斜鋸也能鋸斷,而非要比較斧子和鋸子的優劣而意義不大,橫着砍和斜着鋸也沒多大關係。咱們的目的就是要木材,這就是編程最本質目的。

固然,我仍是推薦多掌握幾個工具,多學會幾個方法。好比你如今只會PHP(斧子),命令式編程(砍),那麼你見到什麼樹都只能用斧子砍。假如你再懂Python(鋸子),函數式編程(鋸),那麼對某些樹效率就會高不少。

相關文章
相關標籤/搜索