五分鐘理解什么是面向對象
昨天講了MVC,有同學表示還想了解一些軟件開發架構方面的姿勢。我琢磨了半天,列了不少技術名詞,本來想挑一個出來講一講,寫了一半發現有很多前置知識之前沒涉及,于是決定把坑填一填,先從基礎的「面向對象」講起。
話說起來,面向對象的產生還有各位產品經理的功勞。為什么這樣說呢?因為一開始的時候,并沒有面向對象,只有面向過程的概念。面向過程很好理解,指的是程序員接到需求,會把它拆成一個一個的命令,然后串起來交給計算機去執行。舉個例子,產品經理說要把大象裝進冰箱里。程序員列了幾個步驟:
- 把冰箱門兒打開。
- 把大象裝進去。
- 把冰箱門兒關上。
上面每一個步驟,程序員都會用一個「函數」來實現?!负瘮怠故且恍┐a的集合體,每個函數可以實現一個功能。比如我要定義一個打開冰箱門的函數:
所有函數定義好了之后,依次調用就可以了:
- openTheDoor();
- pushElephant();
- closeTheDoor();
需求完成,順利交工。但是你以為這樣就結束了?Naive。產品經理說才剛剛開始呢。
- 「我要把大象裝微波爐里」
- 「我要把獅子也裝冰箱里」
- 「我要把大象裝冰箱,但是門別關,敞著就行」
- 。。。
如果還是用面向過程的方法來應付,每次需求的變更,程序員就要把整個系統通讀一遍,找出可用的函數(如果沒有就再定義一個),最后依次調用它們。最后系統越來越雜亂無章難以管理,程序員不堪重負,紛紛操起刀走上了犯罪的道路。
面向對象從另一個角度來解決這個問題。它拋棄了函數,把「對象」作為程序的基本單元。那么對象到底是個什么東西呢?對象就是對事物的一種抽象描述。人們發現,現實世界中的事物,都可以用「數據」和「能力」來描述。比如我要描述一個人,「數據」就是他的年齡、性別、身高體重,「能力」就是他能做什么工作,承擔什么樣的責任。描述一臺電視,「數據」就是它的屏幕尺寸、亮度,「能力」就是播放《葫蘆娃》。
面向對象的世界里,到處都是對象。對象不光有「數據」和「能力」,還可以接受命令。例如你可以讓「狗」這個對象「吃狗糧」,就可以把「吃狗糧」的命令發給「狗」讓其執行,然后我們就實現了「狗吃狗糧」的需求。
現在對象有了,如何進行面向對象的編程呢?很簡單,依次向不同的對象發送命令就可以了?;氐缴厦娴睦樱妹嫦驅ο髞韺崿F,我們會先定義一個「冰箱」對象,它的「數據」就是當前的冷凍溫度,或者該冰箱已經有了多少頭大象,「能力」就是開門、關門。還有一個「大象」對象,它的「數據」可以是大象的智商、體積,「能力」就是「自己跑到冰箱里去」。然后我們依次:
- 向冰箱下達「開門」的命令。
- 向大象下達「進冰箱」的命令。
- 向冰箱下達「關門」的命令。
面向對象有很多特性,你可能聽說過繼承、封裝、多態的概念,但我不準備在這里講這些(可能后面的文章會介紹),我就說下我理解的面向對象,最重要的兩個特性。
自己的事情自己做。
我們創建的對象,應該是剛剛好能做完它能做的事情,不多做,不少做。多做了容易耦合,各種功能雜糅在一個對象里。比如我有一個對象叫「汽車」,可以「行駛」,可以「載人」,現在的需求是要實現「載人飛行」,就不能重用這個對象,必須新定義一個對象「飛機」來做。如果你給「汽車」插上了翅膀,賦予了它「飛行」的能力,那么新來的同學面對你的代碼就會莫名其妙,無從下手。
面向接口編程。
現在我們把「數據」和「行為」都封裝到了對象里,相當于對象成了一個黑匣子,那我們怎么知道對象具有什么樣的能力呢?這個問題的關鍵就是接口。關于接口,之前的文章《5分鐘理解什么是接口》有過介紹。對象把它的能力通過接口的方式公布出來,自己則成為接口的實現者。這樣調用者就不用關心接口背后的對象是什么東西,如何實現的了。還是上面的例子,產品經理現在說要把大象放洗衣機里,通過我們的分析,洗衣機也需要有「開門」、「關門」的能力。那么我們就可以抽象出一個接口來,它就是「開門」和「關門」的能力集合,假設我們稱之為「大象之家」接口。我們的對象冰箱、微波爐、洗衣機都實現「大象之家」的接口,盡管實現方式不一樣,但是在外界看來,它們都是一樣的,都是可以盛放大象的容器。這樣我們編程的時候就可以這樣寫:
- 向大象之家下達「開門」的命令。
- 向大象下達「進冰箱」的命令。
- 向大象之家下達「關門」的命令。
至于大象之家到底是個什么東西,我們不care。即使哪天變成了馬桶,「開門」和「關門」的具體實現交給負責馬桶對象的同事,我們只管調用就可以了。
面向對象就先講這些吧,封裝、繼承和多態暫且當做一個坑,以后來填。年紀大了好忘事兒,你們如果想了解的話,記得提醒我哈。
#專欄作家#
給產品經理講技術,微信公眾號(pm_teacher),人人都是產品經理專欄作家。資深程序猿,專注客戶端開發若干年,對前端、后臺技術略懂,熱衷于對新的科技領域的探索。
本文原創發布于人人都是產品經理,未經許可,不得轉載。
是否程序的世界里,所有的方案都要基于面向對象來做?面向過程就徹底被廢棄了嗎,是否在某些場景下還是有用武之地。
世間萬物皆為對象;然而你如何去解釋一個對象到底是啥…
不錯,通俗易懂。希望接著講對象的特性
不錯,通俗易懂。希望接著講對象的特性
通俗的講法很好,但是我覺得您得繞回來,實戰過程中,誰是大象,誰是門,門哪來,用一個最常見的例子說明可以嗎?比如作為程序員,面向對象的開發,第一步是xxx,相當于“找大象”,第二步,從哪調接口xxxxx,相當于“找門”。對應的講我覺得比較好,感謝!
越解釋越亂……