技术开发 频道

Grady Booch《面向对象分析与设计》读后感

    最近看Grady Booch的书—《面向对象分析与设计》,同时有些感受,随便说说:

    我在学的过程中园子里搜索了下,摘了一种一句话:“面向对象是一组思维方法、分析方法和编程方法的集合,当然不是最终的结果。”

    的确“OO”就是一个种思维方式,这样的思维不是只用在程序上,其实可以用在很多地方(看起来有点废话,但是可能很多像我一样的初学的人会认为OO就是为编程而生的,它们是一样东西),主要强调的就是用抽象对现实世界的事物进行拆分(书的作者用Decompose一词),

    按照书中作者的意思,“抽象”是OO的关键,什么是抽象呢?是一个具有对现实事物的性质的描述,而且这个描述是能有效的区别(Distingnish)于其它事物,并且这个描述能提供一个清楚的概念边界,这个概念的提出依赖于观察者的角度。

    当把这样的思维放到程序上面来就形成了几个概念“类型,继承,多态,封装”

    类型(Type):

    比如‘禽’类就是一个类型,在用代码语言表述的时候就是‘Class’但是Class 不等于是类型(Type).

    继承:

    继承这个东西为什么需要它呢,正如在描述抽象的时候说的,描述一个类型要描述它特有性质,有明确的区别于其它的事物。

    比如我描述一个东西,”两只脚,长翅膀和羽毛“,从这个抽象你能推断这个是什么吗?不能,因为鸡和鸭都具有这样的特性,

    我们的概念”两只脚,长翅膀和羽毛“ 虽然不能清楚的定义鸡和鸭的分类边界,但是却能清楚的界定 是‘禽’类还是‘昆虫’类。

    再者因为鸡和鸭具有同样的特性我们可以看出同样的类型。所以我们可以把‘禽’ 类,这样的类型定义个鸡和鸭的基础类型。

    而我们要抽象鸡和鸭这两样事物,我们需要更具体的描述,这个描述要能界定各自的特性 。但是如果鸡或鸭的特性描述只带有各自独特的描述,

    比如这样描述鸡‘有喙,脚不带噗,会咯咯叫’ 单独看这样的描述(假如没有继承父类的东西),这样也是不能清楚的界定事物,因为鸡至少必须具备‘禽’类的特性。这些特性界定在一起才是能清楚的界定鸡,而不是只有'有喙,脚不带噗,会咯咯叫'这样的描述。

    所以我们把这样的一个界定‘两只脚,长翅膀和羽毛,有喙,脚步不噗,会咯咯叫’ (我们假定这样的界定能定义鸡,因为我们都不生物学家)

    这样一来就顺利成章的推出继承的概念,描述某个具体的类型的时候它应该具有本来高一抽象层次的特性,然后加上自己的特有性质 。

    如果说我们没有采用继承,把所有描述描述“两只脚,长翅膀和羽毛,有喙,脚不带噗,会咯咯叫” 这样的界定也能清楚的界定‘鸡’,但是‘两只脚,长翅膀和羽毛’不属于‘鸡’类这个类目所特有的性质,它用在界定禽类范围内彼此动物之间的界限的时候是不清楚的,除非把这个“两只脚,长翅膀和羽毛”用于界定‘禽’与‘昆虫’,这样的界定是明确的,清晰的区别了昆虫和禽。

    继承同时为我们带来的代码的重用,节约编程量和便于维护。

    多态:

    有了继承,肯定就成在多态的情况了,比如‘鸡’ 和‘鸭’表象了‘禽’类的特性,这个属于是继承多态,是一种性质上有区别的多态表现,

    还有种就是‘行为多态’ 比如 ‘叫声’ ,禽类都会叫(可能你能找出不叫的禽类,这里咱们暂时抛开)但是‘鸭’的叫声和‘鸡’的叫声就不同。这种多态可以表现为代码中的抽象方法和接口继承上,因为我认为这两者关注点都是在方法(就是行为)。

    封装:

    至于这点我自己也不是很明白,希望有人能帮忙指点,

    目前我认为封装主要表现在类的行为上,有点类型黑盒的效果,你给鸡鸭饲料吃,他们负责生蛋。如果这个行为的”过程“是被公开的,这个”过程"可以被外界直接操作,这样就会出问题,导致鸡鸭更本生不出蛋或者蛋有问题。

    以上是写学习中的思考,请各位网友多多指教。 《面向对象分析与设计》 这本书也是个不错的书,推荐看看,只不过目前第三版只有英文。
 

0
相关文章