一、提高代码的重用性
代码的重用性可以通过两个方面的实现:函数级封装与对象级封装
1、函数级的封装
重用性不但体现在对对象的封装,对于重复性的业务无关的代码进行一层或多层的函数级封装,可以降低实现过程的复杂性。
进行函数级封装的特征:该过程具有简单的过程性,即只有一条线,无相关的分支或多个入口。
层次:即在编写函数时需要注重所写的函数的应用宽度,即有必要考虑先写通用功能函数,然后编写相关性功能函数,通用函数可能可以运用于其他方面的代码,而功能相关性函数,即私有函数则可以使当前的应用具有简单性,即保证了复用性,又保证了简单性。
2、对象级的封装
对象级封装能够做到更安全、更完整的封装,隐蔽不相关的处理分支,使上层调用只感觉到对象的原子特征。
对象级封装的特征:对象作用具有持久性、可能存在多入口或多出口、存在诸多关联特性、业务无关性等特征。
二、代码的一致性
内部一致性:在实现封装时,不管是函数级封装,还是对象级封装,都必须讲究一致的格调,比如说对单元格的调用时使用先行后列的入口参数,则不应该出现先列后行的入口参数的封装形式。
上下一致性:对于继续的私有级封装,更应该注意上下级之间的一致性,不应该让老虎生出一只猫来,那是应该杜绝的。同时又得保证父类的接口函义不被变更(特殊情况特殊考虑)。
三、代码的完整性
对象的封装必须提供完整的接口,在保证内部对象私有化的前提下,如何确保对内部对象的访问与操作,就必须提供完整的接口支持,对部份数据提供成对接口,如内部属性对象,提供Get与Set接口。
附加:提供完整的错误处理机制,由于这个方面并不是所有组件或对象都必须的,但在需要时只体现为更为重要。
四、接口的人性化
人性化主要体现有事务处理与参数调用等几个方面,做到内部可以实现就不要在外部实现,提供尽可能多的默认参数,也就是说从外部来看,对象是有生命的。如对象创建时需要分配一系列的内存,就不必要在创建对象时要求使用者额外地调用对象的某一接口;对象在销毁时需要释放内存等工作更应该由对象自身考虑(避免内存泄漏等更为严重的问题)
充分利用对象的多态性,使用调用者体会使用的简单性,如对一个打包对象,我们可以用一个接口实现对多种类型的数据进行打包,即在接口命名上不再体现打包数据的结构或特征等。
接口命名的人性化,在命名时要考虑其含义的简单性,调用者不需要关心的信息就不要表现出来,让用户只知道他所调用的只是一个对象,而并非是在调用多个对象。同时在接口应该体现接口的特征信息,从而使调用者有从接口命名中得到调用的体会。
五、把握封装的度
并不是封装都是好事,我们必须把握一个封装的限度,但最终可能会实现使用者所需要的相关组件,但实际封装过程可能是一个倒(金)三角模式,即从最原始的多个组件进行二次封装实现多个初级组件,依次后推,最终组件可能是由多个高级组件组成。即对每一个组件的封装应考虑尽可能的简单(复杂组件可能由多个逻辑概念上简单的组件所组成,除非对于性能要求非常高有组件可能需要考虑多种因素)。一般情况下由简单实现的模式的性能要高于直接用复杂实现的单一组件的性能要好。
有限性封装的另一个作用或好处:每一次的实现都属于简单的封装,逻辑也简单,不容易出现大问题,容易扩充与维护等。
六、性质的唯一性
封装不是大集会,尽量只体现相关方面的接口,其他需要的接口可以用其他组件里完成,再由现组件去调用,尽量避免一个接口多个用度,导致为了用一个方法而去创建一个大对象(舍本逐末)。
七、防止编码变相
目前的编码规范仍停留在变更命名及部份编码规则,但大量规范仍局限于程序员自己的编码习惯。
1、要求程序员尽量减少对全局的使用
全局变量的使用主要是因为容易使用程序在逻辑方面出现混乱,使程序形成一种网状结构,难于进行状态分析。即容易使程序无法进行问题分析与控制,程序可能失去安全性等危险。
对等情况,编写一个对象(组件),内部定义大量的成员变量,其实对于对象中的成员函数来说,他们就是全局变量,成员变量多了,同样可以使结构模糊,不易维护、控制、调试等。
2、要求程序员尽量减少或不使用GOTO语句
有相当一部份程序经常在对象之间进行数据传递,这里并不是通过某种机制进行的,而是开放对象的成员权限进行直接数据获得与设置。从而给内存泄漏提供了可乘之机,这与GOTO没有两样。
以上是自己多年来的编程经验的总结,如有补充或新的想法,请给予批评与指教:satchmo2000@163.net
Satchmo
2003年4月25日