如何编写高质量的代码

《代码大全(第2版)》

■    在架构层将系统划分为多个子系统,以便让思绪在某段时间内能专注于系统的一小部分。(第5章)

■    仔细定义类接口,从而可以忽略类内部的工作机理。(第6.1节)

■    保持类接口的抽象性,从而不必记住不必要的细节。(第6.2节)

■    避免全局变量,因为它会大大增加总是需要兼顾的代码比例。(第13.3节)

■    避免深层次的继承,因为这样会耗费很大精力。(第6.3节)

■    避免深度嵌套的循环或条件判断,因为它们都能用简单的控制结构取代,后者占用较少的脑力资源。(第19.4节)

■    别用goto语句,因为它们引入了非顺序执行,多数人都不容易弄懂。(第17.3节)

■    小心定义错误处理的方法,不要滥用不同的错误处理技术。(第8.3节)

■    以系统的观点对待内置的异常机制,后者会成为非线性的控制结构。异常如果不受约束地使用,会和goto一样难以理解。(第8.4节)

■    不要让类过度膨胀,以至于占据整个程序。(第6章)

■    子程序应保持短小。(第7.4节)

■ 使用清楚、不言自明的变量名,从而大脑不必费力记住诸如“i代表账号下标,j代表顾客下标,还是另有它意?”之类的细节。(第11章)

■    传递给子程序的参数数目应尽量少。更重要的是,只传递保持子程序接口抽象所必需的参数。(第7.5节)

■    用规范和约定来使大脑从记忆不同代码段的随意性、偶然性差异中解脱出来。(第4.2节,第31、32章)

■    只要有可能,一般情况下应避免“偶然性困难”[2]。(第5.2节)

 

一、提高代码的重用性

代码的重用性可以通过两个方面的实现:函数级封装与对象级封装

1、函数级的封装

重用性不但体现在对对象的封装,对于重复性的业务无关的代码进行一层或多层的函数级封装,可以降低实现过程的复杂性。

进行函数级封装的特征:该过程具有简单的过程性,即只有一条线,无相关的分支或多个入口。

层次:即在编写函数时需要注重所写的函数的应用宽度,即有必要考虑先写通用功能函数,然后编写相关性功能函数,通用函数可能可以运用于其他方面的代码,而功能相关性函数,即私有函数则可以使当前的应用具有简单性,即保证了复用性,又保证了简单性。

2、对象级的封装

对象级封装能够做到更安全、更完整的封装,隐蔽不相关的处理分支,使上层调用只感觉到对象的原子特征。

对象级封装的特征:对象作用具有持久性、可能存在多入口或多出口、存在诸多关联特性、业务无关性等特征。

二、代码的一致性

内部一致性:在实现封装时,不管是函数级封装,还是对象级封装,都必须讲究一致的格调,比如说对单元格的调用时使用先行后列的入口参数,则不应该出现先列后行的入口参数的封装形式。

上下一致性:对于继续的私有级封装,更应该注意上下级之间的一致性,不应该让老虎生出一只猫来,那是应该杜绝的。同时又得保证父类的接口函义不被变更(特殊情况特殊考虑)。

三、代码的完整性

对象的封装必须提供完整的接口,在保证内部对象私有化的前提下,如何确保对内部对象的访问与操作,就必须提供完整的接口支持,对部份数据提供成对接口,如内部属性对象,提供Get与Set接口。

附加:提供完整的错误处理机制,由于这个方面并不是所有组件或对象都必须的,但在需要时只体现为更为重要。

四、接口的人性化

人性化主要体现有事务处理与参数调用等几个方面,做到内部可以实现就不要在外部实现,提供尽可能多的默认参数,也就是说从外部来看,对象是有生命的。如对象创建时需要分配一系列的内存,就不必要在创建对象时要求使用者额外地调用对象的某一接口;对象在销毁时需要释放内存等工作更应该由对象自身考虑(避免内存泄漏等更为严重的问题)

充分利用对象的多态性,使用调用者体会使用的简单性,如对一个打包对象,我们可以用一个接口实现对多种类型的数据进行打包,即在接口命名上不再体现打包数据的结构或特征等。

接口命名的人性化,在命名时要考虑其含义的简单性,调用者不需要关心的信息就不要表现出来,让用户只知道他所调用的只是一个对象,而并非是在调用多个对象。同时在接口应该体现接口的特征信息,从而使调用者有从接口命名中得到调用的体会。

五、把握封装的度

并不是封装都是好事,我们必须把握一个封装的限度,但最终可能会实现使用者所需要的相关组件,但实际封装过程可能是一个倒(金)三角模式,即从最原始的多个组件进行二次封装实现多个初级组件,依次后推,最终组件可能是由多个高级组件组成。即对每一个组件的封装应考虑尽可能的简单(复杂组件可能由多个逻辑概念上简单的组件所组成,除非对于性能要求非常高有组件可能需要考虑多种因素)。一般情况下由简单实现的模式的性能要高于直接用复杂实现的单一组件的性能要好。

有限性封装的另一个作用或好处:每一次的实现都属于简单的封装,逻辑也简单,不容易出现大问题,容易扩充与维护等。

六、性质的唯一性

封装不是大集会,尽量只体现相关方面的接口,其他需要的接口可以用其他组件里完成,再由现组件去调用,尽量避免一个接口多个用度,导致为了用一个方法而去创建一个大对象(舍本逐末)。

七、防止编码变相

目前的编码规范仍停留在变更命名及部份编码规则,但大量规范仍局限于程序员自己的编码习惯。

1、要求程序员尽量减少对全局的使用

全局变量的使用主要是因为容易使用程序在逻辑方面出现混乱,使程序形成一种网状结构,难于进行状态分析。即容易使程序无法进行问题分析与控制,程序可能失去安全性等危险。

对等情况,编写一个对象(组件),内部定义大量的成员变量,其实对于对象中的成员函数来说,他们就是全局变量,成员变量多了,同样可以使结构模糊,不易维护、控制、调试等。

2、要求程序员尽量减少或不使用GOTO语句

有相当一部份程序经常在对象之间进行数据传递,这里并不是通过某种机制进行的,而是开放对象的成员权限进行直接数据获得与设置。从而给内存泄漏提供了可乘之机,这与GOTO没有两样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值