面向對象思想是什麼?

華麗的轉身138303170


面向對象這個概念提出的時候,可能我們的爹孃還不認識呢。如果是單單講面向對象這個概念的話,任何人聽了,都會產生非常大的迷惑。 很多技術書籍也好,各種高校也罷,偏偏又將面向對象這種概念學術化,就更讓很多人難以理解了。 面向對象其實是說是一種編程潮流,產生在特殊的年代,也終究會在某天被拋棄,就如同很多年前很多女孩子喜歡李宇春那樣中性打扮,現在已經是開始走大長腿風格了,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)。這樣封裝的初衷是避免多個主體訪問、修改同一狀態造成混亂。在不少場合這樣的封裝確實也達到了目的,所以面向對象的方式才這麼普及。但可變狀態並不適合多核並行計算。如果多個並行進程需要用到同一狀態,對這個狀態的修改會導致一致性問題:由於訪問、修改的先後順序不同,各個進程也許會看到不同的結果。鎖機制能部分的避免一致性問題,但並不解決多核並行的性能問題。不變狀態則不存在這個問題,多個並行進程可以隨意訪問某個狀態。因為狀態是不變的,所以不存在一致性的問題。


四,函數式編程的崛起:

相比較面向對象編程,函數式編程的一個最大的好處就是不用維護狀態,因為不用依賴外部的狀態,也不會修改外部狀態,讓函數式編程在多核高併發的任務中顯得得心應手。 說句大實話,就是相對於面向對象而言, 在解決多核高併發問題時,可以讓你少操很多心。這貌似也是大勢所驅吧。


但是我仍然覺得沒有一種剪刀可以剪斷所有種類的繩子,無論是面向對象,還是面向過程,只要用的妥當,小米加步槍也能打出火箭炮的感覺!好吧,我就嘮叨到這裡了,睡覺覺去了。。。


李coder


這是一個非常好的問題,建立面向對象編程思想是學習面向對象編程的關鍵,下面就把面向對象思想做一個總結。

什麼是面向對象思想呢?簡單的說就是考慮問題以對象為出發點而不是以流程為出發點,通過對象之間的交互完成一系列功能的實現,這就是面向對象思想。

對象又是什麼呢?簡單的說就是一切都是對象,對象能夠涵蓋所有我們已經認知的事物和未認知的事物,只要是存在的東西都可以認為是對象,比如“黑洞”、“暗物質”等等,所以對象的範圍非常廣泛。

面向對象思想如何落地呢?面向對象編程思想包括四個概念、三個特徵、一個過程,下面分別解釋一下(以Java語言為例):

四個概念分別是類、對象、屬性和方法,其中類表示定義,對象表示類的實例,屬性表示對象的狀態,方法表示對象的功能。舉個例子,比如我們要通過面向對象的思維方式來描述學生,那麼就需要為學生構建一個類:

類中定義了學生的學號和姓名,同時定義了一個打印學生信息的方法,這就是類,但是類只是一個定義,要想完成具體的應用,需要通過類來創建出一個實例,這個實例就是對象,看一個例子:

例子中通過構造方法創建初始化了一個實例,這個時候,這個實例就是一個實實在在存在的對象了,此時這個對象就可以調用方法來實現功能了。

通過這個例子,我們可以瞭解類、對象、屬性、方法之間的關係,同時也闡述了面向對象的編程過程,這個過程分為三個步驟,分別是類的定義、對象的創建、方法的調用。

三個特徵分別是封裝、繼承和多態,其中封裝提高類的內聚性,封裝包括三個步驟,分別是私有化成員屬性、定義設置器、定義獲取器,看一個例子:

繼承是在一個類的基礎之上再派生出一個新類的過程,通過繼承,子類能夠完成對父類方法的繼承,看一個例子:

繼承體現的是一種發展的概念,是面向對象編程過程中的一個重要概念。

多態的理解是一個稍微麻煩的事情,但是簡單的總結一下,多態可以用兩個方法和三個定義來描述多態。兩個方法分別是方法重載和方法重寫,三個定義分別是父類定義子類構建、抽象類定義實體類構建、接口定義實體類構建。

先看一下方法重載,方法重載簡單的說就是同一個類中定義了多個方法,具有相同的名字,不同的參數列表,看一個例子:

方法重寫簡單的說就是一個前提、三個相同、兩個規定,一個前提是在繼承體系結構下,子類定義了某個方法與父類的方法具有相同的名字、參數列表、返回值類型,兩個規定分別是子類方法的範圍限定不能小於父類方法,子類方法不能拋出更多的異常,看一個例子:

下面再看一下三個定義,三個定義是理解多態的重點,也是一個小難點。第一個定義是父類定義子類構建,看一個例子:

