例程實(shí)作 ----庖丁解羊(上)(轉(zhuǎn))
發(fā)表時(shí)間:2023-07-28 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]例程實(shí)作----庖丁解羊(上)作者:HolyFire 在《庖丁解羊----劃分》我們?cè)?jīng)將一只可愛的小羊拆成了零件,不知道是否還能否記得那道全羊譜。呵呵,說得口水都要流下來了。這里呢,沒有美味可口的...
例程實(shí)作
----庖丁解羊(上)
作者:HolyFire
在《庖丁解羊----劃分》我們?cè)?jīng)將一只可愛的小羊拆成了零件,不知道是否還能否記得那道全羊譜。呵呵,說得口水都要流下來了。這里呢,沒有美味可口的羊肉,只有我在給各位講如何將我們學(xué)習(xí)的方法應(yīng)用到編程中來。
首先呢我們要把結(jié)構(gòu)看清楚,也就是下面我東拼西湊起來的圖形,你們都看到了,我的ASCII藝術(shù)還差的遠(yuǎn)呢,呵呵,不過還能看明白。
山羊
┏━━━━━━━━━━━┳━━━┻━━━━━━━━━┳━━━━━━┓
腦袋軀體尾部四肢
┏━━╋━━┳━━┓ ┏━┳━╋━┳━━┳━━┓┏━━╋━━┓ ┏━┻━┓
骨架胡子五官 絨毛胸腹背 內(nèi)臟絨毛骨架尾巴絨毛骨架前肢后肢
┏━━┳┻━┳━━┓┏━┳━┳┻┳━┳━┳━┓┏━━╋━━┳┛
耳朵眼睛鼻子嘴巴 心脾肝肺胃腸腎腳絨毛骨架
結(jié)構(gòu)圖
這樣一來,我們心里面就不是一塊一塊零碎的羊雜燴了,而是一部分一部分串在一起的整體。我們從底部開始向上觀察,你會(huì)發(fā)現(xiàn)這是一個(gè)重組的過程。反之是一個(gè)分解過程。
而我們又將一些最小的單元?dú)w結(jié)為{輪廓,顏色},這是外表上能感知到的信息。
通過這些信息,我們發(fā)現(xiàn)自底向上解決這個(gè)問題好一些,人們總是樂意從簡(jiǎn)單容易的地方入手,這也是我一開始要做劃分的原因。
胡子{輪廓 , 顏色}絨毛{輪廓 , 顏色}骨架{輪廓 , 顏色}
胸{輪廓 ,顏色}腹{輪廓 , 顏色}背{輪廓 , 顏色}
眼睛{輪廓 , 顏色}鼻子{輪廓 , 顏色}嘴巴{輪廓 , 顏色}
心{輪廓 ,顏色}脾{輪廓 , 顏色}肝{輪廓 , 顏色}
腸{輪廓 ,顏色}腎{輪廓 , 顏色}腳{輪廓 , 顏色}
尾巴{輪廓 , 顏色}耳朵{輪廓 , 顏色}肺{輪廓 , 顏色}
胃{輪廓 ,顏色}
可以看出這些單位的組成都是一樣的,我們可以將它統(tǒng)稱為羊的部分。
部分{輪廓,顏色}
絨毛,骨架,胸,腹,背,眼睛,鼻子,胡子,嘴巴,心,脾,肝,腸,腎,腳,尾巴,耳朵,肺,胃{{部分}}
前肢{腳,絨毛,骨架}
后肢{腳,絨毛,骨架}
前肢與后肢也有著一樣的結(jié)構(gòu)哦
肢體{腳,絨毛,骨架}
前肢,后肢{肢體}
四肢{前肢,后肢}
內(nèi)臟{心,脾,肝,肺,胃,腸,腎}
五官{耳朵,眼睛,鼻子,嘴巴}
尾部{尾巴,絨毛,骨架}
軀體{胸,腹,背,內(nèi)臟,絨毛,骨架}
腦袋{五官,胡子,絨毛,骨架}
山羊{腦袋,軀體,四肢,尾部}
其實(shí),這些有各個(gè)部分組合起來的整體,如:前肢,后肢,軀體等等也是羊的一部分。
肢體{{部分},腳,絨毛,骨架 }
前肢,后肢{肢體}
四肢{{部分},前肢,后肢}
內(nèi)臟{{部分},心,脾,肝,肺,胃,腸,腎}
五官{{部分},耳朵,眼睛,鼻子,嘴巴}
尾部{{部分},尾巴,絨毛,骨架}
軀體{{部分},胸,腹,背,內(nèi)臟,絨毛,骨架}
腦袋{{部分},五官,胡子,絨毛,骨架}
山羊{{腦袋},軀體,四肢,尾部}
如果一個(gè)完整的整體是一個(gè)部分的特例的話,那么山羊也應(yīng)該是一個(gè)部分。
山羊{部分,腦袋,軀體,四肢,尾部}
這樣一來,就可以方便的表示結(jié)構(gòu)圖的部分--整體的關(guān)系了。
部分{輪廓,顏色}
絨毛,骨架,胸,腹,背,眼睛,鼻子,嘴巴,心,脾,肝,腸,腎,腳,尾巴,耳朵,肺,胃{{部分}}
肢體{{部分},腳,絨毛,骨架 }
前肢,后肢{肢體}
四肢{{部分},前肢,后肢}
內(nèi)臟{{部分},心,脾,肝,肺,胃,腸,腎}
五官{{部分},耳朵,眼睛,鼻子,嘴巴}
尾部{{部分},尾巴,絨毛,骨架}
軀體{{部分},胸,腹,背,內(nèi)臟,絨毛,骨架}
腦袋{{部分},五官,胡子,絨毛,骨架}
山羊{{部分},腦袋,軀體,四肢,尾部}
那么,現(xiàn)在是開始運(yùn)用頭腦思考的時(shí)候了。
羊的部分可以是一根顫巍巍的胡子,也可以是一個(gè)晃來晃去的尾巴,他們有共同的屬性:輪廓和顏色,但是由腳,絨毛,骨架組成的肢體也是一個(gè)部分,他們有什么共同之處呢,用部分做基類是不是有點(diǎn)牽強(qiáng)呢。其實(shí)一個(gè)部分輪廓和顏色是什么樣的對(duì)于我們并不重要,而且封裝的原則是不應(yīng)該讓使用者知道內(nèi)部結(jié)構(gòu),所以我們只要提供一個(gè)方法來描繪這個(gè)部分在視覺上的效果就可以了。如何讓一個(gè)方法可以表現(xiàn)不同的效果呢,switch ? if else ? No!
我們有更好方法----多態(tài),繼承的結(jié)構(gòu)已經(jīng)有了,缺的就是虛函數(shù)了。
部分{顯示=無(wú)顯示}如何表現(xiàn)一個(gè)未知的物體?無(wú)意義,一個(gè)純虛函數(shù)正好勝任。
輪廓{顯示}并非只有羊的部分才是可以體現(xiàn)視覺效果的,而且視覺效果是人與羊的關(guān)系,并非羊的一部分。
絨毛{{部分,顯示=顯示絨毛},輪廓,顏色}
骨架{{部分,顯示=顯示骨架},輪廓,顏色}
胸{{部分,顯示=顯示胸},輪廓,顏色}
腹{{部分,顯示=顯示腹},輪廓,顏色}
背{{部分,顯示=顯示背},輪廓,顏色}
眼睛{{部分,顯示=顯示眼睛},輪廓,顏色}
鼻子{{部分,顯示=顯示鼻子},輪廓,顏色}
嘴巴{{部分,顯示=顯示嘴巴},輪廓,顏色}
胡子{{部分,顯示=顯示胡子},輪廓,顏色}
心{{部分,顯示=顯示心},輪廓,顏色}
脾{{部分,顯示=顯示脾},輪廓,顏色}
肝{{部分,顯示=顯示肝},輪廓,顏色}
腸{{部分,顯示=顯示腸},輪廓,顏色}
腎{{部分,顯示=顯示腎},輪廓,顏色}
腳{{部分,顯示=顯示腳},輪廓,顏色}
尾巴{{部分,顯示=顯示尾巴},輪廓,顏色}
耳朵{{部分,顯示=顯示耳朵},輪廓,顏色}
肺{{部分,顯示=顯示肺},輪廓,顏色}
胃{{部分,顯示=顯示胃},輪廓,顏色}
由于各個(gè)部分不確定,所以需要用一個(gè)輪廓來描述,既然輪廓可以描述出形狀,加上顏色想必就能重現(xiàn)視覺效果,由此可見輪廓與顏色也是有關(guān)系的,他們結(jié)合在一起體現(xiàn)視覺效果。他們是間接的體現(xiàn)了這個(gè)部分的,比如
絨毛{{部分,顯示=顯示絨毛},輪廓,顏色}
事實(shí)上是
絨毛{{部分,顯示=輪廓+顏色},輪廓,顏色}
這樣一來這些基本單位又從新使用同一接口。
絨毛,骨架,胸,腹,背,眼睛,鼻子,胡子,嘴巴,心,脾,肝,腸,腎,腳,尾巴,耳朵,肺,胃{{部分,顯示=輪廓+顏色},輪廓,顏色}
肢體{{部分, 顯示=顯示肢體},腳,絨毛,骨架}
前肢,后肢{{肢體}}
四肢{{部分,顯示=顯示四肢},前肢,后肢}
內(nèi)臟{{部分,顯示=顯示內(nèi)臟},心,脾,肝,肺,胃,腸,腎}
五官{{部分,顯示=顯示五官},耳朵,眼睛,鼻子,嘴巴}
尾部{{部分,顯示=顯示尾部},尾巴,絨毛,骨架}
軀體{{部分,顯示=顯示軀體},胸,腹,背,內(nèi)臟,絨毛,骨架}
腦袋{{部分,顯示=顯示腦袋},五官,胡子,絨毛,骨架}
山羊{{部分,顯示=顯示山羊},腦袋,軀體,四肢,尾部}
這些組合的部分是由一些基本的部分組成的,那么它們的視覺效果是這些基本的部分的整體效果。
部分{顯示=無(wú)顯示}
輪廓{顯示}
絨毛,骨架,胸,腹,背,眼睛,胡子,鼻子,嘴巴,心,脾,肝,腸,腎,腳,尾巴,耳朵,肺,胃{{部分,顯示=輪廓+顏色},輪廓,顏色}
肢體{{部分, 顯示=顯示肢體},腳,絨毛,骨架}
前肢,后肢{{肢體}}
四肢{{部分,顯示=顯示四肢},前肢,后肢}
內(nèi)臟{{部分,顯示=顯示內(nèi)臟},心,脾,肝,肺,胃,腸,腎}
五官{{部分,顯示=顯示五官},耳朵,眼睛,鼻子,嘴巴}
尾部{{部分,顯示=顯示尾部},尾巴,絨毛,骨架}
軀體{{部分,顯示=顯示軀體},胸,腹,背,內(nèi)臟,絨毛,骨架}
腦袋{{部分,顯示=顯示腦袋},五官,胡子,絨毛,骨架}
山羊{{部分,顯示=顯示山羊},腦袋,軀體,四肢,尾部}
再三分析以后,我們發(fā)現(xiàn)比起一開始的結(jié)構(gòu)圖來說,最后的模型竟然如此的精簡(jiǎn),我想這樣已經(jīng)可以接受了。
現(xiàn)在整體—部分的關(guān)系已經(jīng)弄清楚了,現(xiàn)在要做的是如何將它與現(xiàn)實(shí)中的事物對(duì)應(yīng)起來,也就是具體如何組合。
那么讓我們開始念叨一下,我們?cè)鯓佑蒙厦嬉阎膬?nèi)容來描述一只山羊呢。
山羊:一個(gè)腦袋,一個(gè)軀體,一個(gè)四肢,一個(gè)尾部
腦袋:一個(gè)五官,一把胡子,一些絨毛,一個(gè)骨架
軀體:一個(gè)胸部,一個(gè)腹部,一個(gè)背部,一些內(nèi)臟,一些絨毛,一個(gè)骨架
尾部:一條尾巴,一些絨毛,一個(gè)骨架
五官:兩只耳朵,兩只眼睛,一只鼻子,一張嘴巴
內(nèi)臟:一個(gè)心臟,一個(gè)脾臟,一個(gè)肝臟,兩個(gè)肺臟,一個(gè)胃,一些腸,兩只腎臟}
四肢:兩只前肢,兩只后肢
肢體:一只腳,一些絨毛,一個(gè)骨架
不然看出數(shù)量在組成上有著重要的地位,所以我們的模型上還要加上基數(shù)這個(gè)概念
部分{顯示=無(wú)顯示}
輪廓{顯示}
絨毛,骨架,胸,腹,背,胡子,眼睛,鼻子,嘴巴,心,脾,肝,腸,腎,腳,尾巴,耳朵,肺,胃{{部分,顯示=輪廓+顏色},輪廓[1],顏色[1]}
肢體{{部分, 顯示=顯示肢體},腳[1],絨毛[n],骨架[1]}
前肢,后肢{{肢體}}
四肢{{部分,顯示=顯示四肢},前肢[2],后肢[2]}
內(nèi)臟{{部分,顯示=顯示內(nèi)臟},心[1],脾[1],肝[1],肺[2],胃[1],腸[n],腎[2]}
五官{{部分,顯示=顯示五官},耳朵[2],眼睛[2],鼻子[1],嘴巴[1]}
尾部{{部分,顯示=顯示尾部},尾巴[1],絨毛[n],骨架[1]}
軀體{{部分,顯示=顯示軀體},胸[1],腹[1],背[1],內(nèi)臟[1],絨毛[n],骨架[1]}
腦袋{{部分,顯示=顯示腦袋},五官[1],胡子[n],絨毛[n],骨架[1]}
山羊{{部分,顯示=顯示山羊},腦袋[1],軀體[1],四肢[1],尾部[1]}
這樣的話,更接近現(xiàn)實(shí)的事物,而且降低了問題的復(fù)雜度。
經(jīng)過一大堆的分析,這個(gè)模型也相對(duì)比較清晰了,可以接受了,不過不代表這是最好的模型,一定會(huì)有更好的模型的。但是我們并不需要最完美的模型,只要有一個(gè)合適的模型就可以了,在這里,作為我的需要,就已經(jīng)很合適了。
不用說,現(xiàn)在開始進(jìn)入編碼階段了。經(jīng)過上面的分析,相信我們心里有很多很多事要去做,不要急,慢慢來,亂了陣腳可不行。
限于篇幅,我不能將圖形顯示方面的內(nèi)容加進(jìn)來,一來內(nèi)容太多會(huì)混淆實(shí)現(xiàn),不能突出重點(diǎn);二來容易將思路引到細(xì)節(jié)的實(shí)現(xiàn)上去,反而忽略了全局;再來有關(guān)圖形顯示與編譯器和操作系統(tǒng)的關(guān)系緊密,并不適合我講的內(nèi)容;最后,本人的藝術(shù)細(xì)胞極度匱乏,如果畫出來的形象讓大家失望,豈不是自討沒趣,哈哈,玩笑歸玩笑,讓我們繼續(xù)吧。