聊一聊编程中的规范性与随意性

创建时间:2014/12/15 22:55:34
关键字:

编程规范为哪般

说到这个话题,可能就会有一些朋友不耐烦了:又说编程规范,编程规范有那么重要吗,随意一点能有什么关系?也许,注重编程规范的程序员与习惯随性而为的程序员,他们注定说服不了对方,也不服对方,只有相看两无语吧。

不管怎么样,总有些人是愿意改变的,或者是原本抵触的小伙伴也会有愿意做些改变的时候。所以这里简要概括一下编程规范的意义:

1.规范地创建项目和编码是生产高质量项目代码的保障,是项目或产品可维护和易扩展的保障。换言之,是否规范及规范程度,决定了企业后期在项目或产品上的需要投入的维护成本,直接影响到企业的效益。

2.规范地工作和编程习惯,是程序员或工程师良好的职业素养的体现。这方面表现突出的员工往往能够承担起更多的责任,让产品人员省心,让同事舒心,让领导放心,更容易公司的认可。在职场上体现的就是竞争力。

3.好吧,如果上面的两点你都不太关心,那么还有两点理由让你应该至少做好最基本的规范。一、与人方便:出于基本礼貌,别让其他同事阅读你的代码时痛苦不堪,保证一下代码的基本逻辑以及最起码的命名规范和注释。二、自己方便:为了以后维护和修改需求时轻松一点,避免在几个月后看不太明白自己的代码,最好还是注意基本的规范。

有朋友可能有话说了:好吧,就算上面说的有道理,可是需求总是来得那么多,项目进度催得那么紧,哪有工夫去顾得上那么多的规范。

据笔者的经验,恰恰是规范性好的代码和良好的习惯,更有助于从容应对频繁变化的需求和紧急的进度。因为好的项目框架和代码,本身在一开始就为需求的变化和功能扩展预留了必要的可配置性处理和扩展接口,因此往往不需要对原有代码做大的改动,而只是增加少量代码就能满足需求。另一方面,有良好的习惯,往往不会在拿到需求时,立马就开始编码实现功能,而是先对需求和业务进行分析和梳理,然后可能只做必要的扩展或对原有流程的微小调整就能满足新的需求。最大限度的复用有可能省去从头开始实现这些新需求的大部分时间。

编程随意面面观

事实上,很多不规范往往都是“不经意”,“没注意”或者“没关系”等心态下发生的。笔者是领教过过,个中滋味不说了,简单罗列一下吧,权当供大家茶余饭后闲聊:

1.字段、变量、方法的命名  

对象和字段不分:数据表中的表间关联字段使用表名命名,而不是表的Id。例如order表中存储的用户Id的字段命名使用user而不是userId,使得查询的sql和实体类的属性看起来都别扭。

语义混淆:data和date不分,随意混用。使用Humidity 为温度的字段命名,引起歧义。

默认控件名做前缀:如DropDownListYear、ButtonSave,编码时过滤效果非常不好。应当做必要的缩写如ddlYear、btnSave。

反用Pascal和Camel命名规则:如在javascript中使用Pascal命名方式,看起来感觉想C#方法一样。而在C#中有时用Camel命名方法,总感觉看到是js的方法,既不规范,阅读代码时也别扭。

2.方法级别的封装

复杂的功能实现只用一个方法完成,导致一个方法的代码量很大(多到几百行),代码逻辑不清晰,可读性不好,修改和维护极其不方便。

根据职责单一原则,一个方法应该只实现单一的功能。推荐的做法是将功能按步骤划分,主要步骤和思路在主方法中体现,显得代码简洁、有条理和逻辑性,而每个步骤的中功能点的具体实现可将算法封装成方法供主方法调用。一些反复用到的方法应该封装到工具类中。

3.类层次的封装

所有需要用到的方法都在类里写一遍,另一个类需要用到时有拷过去用。重复的代码分散得到处都是,不仅代码臃肿,一旦需要修改其中的逻辑,就得一处处找出来修改,维护工作量也大。

对于相同或相类似的功能,可以考虑封装到共同的基类中。而使用范围更广的方法,应该封装到的专门的通用工具类中。

4.基本的代码分层

没有3层架构,业务层直接查数据库,业务逻辑都却在UI页面的后台代码中,臃肿混乱。

有3层架构,业务层只按表划分,只实现调用dal层。(即便是基本的3层架构, 业务层除了调用dal层,也应该有部分文件按业务模块划分,用于处理业务逻辑。)

5.前端代码的管理

css样式和javascript代码写在html元素内部。

css样式提取到了<style></style>内,javascript代码也提取到<head>中的<script></script>,但是同样的css样式或js在每个页面用到时都写一遍。

css样式和javascript代码提取到了单独的文件,但是没有按模块划分到不同的文件。这样每个引用它的页面可能只是用到其中的一小部分,却要下载整个css文件或js文件。

所以合理的做法应该是做必要的划分,如一个查询页面的可能用到的js分代码可划分到layout.js、init.js、condition.js、request.js、respons.js等,分别处理布局、页面初始化、查询条件的联动变化、数据异步请求、数据处理及页面更新。

编程规范知多少

以上说了这么多,其实也只是强调了对规范命名和面向对象编程的封装性的重视。要做好上规模的项目对规范要求的远远不止这些,需要合理的使用面向对象的继承和多态,以及一些常用的设计模式应用到编程中。将泛型、接口等抽象编程应用的多层架构的搭建上,引入ORM框架,使用代码生成工具结合模版批量生成基础代码等等。当然其中一些已经超出编程规范的范畴,属于架构方面的技术了。但是规范无处不在,你重视它,它也许只是在某个角落对你会心笑笑;你不重视它,它可能会像一个幽灵,有一天会缠上你。一句话:没有规范就难以产生专业、健壮、强大的系统。