版權申明:本文爲博主窗戶(Colin Cai)原創,歡迎轉帖。如要轉貼,必須註明原文網址 http://www.cnblogs.com/Colin-Cai/p/9431665.html 做者:窗戶 QQ/微信:6679072 E-mail:6679072@qq.com
我這裏以炒菜爲例來給出各類編程範式的示例。html
過程式編程sql
生活的經驗告訴咱們如下的物理現實,事情是按照時間的順序一個步驟接一個步驟的發展。編程裏有一個範式就模擬了這樣的經驗,就是過程式編程。編程
若是如今有一些剛從超市買回來的菜,要吃進肚子,按照過程式編程,能夠以下表示:微信
洗(菜)函數式編程
切(菜)函數
炒(菜)學習
吃(菜)人工智能
以上的代碼中,括號外爲動詞,括號內爲名詞。熟悉過程式的咱們都知道,這裏動詞對應於函數,名詞對應於函數的參數。spa
函數式編程htm
咱們觀察上述的過程式編程對於炒菜這個問題描述,不難發現,這四步的名詞都是菜,但動詞卻不同。
因而咱們換個思想,咱們所要作的實際上都是不斷的改變菜的狀態:
1) 先是經過洗這個動做把菜變成乾淨的菜,洗(菜)則獲得乾淨的菜;
2) 而後乾淨的菜再經過切這個動做獲得切好的菜,注意,這裏乾淨的菜是切這個動做的對象,而洗(菜)則是獲得乾淨的菜,換句話說是切這個動做的對象是洗(菜),因此這裏的總體動做是切(洗(菜));
3) 而後切好的菜經過炒這個動做作成熟的菜,從而到這裏的總體工做是炒(切(洗(菜)));
4) 最後吃的是炒好的菜,總體的動做是吃(炒(切(洗(菜))))。
因而代碼就是
吃(炒(切(洗(菜))))
以上的代碼和過程式編程有很大差異,它突出的是把對象經過動做不斷的變換,而這裏的動詞其實就是函數。因此這種類型的編程叫函數式編程。
邏輯式編程
邏輯式編程是從另一個思路去編程。它強調的是咱們事先知道一系列事實,而後經過這些事實自動推出合理的結果。
代碼可能長這樣:
洗乾淨的菜 <- 洗(髒的菜)
切好的菜 <- 切(洗乾淨的菜)
炒好的菜 <- 炒(切好的菜)
吃菜 <- 吃(炒好的菜)
? 吃菜 <- 髒的菜
以上就輸出吃菜的步驟,問號是咱們具體須要查詢的目的,而其餘的都是事先已經知道的事實,這些事實的排列順序無所謂。
看看這個像不像人的行爲?人先學會一堆看起來彼此獨立的知識,而後用這些知識去本身解決遇到的問題,解決問題的過程其實是人腦在已知的知識中不斷搜索。
因此這種編程範式用於早期的人工智能。
面向對象編程
面向對象編程並不是是一個孤立的編程範式,它通常和以上幾種編程範式綁定在一塊兒。咱們最多見的面向對象編程一般主要基於過程式編程。
面向對象的思想是把處理抽象爲數據、方法,再把數據、方法打包抽象爲對象,在對象的基礎上提取共性抽象爲類,這些則爲封裝,再引入繼承、多態等性質來體現類與類之間的關係。
炒菜總體圍繞着菜來,那麼咱們能夠將圍繞菜的一切當作一個對象,用面向對象描述,可能以下:
菜.洗()
菜.切()
菜.炒()
菜.吃()
面向對象+函數式
面向對象也會常常和函數式結合在一塊兒,明確了程序中的數據對象,而函數則是對象的方法,而對象方法的調用流體現了對象的轉換。
菜.洗().切().炒().吃()
上述每一個方法的調用都會返回一個新的對象,從而又可使用方法。這種方始的編程目前很流行。
回到計算機
計算機不少東西實際是來源於生活,可是大多時候,咱們在生活中的不少經驗是表達的不夠規範的。而計算機中咱們要學習的其實是把這些經驗形式化、規範化,引入更加抽象化的元素,好比數學,以便反覆應用乃至推廣。
上面列舉的各類編程範式,思惟的重心彼此都有明顯差別,咱們學習不一樣的範式實際上也是爲了避免同角度的看待問題,以求思路更加寬廣。