❶ 面向對象編程是不是比過程性編程難一些啊
實質上面向對象要比過程簡單,語法都是差不多的,面向對象就是很多復雜的程序它已經幫你編寫好了,你只需要進行調用它就行了,學習面向對象的程序設計主要就是熟悉那些已經編好的類,大大的縮短了編程時間
❷ 為什麼說面向對象編程和函數式編程都有問題
簡言之,不論是面向對象編程還是函數式編程,如果你走了極端,那都是錯誤的。面向對象編程的極端是一切都是對象(純面向對象)。函數式編程的極端是純函數式編程語言。
面向對象編程的問題
面向對象的問題在於它對「對象」的定義,它試圖將所有事情就納入到這個概念里。這種做法極端化後,你就得出來一個一切皆為對象思想。但這種思想是錯誤的,因為
有些東西不是對象。函數就不是對象。
也許你會反駁,在Python和Scala語言里,函數也是對象。在Python中,所有的含有一個叫做__call__的方法的對象其實都是函數。類似的,在Scala語言里,函數是擁有一個叫做apply方法的對象。但是,經過認真的思考後,你會發現,它混淆了源祖和衍生物的概念。函數是源祖,包含函數的對象實際是衍生物。__call__和apply它們自身首先就是要定義的所謂「函數對象」。Python和Scala實際上是綁架了函數,把它們監禁在「對象」里,然後打上「__call__」 和 「apply」 標簽,把它們稱作「方法」。當然,如果你把一個函數封裝到對象里,你可以像使用一個函數那樣使用對象,但這並不意味著你可以說」函數也是對象「。
大多數的面向對象語言里都缺乏正確的實現一等(first-class)函數的機制。java語言是一個極致,它完全不允許將函數當作數據來傳遞。你可以將全部的函數都封裝進對象,然後稱它們為「方法」,但就像我說的,這是綁架。缺乏一等函數是為什麼Java里需要這么多「設計模式」的主要原因。一旦有了一等函數,你將不再需要大部分的這些設計模式。
函數式編程的問題
相似的,函數式編程走向極端、成為一種純函數式編程語言後,也是有問題的。為了討論這個問題,我們最好先理解一下什麼是純函數式編程語言。出於這個目的,你可能需要閱讀一下Amr Sabry先生(他是我的博士導師)的What is a Purely Functional Language。概述一下就是,純函數式編程語言是錯誤的,因為
有些東西不是純的。副作用是真實存在的。
所謂純函數,基本上就是忽略了物質基礎(矽片、晶體等)表現的特性。純函數式的編程語言試圖通過函數——在函數中傳入傳出整個宇宙——來重新實現整個宇宙。但物理的和模擬的是有區別的。「副作用」是物理的。它們真實的存在於自然界中,對計算機的效用的實現起著不可或缺的作用。利用純函數來模擬它們是註定低效的、復雜的、甚至是醜陋的。你是否發現,在C語言里實現一個環形數據結構或隨機數發生器是多麼的簡單?但使用Haskell語言就不是這樣了。
還有,純函數編程語言會帶來巨大的認知成本。如果你深入觀察它們,你會看到monads使程序變得復雜,難於編寫,而且monad的變體都是拙劣的修改。monads跟Java的「設計模式」具有相同的精神本質。使用monad來表現副作用就像是visitor模式來寫解釋器。你是否發現,在很多其它語言里很簡單的事情,放到Haskell語言就變成了一個課題來研究如何實現?你是否經常會看到一些有著諸如「用Monadic的方式解決一個已經解決的問題」這樣標題的論文?有趣的是,Amr Sabry先生一起合著了這樣一篇論文。他試圖用Haskell語言重新實現Dan Friedman的miniKanren,但他不知道如何構造這些monads。他向Oleg Kiselyov——公認的世界上對Haskell類型系統知識最淵博的人——求教。而且你可能不知道,Amr Sabry先生應該是世界上對純函數編程語言知識最淵博的人了。他們在 Oleg 的幫助下解決了疑難後一起合著了這篇論文。諷刺的是,Dan Friedman——這個程序的原作者——在使用Scheme語言開發時卻沒有遇到任何問題。我在Dan的代碼基礎上重新實現了miniKanren,增加了一個復雜的負操作。為了實現這個,我需要使用約束式邏輯編程和其它一些高級的技巧。鑒於用Haskell語言重寫基本的miniKanren將兩位世界級程序員都難倒了的事實,我不敢想像如果用Haskell的monads如何能實現這些。
有些人認為monads的價值在於,它們「圈定」了副作用的范圍。但如果monads不能真正的使程序變得易於分析或更安全,這種「圈定」有什麼用呢?事實上就是沒用處。本身就跟副作用一樣難於分析理解。沒有一種東西可以說monads能使其簡單而靜態分析辦不到的。所有的靜態分析研究者都知道這點。靜態分析利用了monads的本質,但卻去除了程序員編寫monads代碼的負擔——而不是增加負擔。當然,過度的副作用會使程序很難分析,但你也可以使用C語言寫出純函數,例如:
int f(int x) {
int y = 0;
int z = 0;
y = 2 * x;
z = y + 1;
return z / 3;
}
你用匯編語言也能做到這些。純函數並不專屬於純函數式編程語言。你可以用任何語言寫出純函數,但重要的是,你必須也應該允許副作用的存在。
回首歷史,你會發現,數學上的理想主義是純函數編程語言的背後推動力。數學函數簡單漂亮,但不幸的是,它們只是在你構建原始純粹的模型時才好用。否者它們會變得很醜陋。不要被「范疇論」等標語嚇倒。我對范疇論了解很多。即使是范疇理論學家自己也稱其為「抽象無意義」,因為它們基本上就是用一種怪誕的方式告訴你一些你已經知道的事情!如果你讀過Gottlob Frege的文章Function and concept,你會吃驚的發現,在他的這篇論文前的大多數數學家都錯誤的理解了函數,而這僅僅是剛剛100多年前的事。事實上,數學語言上的很多事情都是有問題的。特別是微積分方面。編程語言的設計者們沒有理由要盲目的學習數學界。
不要盲目的愛上你的模型
無論任何事情,當走向極端時都是有害的。極端化時,面向對象編程和函數式編程都試圖把整個世界裝入它們的特有模型中,但這個世界是在完全不依賴我們的大腦思考的情況下運轉的。如果以為你有一個錘子,就把所有東西都當成釘子,這明顯是不對的。只有通過認清我們的真實世界,才能擺脫信仰對我們的束縛。
不要讓世界適應你的模型。讓你的模型適應世界。
❸ js 是更傾向於函數式編程了還是更傾向於面向對象
js 是更傾向於函數式編程,js是弱類型語言,也可以叫解釋型語言,開始創建js時傾向於函數式編程。隨著js的發展,加入了面向對象的東西,但它是函數式編程。
❹ 如何選擇編程語言
很多語言,像C、Java、Python和JavaScript在幾十年來一直持續支配著他們的各自的領域。另一方面,也要看到近期流行的需求語言,像Swift、Google Go 和 Rust。
怎樣選擇學習哪一種編程語言,其答案取決於學習之後用它來做什麼。許多人的選擇標准僅僅是「學習一門語言最大的需求就是能找到一份高收入的工作」。但這個標准並非人人都適用,還有很多其它的方面要考慮。例如,在大學里使用Python這門語言給學生講授編程,其主要原因在於Python功能強大,學生們能夠很容易地掌握編程概念。對於初學編程的人來說,使用Python是一個不錯的選擇;對於想從事移動程序開發的人來說,學習Swift、C#、Java和JavaScript是很好的選擇;對於web開發來說,在CSS、HTML、JavaScript這樣的前端技術支持下,使用PHP、Java、Python和Ruby on Rails是第一選擇。
如果要完成像訪問關系資料庫這樣的更加具體化的任務,可以學習SQL編程語言。SQL語言並非是用來開發應用程序的,而是用來支持應用程序和資料庫之間的連接。更何況,很多數據驅動應用都在廣泛地使用SQL,如今,對SQL的需求已經超越了對許多工作表的需求。
如果你對硬體編程感興趣,想要開發嵌入式系統、操作系統、通信設備或者復雜的游戲引擎等,那麼選擇的語言依然是C/C++(主要是C)。
1.JavaScript——多用途編程語言
時至今日,對JavaScript的需求依然巨大,招聘網站上充斥著有關JavaScript及其相關技術的招聘信息。JavaScript由Brendan Eich設計,運行在Netscape瀏覽器中。那時,他或許做夢也沒有想到JavaScript會有如此超乎尋常的發展。
JavaScript是WWW的默認語言,並且幾乎每個web瀏覽器都支持JavaScript,它已經成為了web前端開發的世界標准。隨著Node.js的發展,JavaScript的應用領域又擴展到了伺服器端開發,如今和java、.Net、PHP、Ruby on Rails以及其它的伺服器端技術展開了競爭。
JavaScript除了應用於前端和伺服器端開發外,它也快速地發展成為移動應用開發的選擇。開發者可以使用許多流行的JavaScript框架來構建混合移動應用程序,比如ionic、kendo UI和Sencha touch等。
後來,隨著React native框架的興起(由Facebook提出),JavaScript又出現在了Android和iOS原生應用開發領域。
JavaScript無處不在!然而,JavaScript本身不會讓你擁有最高薪酬的開發工作,你還需要學習基於JavaScript的技術、框架和庫(比如Node.js、React、React Native、ionic、jQuery、D3.js和Kendo UI等等)。相關技術的選擇完全取決於你要從事的工作。
說到學習JavaScript,它是一種動態編程語言,並且非常容易入門。熟悉了JavaScript基礎知識之後,你就可以很容易地學習相關的技術,比如 jQuery、Node.js、Angular或React。
2.Python——最好的編程語言
Python是另一種編程語言,目前世界各地的開發者正在使用它進行快速應用程序開發。Python是一種模塊化的、易於學習的、面向對象以及注重可讀性的高級語言。
Python廣泛地應用於教育領域、web與internet開發、科學與數值計算以及大數據、機器學習演算法開發。
Python的深度和廣度使得它成為教育和研究領域的首選語言,世界各地的學生正使用Python來學習編程和構建研究項目。如今很多進行計算機編程的學生把Python作為他們學習的第一門語言。
Python已經廣泛地用於web和internet開發,並且有許多流行的框架,比如Django、Pyramid、Flask和Bottle。Django CMS和Plone是兩種廣泛使用的基於Python的內容管理系統,許多流行網站和web應用程序都在使用它們。
最近,由於對大數據分析和機器學習演算法的需求急速增長,對Python的需求也在快速增長。用Python編寫的許多開源庫能夠實現數據科學廣泛使用的一些核心的機器學習演算法。R是統計與數據科學領域廣泛使用的另一種語言,但是學習曲線比較陡峭。
庫方面,一些流行的Python庫例如用於數學、工程和科學領域的scipy、用於庫建模和數據分析領域的「pandas」,以及其它一些有用的庫,比如iPython、kivy、pyqt和pyside。
3.Java——大眾化的編程語言
Java是大眾化的編程語言,它也是一種永葆青春的語言,多年來一直是各個招聘板塊的寵兒。Java於1990年由 Sun Microsystems公司發布,後來被Oracle公司收購,Java的哲學理念是「編寫一次,到處運行」。
Java廣泛地應用於web開發、企業軟體開發和Android app開發。隨著對運行在Android平台上的移動app的需求不斷增長,對java的應用也達到一個新高度,這也是為什麼全球范圍內對java的需求依然第一的原因。
Java是高級的面向對象的編程語言,學習起來比C++更容易,但是程序的性能要比C或C++差一些。因此,一般不用java構建核心引擎、操作系統或嵌入式系統開發。
4.SQL——結構化查詢語言
SQL結構化查詢語言是一種能被資料庫理解的語言。SQL是由IBM工程師於1970年開發的,用來創建、更新和檢索「System R」這個資料庫管理系統中的數據。從那時起,SQL已經走過了很長的路,時至今日,它仍然是市場最需要的一種技能。
近年來,使用非SQL資料庫來處理大數據的這種需求給SQL蒙上了陰影,但持續的時間不會太長。不久人們就會認識到SQL提供的大數據分析方法更好,它是一種更具有擴展性、可驗證性和經得起時間檢驗的技術。
SQL語言用以輔助進行數據驅動網站、web應用程序、桌面應用程序以及移動應用程序的開發。SQL在任何應用領域都有應用。從學習的角度看,SQL比較容易掌握,並且由於有很高的市場需求,你可以僅僅通過SQL就能找到第一份工作。
然而,要找到一份高薪酬工作,還需要擁有設計、管理和維護多種資料庫,比如Oracle、MySQL、PostgreSQL、IBM DB2和Microsoft SQL Server等的經驗。
5.C#——排名第一的微軟技術
C#是最通用的語言之一,它使得編程像Java語言一樣簡單。C#是類型安全的、面向對象的編程語言,運行在.NET框架運行時環境中。C#代碼被編譯成符合CLI規范的IL語言(中間語言)。
C#語言正迅速成為構建微軟家族各種應用的首選,你可以用來構建客戶端—伺服器應用程序、資料庫應用程序、web服務、移動應用程序、游戲等等。
C#在游戲開發中也有很好的應用(高級的但並非是硬核心),頂級游戲引擎Unity 3D就把C#作為支持的語言之一,除此外只有JavaScript語言被支持。C#還是許多交叉平台應用程序構建工具(如Xamarin)所採用的編碼語言。你可以使用Xamarin產品套件構建交叉平台移動應用程序。
盡管匯編語言是首選的游戲引擎開發工具,要進行硬核心終端游戲開發,仍然可以使用C或C++,Rust語言也可以應用在該領域。
6.C/C++——古老而金貴的編程語言
有人說C++很古老,但卻一致被認為依然金貴。當涉及更注重性能的硬核心系統編程時,C/C++ 仍然是首選的編程語言。C比C++更接近硬體,並且能提供更好的性能。
許多開發者轉向Java,是因為和C++(&C)相比,使用Java更便於開發,而且在很多情況下性能可以通過對硬體部分進行更多的投資而抵消。但並非總是如此,比如對於嵌入式系統,你就只需要管理最少的硬體組件。
C和C++仍然屬於高級編程語言嗎?
C/C++擁有最好的編譯器、開發環境、庫和核心開發部件,還擁有一個在未來也不可能被替換的巨大的生態系統。現有的生態系統和高性能應用程序的需要,使得對C/C++的需求一直很高,而且C/C++開發人員的工資檔次也比較高。
7.Swift——第一個工業質量級的系統編程語言
Swift是相對較新的語言,並且正快速地流行起來。Swift是完全用於Apple的開發語言,例如iOS應用程序、OS X應用程序、watchOS應用程序和tvOS應用程序。Swift引入了C和Objective-c的優點,並且能和cocoa以及cocoa touch框架很好地協同工作。
Apple擁有自己的巨大生態系統,毫無疑問,Swift將成為在未來幾年中引領其發展的語言。如果你想進入Apple生態系統,Swift正是要學習的語言。
Swift學起來很容易,用起來很有趣,究其原因在於它引入了嚴格類型語言(如C、Java、C++)的所有特性,而使用起來和任何腳本語言(如 Ruby或Python)一樣容易和有趣。你可以通過Swift playgrounds嘗試使用Swift,並且可以馬上看到結果,無需擔憂程序的編譯和運行。
Apple聲稱Swift是第一個工業質量級的系統編程語言,它提供了類似腳本的語法,能使開發變得絕對輕松。
8.PHP——基礎的編程語言
許多人認為PHP不是程序設計的未來,但PHP巨大的生態系統使得在未來幾年裡全世界需要大量的開發人員對其提供支持。排名前三的內容管理系統——WordPress、Drupal和Joomla都是使用PHP構建的,而且迄今大概有80%的網站運行在PHP之上。所以,它是巨大的!
PHP是容易學習的語言,它可以作為你進入編程世界的入門語言。PHP屬於就業市場中炙手可熱的語言,你可以找到大量的需要PHP技能的工作機會。PHP開發者的薪資水平和Java、C++、Python或Swift開發者相比,通常偏低。
PHP生態系統包括上述頂尖的內容管理系統(如WordPress、Drupal和Joomla等 )和PHP框架(如Laravel、Symfony、Yii和FuelPHP等)。這些內容管理系統和框架能使開發者在幾天內就構建出可以投入使用的網站和web應用程序。
近年來隨著 Node.js、Django和Ruby on Rails的出現,PHP蒙上了一層陰影,但是PHP正在改進,更新的版本完全可以和新興的語言與技術展開競爭。
9.Ruby——適合學習的編程語言
Ruby是另外一種開源的、面向對象的、通用的編程語言,這是一種簡單的、有助於快速應用開發的語言。Ruby最有名的框架是Rails(Ruby on Rails),這主要被用來web開發。
它在伺服器端開發是很有用的,有很多公司都使用它,如:Bloomberg、Airbnb、Shopify、Hulu和Slideshare等等,且被用在一個或多個項目之中。
Ruby是用來學習的最好的編程語言嗎?
Ruby常常被用來與Python的可讀性進行比較,它提供類英語的語法,這讓 Ruby 成為一個完美的候選者,最適合作為第一個編程語言來學習。
10.Rust——發展迅速的新一代編程語言
Rust是後起之秀,並且承諾要成為新一代的熱門技術。它快速地成為硬核心開發人員所痴迷的技術,並且以非常快的速度發展著。Rust語言還在發展之中,還是一門新語言,因此,Rust的就業市場尚未形成,傳播的深度與廣度還不夠。
Rust語言由Mozilla公司於2010年開發,它是Graydon Hoare所負責的一個研究項目。而現在開發者社區喜愛它並負責對其維護,他們決心將Rust推向一個新的高度。
Rust是一種低級的系統編程語言,其目標是提供高性能、安全性和並發性,它是一個不錯的C/C++的替代語言。過去,C開發人員努力使用Rust編寫操作系統、資料庫、嵌入式程序、內核以及各種系統程序。
Rust是一種現代語言,它擁有高級語言的靈活性和C這樣的低級語言才有的高性能以及對硬體的可控性。
11.其他
下面是另外的一些很受歡迎的編程語言,它們和排名靠前的那些語言進行著激烈的競爭。
GO——Go是谷歌公司推出的一款相對較新的語言,對於web伺服器開發、網路開發以及命令行程序開發來說,它是又一個比較優秀的選擇。
R——當要進行數據分析和統計軟體開發時,你可以選擇R語言。隨著大數據和機器學習的興起,R得以不斷發展並和Python和Matlab展開了激烈競爭。
Perl——最古老的語言之一,但它正越來越受歡迎並顯示出偉大復甦的跡象。DevOps是新生事物, Perl正發展成為用於DevOps的深受歡迎的語言,它或許會成為像Python語言那樣的下一個重要語言。
VisualBasic .Net——微軟公司推出的一種面向對象編程語言,對於開發.Net程序以及web程序和XML web服務這樣的專業領域程序來說,這是一個很好的選擇。
Haskell——統治著函數式編程的世界。和面向對象編程相比,函數式編程具有完全不同的哲學理念。函數式編程在分布式系統開發中應用廣泛,分布式系統開發的關鍵需求是並行執行和並發性。人工智慧和數學計算是函數式編程的又一應用領域,Haskell的應用同樣如此。
❺ 為什麼說面向對象編程和函數式編程
先從結構化編程說起
很久以前,軟體開發的世界還是一片渾渾噩噩,不管開發什麼軟體都面臨著復雜性這個問題,代碼裡面到處是goto語句,程序的流程隨意跳轉。眾生寫代碼時,越寫到後面越不知道自己寫的是什麼。這時候出現一位巨人,它就是結構化編程。
結構化編程的基本思想是:
有序地控制流程,即把程序的執行順序限制為順序、分支和循環這三種;
把共通的處理歸結為常式(函數)。
結構化編程的好處是:
三大限制:大大降低了程序的自由度,減少了各種組合,使得程序不至於太過復雜。對於這一點,結構化編程的順序、分支和循環可以實現一切演算法,雖然降低了程序的復雜性和靈活性,但是程序的實現能力並沒有降低。
常式(函數):我們只需要知道過程(函數)的名字,而不需要知道過程的內部細節,即「黑盒化」。
雖然結構化解決了程序控制流的復雜問題,但程序裡面不僅包括控制結構,還包括要處理的數據。隨著處理數據的增加,程序的復雜性也會上升。這時候,面向對象編程來了!
面向對象的由來
「分別管理程序處理內容和處理數據對象所帶來的復雜性」問題是,為了得到正確的結果,必須保持處理和數據的一致性,這在結構化編程中是非常困難的,解決這一問題的方案就是數據抽象技術。
數據抽象是數據和處理方法的結合。這便是最初「對象」一詞的得來。面向對象編程也因此得名。
然後,從抽象原則來說,多個相同事物出現時,應該組合在一起,即DRY原則(Don't Repeat Yourself),便又引出了類這一概念。
根據數據類型來進行合適的處理(調用合適的方法),本來就應該是編程語言這種工具應該完成的事。這便是多態的引出了。
而對於繼承,大部分的觀點是「繼承是隨著程序的結構化和抽象化自然進化而來的一種方式」。結構化和抽象化,意味著把共通部分提取出來生成父類的自底向上的方法。(如果繼承是這樣誕生的話,那麼最初,有多個父類的多重繼承就會成為主流,而實際上最初引入繼承的Simula語言只提供單一繼承。松本行弘認為繼承的原本目的實際是逐步細化)