明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

例程實(shí)作 ----庖丁解羊(上)(轉(zhuǎ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ù)吧。