第二個定義是接口定義實體類構建,看一個例子:

第三個定義是抽象類定義實體類構建,看一個例子:

以上內容就是對面向對象編程思想的一個簡單描述,面向對象思想現在已經有了很大的擴展,Spring就是面向對象編程和麵向方面編程結合的例子,Spring目前在Java開發領域也有廣泛的應用。

我做軟件開發工作多年,目前的研究方向是大數據和人工智能,也在帶大數據方向的研究生,我會陸續在頭條寫一些關於軟件開發方面的文章,感興趣的朋友可以關注我的頭條號,相信一定會有所收穫。

如果有軟件開發方面的問題,也可以諮詢我。

謝謝!


IT人劉俊明


面向對象的思想主要是把構成問題的各個事務分解成各個對象,在解決問題的過程中圍繞著“找對象”,“搞對象”來處理問題。


一切皆對象。


把很多的處理步驟都交給所創建的對象去處理,通俗簡單的來說就是“你辦事,我放心”。詳細的可以看下配圖,描述的還是比較形象的。


玩著學編程


面向對象是程序設計的方法之一,也是目前最為流行的設計方法。作為面試問題,考官無非是想知道你會不會實裝,懂不懂類,繼承,多態,封裝這些知識。或者是想知道你會不會設計,懂不懂用例圖,配置圖,類圖,時序圖這些知識。相信回答中一定有非常精彩的說明。下面我分享幾個代表性的軟件設計方法拓展一下知識面吧。

面向過程

這是最早的結構化的編程思想。它把一個系統分成若干功能模塊,然後用輸入輸出將模塊聯繫起來。C語言,Basic,Fotran等早期編程語言都是以這種思想為基礎的。面向過程的設計手法主要是流程圖和狀態圖。特別是狀態機,可分為摩爾機和米莉機都是面向過程中非常重要的理論。C語言中的回調函數,VB的事件(event),Oracle存儲過程中的Trigger等都是基於狀態機理論設計的。面向過程的設計接近於計算機的運算過程,適合於流程控制要求嚴格的場合,在一些硬件控制的程序設計上仍被廣泛採用。不過,功能模塊還有狀態這些概念跟硬件配置太接近了,在管理系統應用領域運用起來很牽強,導致系統複雜難懂,設計的可靠性能極低。於是,人們開始思考接近管理模型的設計方法。

面向數據流

這是一種非常接近管理組織結構的設計方法。它把管理體制中的職能作為模塊,模塊通過數據連成整體,這樣就定義了業務模型。按照一定的規則,邏輯模型可以被轉化成包含輸入輸出數據存儲和程序模塊的物理模型。這被稱為結構化的設計思想。面向數據流中邏輯模型和物理模型相結合的思想,大大提高了設計的可靠性,這一思想曾經是現在仍是信息系統設計的標準思路。SQL,ER等語言和設計方法都是從這一思想關係密切。值得一提的是ER模型,它就是面向對象思想的鼻祖。

面向對象

儘管有了邏輯和物理相結合的結構化思想,程序代碼上的耦合性依舊嚴重影響系統的可靠性。比如,相同的處理被重複地被複制到不同的畫面,經多次調試之後出現差異,導致錯誤。或者,本來不同的處理被強制做成共同函數,使用時不得不用大量分枝導致複雜度激增。為了解決這個問題,引入了對象的概念。最初人們從業務數據中抽出能保持業務特徵的最小數據組合作為實體,實體之間用一對一,一對多和多對多來表現關係。這種做法在數據庫表結構設計上取得了成功。抽出業務元素的思想被擴展為對象。對象之間的關係定義為繼承,多態和封裝。雖然不象ER模型那樣嚴密,但對象的概念很實用。被廣泛接受。面向對象繼承了結構化設計思想,用例圖>配置圖>邏輯時序圖>邏輯類圖>物理類圖的設計過程更好地實現了準確設計邏輯模型精確設計實裝程序的目的。

面向服務架構

嚴格地說這個思想已經超越了程序設計的範疇,它的目標是將物理實現集中封裝到服務器上,客戶端只要關注邏輯運用就可以了。這個思路現在也很普及,SOAP,RPC之類就是這一思想的應用場景。封裝物理實現一直都是程序設計的改善目標之一,跟這個思想類似的還有AGENT的思路,就是把功能封裝到AGENT上,分佈式的電腦網絡可以通過調用AGENT實現邏輯功能。這個思路因安全問題被擱置了。現在隨著區塊鏈技術的發展,或許AGENT的思想會重現江湖吧。


日衝信息 黃


繼承、封裝、多態,是面向對象最基本的原則。


分享到:


相關文章: