快捷搜索:

例程实作----庖丁解羊(上)

作者:HolyFire

在《火头解羊----划分》我们曾经将一只可爱的小羊拆成了零件,不知道是否还能否记得那道全羊谱。呵呵,说得口水都要流下来了。这里呢,没有厚味适口的羊肉,只有我在给各位讲若何将我们进修的措施利用到编程中来。

首先呢我们要把布局看清楚,也便是下面我东拼西凑起来的图形,你们都看到了,我的ASCII艺术还差的远呢,呵呵,不过还能看明白。

山羊

┏━━━━━━━━━━━┳━━━┻━━━━━━━━━┳━━━━━━┓

脑袋躯体尾部四肢

┏━━╋━━┳━━┓┏━┳━╋━┳━━┳━━┓┏━━╋━━┓┏━┻━┓

骨架胡子五官绒毛胸腹背 内脏绒毛骨架尾巴绒毛骨架前肢后肢

┏━━┳┻━┳━━┓┏━┳━┳┻┳━┳━┳━┓┏━━╋━━┳┛

耳朵眼睛鼻子嘴巴心脾肝肺胃肠肾脚绒毛骨架

布局图

这样一来,我们心里面就不是一块一块零散的羊杂烩了,而是一部分一部分串在一路的整体。我们从底部开始向上察看,你会发明这是一个重组的历程。反之是一个分化历程。

而我们又将一些最小的单元归结为{轮廓,颜色},这是外表上能感知到的信息。

经由过程这些信息,我们发明自底向上办理这个问题好一些,人们老是愿意从简单轻易的地方入手,这也是我一开始要做划分的缘故原由。

胡子{轮廓 , 颜色}绒毛{轮廓 , 颜色}骨架{轮廓 , 颜色}

胸{轮廓 ,颜色}腹{轮廓 , 颜色}背{轮廓 , 颜色}

眼睛{轮廓 , 颜色}鼻子{轮廓 , 颜色}嘴巴{轮廓 , 颜色}

心{轮廓 ,颜色}脾{轮廓 , 颜色}肝{轮廓 , 颜色}

肠{轮廓 ,颜色}肾{轮廓 , 颜色}脚{轮廓 , 颜色}

尾巴{轮廓 , 颜色}耳朵{轮廓 , 颜色}肺{轮廓 , 颜色}

胃{轮廓 ,颜色}

可以看出这些单位的组成都是一样的,我们可以将它统称为羊的部分。

部分{轮廓,颜色}

绒毛,骨架,胸,腹,背,眼睛,鼻子,胡子,嘴巴,心,脾,肝,肠,肾,脚,尾巴,耳朵,肺,胃{{部分}}

前肢{脚,绒毛,骨架}

后肢{脚,绒毛,骨架}

前肢与后肢也有着一样的布局哦

肢体{脚,绒毛,骨架}

前肢,后肢{肢体}

四肢{前肢,后肢}

内脏{心,脾,肝,肺,胃,肠,肾}

五官{耳朵,眼睛,鼻子,嘴巴}

尾部{尾巴,绒毛,骨架}

躯体{胸,腹,背,内脏,绒毛,骨架}

脑袋{五官,胡子,绒毛,骨架}

山羊{脑袋,躯体,四肢,尾部}

着实,这些有各个部分组合起来的整体,如:前肢,后肢,躯体等等也是羊的一部分。

肢体{{部分},脚,绒毛,骨架 }

前肢,后肢{肢体}

四肢{{部分},前肢,后肢}

内脏{{部分},心,脾,肝,肺,胃,肠,肾}

五官{{部分},耳朵,眼睛,鼻子,嘴巴}

尾部{{部分},尾巴,绒毛,骨架}

躯体{{部分},胸,腹,背,内脏,绒毛,骨架}

脑袋{{部分},五官,胡子,绒毛,骨架}

山羊{{脑袋},躯体,四肢,尾部}

假如一个完备的整体是一个部分的特例的话,那么山羊也应该是一个部分。

山羊{部分,脑袋,躯体,四肢,尾部}

这样一来,就可以方便的表示布局图的部分--整体的关系了。

部分{轮廓,颜色}

绒毛,骨架,胸,腹,背,眼睛,鼻子,嘴巴,心,脾,肝,肠,肾,脚,尾巴,耳朵,肺,胃{{部分}}

肢体{{部分},脚,绒毛,骨架 }

前肢,后肢{肢体}

四肢{{部分},前肢,后肢}

内脏{{部分},心,脾,肝,肺,胃,肠,肾}

五官{{部分},耳朵,眼睛,鼻子,嘴巴}

尾部{{部分},尾巴,绒毛,骨架}

躯体{{部分},胸,腹,背,内脏,绒毛,骨架}

脑袋{{部分},五官,胡子,绒毛,骨架}

山羊{{部分},脑袋,躯体,四肢,尾部}

那么,现在是开始运用头脑思虑的时刻了。

羊的部分可所以一根颤巍巍的胡子,也可所以一个晃来晃去的尾巴,他们有合营的属性:轮廓和颜色,然则由脚,绒毛,骨架组成的肢体也是一个部分,他们有什么合营之处呢,用部分做基类是不是有点牵强呢。着实一个部分轮廓和颜色是什么样的对付我们并不紧张,而且封装的原则是不应该让应用者知道内部布局,以是我们只要供给一个措施来描画这个部分在视觉上的效果就可以了。若何让一个措施可以体现不合的效果呢,switch ? if else ? No!

我们有更好措施----多态,承袭的布局已经有了,缺的便是虚函数了。

部分{显示=无显示}若何体现一个未知的物体?无意义,一个纯虚函数恰恰胜任。

轮廓{显示}并非只有羊的部分才是可以表现视觉效果的,而且视觉效果是人与羊的关系,并非羊的一部分。

绒毛{{部分,显示=显示绒毛},轮廓,颜色}

骨架{{部分,显示=显示骨架},轮廓,颜色}

胸{{部分,显示=显示胸},轮廓,颜色}

腹{{部分,显示=显示腹},轮廓,颜色}

背{{部分,显示=显示背},轮廓,颜色}

眼睛{{部分,显示=显示眼睛},轮廓,颜色}

鼻子{{部分,显示=显示鼻子},轮廓,颜色}

嘴巴{{部分,显示=显示嘴巴},轮廓,颜色}

胡子{{部分,显示=显示胡子},轮廓,颜色}

心{{部分,显示=显示心},轮廓,颜色}

脾{{部分,显示=显示脾},轮廓,颜色}

肝{{部分,显示=显示肝},轮廓,颜色}

肠{{部分,显示=显示肠},轮廓,颜色}

肾{{部分,显示=显示肾},轮廓,颜色}

脚{{部分,显示=显示脚},轮廓,颜色}

尾巴{{部分,显示=显示尾巴},轮廓,颜色}

耳朵{{部分,显示=显示耳朵},轮廓,颜色}

肺{{部分,显示=显示肺},轮廓,颜色}

胃{{部分,显示=显示胃},轮廓,颜色}

因为各个部分不确定,以是必要用一个轮廓来描述,既然轮廓可以描述出外形,加上颜色想必就能重现视觉效果,由此可见轮廓与颜色也是有关系的,他们结合在一路表现视觉效果。他们是间接的表现了这个部分的,比如

绒毛{{部分,显示=显示绒毛},轮廓,颜色}

事实上是

绒毛{{部分,显示=轮廓+颜色},轮廓,颜色}

这样一来这些基础单位又重新应用同一接口。

绒毛,骨架,胸,腹,背,眼睛,鼻子,胡子,嘴巴,心,脾,肝,肠,肾,脚,尾巴,耳朵,肺,胃{{部分,显示=轮廓+颜色},轮廓,颜色}

肢体{{部分, 显示=显示肢体},脚,绒毛,骨架}

前肢,后肢{{肢体}}

四肢{{部分,显示=显示四肢},前肢,后肢}

内脏{{部分,显示=显示内脏},心,脾,肝,肺,胃,肠,肾}

五官{{部分,显示=显示五官},耳朵,眼睛,鼻子,嘴巴}

尾部{{部分,显示=显示尾部},尾巴,绒毛,骨架}

躯体{{部分,显示=显示躯体},胸,腹,背,内脏,绒毛,骨架}

脑袋{{部分,显示=显示脑袋},五官,胡子,绒毛,骨架}

山羊{{部分,显示=显示山羊},脑袋,躯体,四肢,尾部}

这些组合的部分是由一些基础的部分组成的,那么它们的视觉效果是这些基础的部分的整体效果。

部分{显示=无显示}

轮廓{显示}

绒毛,骨架,胸,腹,背,眼睛,胡子,鼻子,嘴巴,心,脾,肝,肠,肾,脚,尾巴,耳朵,肺,胃{{部分,显示=轮廓+颜色},轮廓,颜色}

肢体{{部分, 显示=显示肢体},脚,绒毛,骨架}

前肢,后肢{{肢体}}

四肢{{部分,显示=显示四肢},前肢,后肢}

内脏{{部分,显示=显示内脏},心,脾,肝,肺,胃,肠,肾}

五官{{部分,显示=显示五官},耳朵,眼睛,鼻子,嘴巴}

尾部{{部分,显示=显示尾部},尾巴,绒毛,骨架}

躯体{{部分,显示=显示躯体},胸,腹,背,内脏,绒毛,骨架}

脑袋{{部分,显示=显示脑袋},五官,胡子,绒毛,骨架}

山羊{{部分,显示=显示山羊},脑袋,躯体,四肢,尾部}

再三阐发今后,我们发明比起一开始的布局图来说,着末的模型竟然如斯的精简,我想这样已经可以吸收了。

现在整体—部分的关系已经弄清楚了,现在要做的是若何将它与现实中的事物对应起来,也便是详细若何组合。

那么让我们开始念叨一下,我们如何用上面已知的内容来描述一只山羊呢。

山羊:一个脑袋,一个躯体,一个四肢,一个尾部

脑袋:一个五官,一把胡子,一些绒毛,一个骨架

躯体:一个胸部,一个腹部,一个背部,一些内脏,一些绒毛,一个骨架

尾部:一条尾巴,一些绒毛,一个骨架

五官:两只耳朵,两只眼睛,一只鼻子,一张嘴巴

内脏:一个心脏,一个脾脏,一个肝脏,两个肺脏,一个胃,一些肠,两只肾脏}

四肢:两只前肢,两只后肢

肢体:一只脚,一些绒毛,一个骨架

不然看出数量在组成上有侧紧张的职位地方,以是我们的模型上还要加上基数这个观点

部分{显示=无显示}

轮廓{显示}

绒毛,骨架,胸,腹,背,胡子,眼睛,鼻子,嘴巴,心,脾,肝,肠,肾,脚,尾巴,耳朵,肺,胃{{部分,显示=轮廓+颜色},轮廓[1],颜色[1]}

肢体{{部分, 显示=显示肢体},脚[1],绒毛[n],骨架[1]}

前肢,后肢{{肢体}}

四肢{{部分,显示=显示四肢},前肢[2],后肢[2]}

内脏{{部分,显示=显示内脏},心[1],脾[1],肝[1],肺[2],胃[1],肠[n],肾[2]}

五官{{部分,显示=显示五官},耳朵[2],眼睛[2],鼻子[1],嘴巴[1]}

尾部{{部分,显示=显示尾部},尾巴[1],绒毛[n],骨架[1]}

躯体{{部分,显示=显示躯体},胸[1],腹[1],背[1],内脏[1],绒毛[n],骨架[1]}

脑袋{{部分,显示=显示脑袋},五官[1],胡子[n],绒毛[n],骨架[1]}

山羊{{部分,显示=显示山羊},脑袋[1],躯体[1],四肢[1],尾部[1]}

这样的话,更靠近现实的事物,而且低落了问题的繁杂度。

颠末一大年夜堆的阐发,这个模型也比拟较较清晰了,可以吸收了,不过不代表这是最好的模型,必然会有更好的模型的。然则我们并不必要最完美的模型,只要有一个相宜的模型就可以了,在这里,作为我的必要,就已经很相宜了。

不用说,现在开始进入编码阶段了。颠末上面的阐发,信托我们心里有很多很多事要去做,不要急,逐步来,乱了阵脚可不可。

限于篇幅,我不能将图形显示方面的内容加进来,一来内容太多会肴杂实现,不能凸起重点;二来轻易将思路引到细节的实现上去,反而轻忽了全局;再来有关图形显示与编译器和操作系统的关系慎密,并不得当我讲的内容;着末,本人的艺术细胞极端匮乏,假如画出来的形象让大年夜家失望,岂不是自讨没趣,哈哈,玩笑归玩笑,让我们继承吧。

您可能还会对下面的文章感兴趣: