面向對象思想是什么?
面向對象這個概念提出的時候,可能我們的爹娘還不認識呢。如果是單單講面向對象這個概念的話,任何人聽了,都會產生非常大的迷惑。 很多技術書籍也好,各種高校也罷,偏偏又將面向對象這種概念學術化,就更讓很多人難以理解了。 面向對象其實是說是一種編程潮流,產生在特殊的年代,也終究會在某天被拋棄,就如同很多年前很多女孩子喜歡李宇春那樣中性打扮,現在已經是開始走大長腿風格了,anyway,都是博大家的喜歡, 希望糾結于面向對象是什么的兄弟們,放輕松一點。
既然理解技術潮流離不開歷史背景,那咱們就來掰掰面向對象的歷史吧,也許這里有你想要的答案。
一,起源:
圖零: 人類最早期的語言
在60年代以前, 人類使用的大多數語言應該就是匯編了, 稍微了解匯編的人都知道,當把邏輯分拆到指令集那么細的程度的時候,人類的腦容量是多么的有限,寫一個簡單的 helloword 是多么的復雜!當然,咱們這個星球上總是有高人或者閑人好事者改進我們的效率,就像瓦特發明了蒸汽機一樣。 就在這時 面向對象 的造物主出現了!
圖一:simula 支持 類 / 對象 / 繼承 / 子類 / 虛函數 等特征
60 年代發明的 SIMULA語言 是第一個支持 類,對象,繼承 等特性的編程語言,但是因為發明者總是天天泡在挪威的實驗室里面,SIMULA并沒有在工業界推廣開來。不過金子總是會發光的,70年代, 猶他大學的 Alan Kay教授 發現了 SIMULA 這種語言跟當時其他語言的與眾不同: SIMULA 中對象的概念可以讓很多沒編過程的人輕松寫出一個能用的程序來。 認識到SIMULA 的巨大潛力后,他并沒有開始推廣SIMULA,而是呢,,,, 他就開始抄襲了, 發明了Smalltalk 語言, 而且把它賣了賺了大錢。
圖二:Alan Kay教授本尊
二,流傳:
在70年代末期,同樣受到 Bjorn Stroustrup 將 C語言 和 SIMULA中(類 / 對象 / 繼承 / 子類 / 虛函數)等特征全盤接受并重新整合,且增加了 封裝 的特性,形成了C++ 語言。 到這里想必大家也明白了,程序員們總結了 SIMULA 中的特征, 然后把這些特征聚合起來總稱為 面向對象 的概念, 然后發現這個概念中的不足,對這個概念進行調整,添磚加瓦。 自從C++ 發明之后, 這個語言可以說是席卷全世界, 整個工業界上到應用程序,下到操作系統,都開始使用C++ 作為開發語言。 于此同時,面向對象的概念像一個火種在工業界開始火速蔓延了。 題外話: 我覺得編程語言的概念真類似各種股票概念,比如雄安概念股,騰訊概念股, 華為概念股,阿里概念股。 一個公司可以帶火一個概念!
圖三:Bjorn Stroustrup教授本尊,發型很帥有木有
三,大航海時代:
如果說 simula 將編程界帶入 面向對象 的青銅時代,C++ 直接開啟了面向對象的大航海時代, 從此可以說各種語言是百花齊放,諸子爭鳴, 各顯神通。Delphi, Java, Python, Eiffel, Perl, C# 可是說都是在這波潮流中誕生的。尤其是 Java 語言,與C++ 相比較,去除了指針,多繼承, 增加了垃圾回收機制,形成了一種特別干凈且便于使用的語言,可以說徹底的降低了開發的門檻,你讓一個老大爺過來都會寫代碼!!如果你說C++是蒸汽機的生產力, 那 Java 就是奔馳汽油發動機的生產力, 還可以加渦輪增壓。 這個時候,可以說,整個世界都被 面向對象 統治了!
圖四: 面向對象大航海時代路線圖
三,失落的十年:
從2010開始,面向對象的概念貌似開始跌落神壇。 隨著互聯網的病毒似的發展,很多公司對于并行計算的要求越來越高,而面向對象的特征,卻并不能很好的適用于多核并行編程。在美國,很多大學已經不太注重學生對面向對象的理解了,引用rio的話:
面向對象的核心是封裝狀態和相應的過程。通常面向對象是通過改變內部狀態實現最終目的。調用對象過程的主要目的是產生改變其內部狀態這個副作用(side effect)。這樣封裝的初衷是避免多個主體訪問、修改同一狀態造成混亂。在不少場合這樣的封裝確實也達到了目的,所以面向對象的方式才這么普及。但可變狀態并不適合多核并行計算。如果多個并行進程需要用到同一狀態,對這個狀態的修改會導致一致性問題:由于訪問、修改的先后順序不同,各個進程也許會看到不同的結果。鎖機制能部分的避免一致性問題,但并不解決多核并行的性能問題。不變狀態則不存在這個問題,多個并行進程可以隨意訪問某個狀態。因為狀態是不變的,所以不存在一致性的問題。四,函數式編程的崛起:
相比較面向對象編程,函數式編程的一個最大的好處就是不用維護狀態,因為不用依賴外部的狀態,也不會修改外部狀態,讓函數式編程在多核高并發的任務中顯得得心應手。 說句大實話,就是相對于面向對象而言, 在解決多核高并發問題時,可以讓你少操很多心。這貌似也是大勢所驅吧。
但是我仍然覺得沒有一種剪刀可以剪斷所有種類的繩子,無論是面向對象,還是面向過程,只要用的妥當,小米加步槍也能打出火箭炮的感覺!好吧,我就嘮叨到這里了,睡覺覺去了。。。