面向对象编程的两顶帽子

来源:互联网 发布:php ajax返回html标签 编辑:程序博客网 时间:2024/04/28 05:58

从传统的面向过程的模式,到学习掌握面向对象编程的过程中,总是有些思想观念难于转变,面向对象,更多的是思维的方式,而不是使用方法。越是深入的学习,越感到面向对象技术的博大精深,最近有一些心得总结一下。

    在面向对象编程中,套用重构的思想,也使用两顶帽子,来达成目的。

    重构的两顶帽子,指修改及新增功能两顶帽子,在新增功能时,不改变任何原来的代码,也就是戴上新增功能的帽子,如果发现原来的代码有问题,就戴上重构的帽子,而不增加或改变原有代码执行的功能及接口。那么面向对象编程的两顶帽子是什么呢? 
1.什么是对象编程的两顶帽子? 
    一个软件的目的是为了解决一个或一些问题,就有了需求和实现,在面向对象编程中,表现为一个个的类或是对象,相互协作,调用,通信。在这个过程当中,简单来说就是使用和被使用两种关系。

    一个对象总会表现出两种形式,它自身,及它的接口。或者说是它的本体与表象。本体是对象自身的结构及构成,表象是它的接口,与其它对象的交互或是表现。 
那么,当我们关注的是对象的自身还是接口的时候,就需要戴上不同的帽子。 
有哪些帽子可戴呢?我们把一个对象分成两部分,一是接口,一是实现,接口是对象对外部的表现,实现是内部分运行及处理机制,所以就有了这两顶帽子。

为什么会是两顶而不是三顶四顶?从认识事物来看,二分法很容易理解和体会,就象白和黑,好和坏一样,当关注接口时,根本不用想如何实现,会不会有实现的困难等,关注实现时,也不用考虑需不需要更多的功能,要不要改个名称,加个参数等情况,只要专注于实现此接口的功能即可。 
之所以要这么做,是因为接口和实现是对象的一体两面,这两个因素互相影响而形成一个完整的整体。接口的改变必定导致实现的改变,实现的改变有可能会影响接口。把它分开来,减少这种相互影响。 
如何戴这两顶帽子?当然不能同时戴,先戴实现的帽子么?也不可能,没有接口你实现什么呢?一开始要戴上接口这顶帽子,然后去实现它,在实现当中,你会发现实现的代码需要和更多的其它对象交互,没关系,就当它于经存在了,当你完成编译时,你自然会发现通不过,通过编译器的提示又戴上了接口的帽子,如此交替反复。 
戴上帽子后,干什么呢? 
帽子是一种角色的象征,而不是做事的方式,因为在编码的时候,写接口和写实现都是在写代码,做事方式一样,但是想法不同。 
当你戴上接口的帽子时,你就是一个使用者,从客户的角度来考虑问题,把你当前处理的对象当做是你的供应商,你就是一个挑剔的客户。 
我们从自然界来理解这个问题,一个对象就是一个物体,这个对象之所以是这样,并不是因为它本身长的是这样,而是因为周围环境的影响才会成为这样,也就是接口部分是由于外界的需要而形成的,可以看成它不属于对象自身,而是由它的客户拥有,对象自身拥有的是关于接口的实现,它为了向外界提供所需要的接口,不得不在内部进行演化,来实现这种接口。

当戴上实现的帽子时,你就变成了那个供应商,面对着挑剔的客户,也就是刚才戴着接口的帽子的那个你,你就想着如何去应付它。来满足他的要求。

这种方式和设计模式有什么关系?上面所说的接口,是指一个类的方法,属性,事件等,是细粒度的接口,实现,是指对这个类的方法,属性,事件等的实现,不是指类一级的实现。是我在编程过程中,对细部处理的一些想法。当然这种方法放大了以后,到设计类及类间关系这一级,实现就变得次要了,关心更多的是接口。 
模式的定义(Alexander):每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 
而设计模式,指的是在软件开发活动中的模式。是软件设计的模式,一般说来,一个设计模式是多个类相互协作的结果,一个设计模式的实现就是一个设计,而不是设计的实现。一个模式可以有N个设计,而每一个设计,又可以有N种实现。所以两顶帽子,描述的是面对一个设计,如何去实现它的问题。

和TDD有什么关系?事实上,这两顶帽子是学习TDD的一种理解。TDD通过测试来驱动开发,由测试来保证重构,是一套完善的机制和方法论。结合其它的XP思想,形成一整个XP的开发过程模式,从这一点可以看出老外高手思想、逻辑体系的严明。TDD的测试就是接口的帽子,为了通过测试写的代码就是实现的帽子,但不同点在于,测试驱动的是整个的开发,包括设计及实现,重构等过程,是一个大的框架。 
当然,如果不写测试,或测试代码不能完全覆盖的情况下,也可以戴这两顶帽子,比如私有方法,对一个类的内部来说,它仍然是使用它的方法的一个接口。 
通过戴这两顶帽子,能改善接口的易用性,稳定性及偶合性。因为在写每一个接口的时候,都是站在使用者的角度来考虑的,这时候关注的是调用者使用的方便,从小处着眼,比如一个私有方法,我们会关注它起什么名字,准备给它传什么参数,需要返回什么值等,而在对此方法的实现里,关注怎么把这个方法实现得更好。再大一点,到类级,再大一点,到一组协作的类,再大一点,到组件,模块等,原理都是一样的。

0 0
原创粉丝点击