如何优雅地编码

想要比较优雅地编码,需遵从以下原则,排名分先后:

  • 良好的命名

  • 清晰的结构

  • 不十分差劲的算法

如何优雅地编码

良好的命名

名不正,则言不顺,言不顺,则事不成

── 孔子

孟子曰:“孔子说的对”。

命名很重要,随便一本逻辑学教材里都会有长篇大论来讨论命名的问题,命名应该本着不怕长就怕不清楚的原则,尽量把一个类、方法、变量的含义交代清楚。

接口的命名

接口的命名一般都是前缀 I 加上名词或形容词,实际上.Net Framewrok类库就是这样做的,比如:


  • System.Collections.Generic.ICollection(名词)


  • System.Collections.Generic.IEnumerable(形容词)

接口往往用来分装一个或一组行为,实现接口的类意味着它具有了一个或一组行为的能力,所有常用形容词。当实在找不到一个恰当的形容词时,名词也可以。

抽象类

抽象类通常不需要加前缀或后缀,也有部分大牛喜欢给抽象类视情况加Base后缀。如下的命名笔者觉得就不错:

  • Shape(抽象类)

  • Ellipse(具体类)

  • Rectangle(具体类)

具体类

尽量使用名词,不排除个别情况下把一个行为封装为类时使用动词。

方法

使用动词或动词性短语。其它的字段啊、属性啊、事件啊出现命名问题的比较少,不再讨论。比如有的人喜欢字段用下划线开头,有的人喜欢用m_开头,都无关紧要,求同存异,只要使用的词语恰当,并不会带来太多麻烦。反倒是如果规定一个巨细无比的规范才有问题,一是耗费编撰者的时间,二是阅读者也记不住,三是阅读者记住了也可能因为和自己的习惯不同而心存抵触。

此外需强调一点就是少用拼音多用英文,少用缩写多用全称,尽量不用拼音缩写,甚至是方言拼音缩写,还有英语加拼音,甚至是英语加拼音缩写......。但也不能排除个别如“计划生育”这样的不好翻译的词语可以用拼音,需注释明确或维护词汇表。另外,缩写也不是不可以用,一些大家约定成俗的缩写比如“Id”,使用之并不会带来误解,还有利于代码的清晰度。

有时候由于英语水平的问题,毕竟我们的母语不是英语,难免会出现不知道用什么单词的情况。此时,可以试试codelf,感谢据说是网易工程师unbug开发的此工具。这个应该读作[koʊdɪf]吧,但是倒数第二个字母不是I,是L。

清晰的结构

基本要求

  • if、while等关键字包裹的表达式,即使只有一句,也尽量使用大括号括起来

  • 尽量避免使用直立人时代的goto语句

  • 尽量避免过长的方法,把大方法拆分为数个小方法,方法的职能尽量单一

  • 尽量避免重复代码,将其转移到公共工具中

  • 尽量避免过大的类,拆分为数个类,各司其职

  • 适当的注释,注释太多,说明代码本身的表达力可能还有待加强。有些实在难缠的逻辑,可以写详细注释,如果不写注释,离职时请注意不要泄露给擦屁股人自己的地址

较高要求

熟悉以下常用面向对象的设计原则:

  • 开放-封闭

  • 单一职责

  • 里氏替换

  • 依赖倒置

  • 接口隔离

再高要求

熟悉常用设计模式:

  • 工厂方法

  • 抽象工厂

  • 建造者模式

  • 单例模式

  • 适配器模式

  • 外观模式

  • 观察者模式

  • 命令模式

  • 代理模式

  • 策略模式

面向对象语言的三大特征人人都知道,但是真的用好却是不容易,三大特征仅仅是面向对象设计的基础,在此基础上建立起了面向对象的高楼大厦。

在此小编极力推荐一本书:《Head First 设计模式》,此书是Head First系列成名之作。此外,这个网站不错,言简意赅,案例经典:www.oodesign.com。另外,《Java编程思想》开头部分关于面向对象设计的讲解也很精彩。

使用成熟的设计模式有两个好处:

  • 这些解决方案已经经受过了考验,用了即使无功,但也不会犯错

  • 设计模式的名称本来就一种在程序员间流传的概念,基于共同的对概念的认识能够降低沟通成本

当然也有坏处,代码的扩展性虽然是好了,但是代码的复杂性也高了,这就要求我们最好熟悉常用的设计模式,这样就得到了它的好处,规避了它的坏处。

必须要注意的是:不要乱用设计模式,只有需求产生了变化,或预见了需求将要发生变化才使用这些模式来封装发生的或可能发生的变化。有时候再重构代码时也会用到,比如外观模式和设配器模式等。

更高要求

大项目肯定不是一个人能完成的,人多了容易发生混乱,此时需要团队的领袖勇敢地承担起义不容辞的责任,包括但不限于:

  • 定期维护代码框架、分层结构。写的时间长了难免乱,领袖人物要定期排除,及时消除臭味

  • 引导小弟们做代码审查。审查的意义不在于监督,而在于学习和维持良好的态度。学习指通过代码审查学习别人的长处,同时帮助别人进步

  • 过目数据库设计

  • 及时更新或委派组员更新文档

关于文档,还需多说一句:只有再非常有必要写文档的情况下才写文档。如果写了一大堆可有可无的文档,代码更新后文档也要及时更新,很难做到的。一个新手面临着一堆和代码脱节的文档只会起误导作用,以代码本身的表达力和口头交流为主,以文档交流为辅,两手都要抓,一只手硬,一只手软。

不十分差劲的算法

相信大部人做的项目都是性能不敏感的,只要稍稍注意就能做好。比如该使用分页的地方就使用分页,该根据条件查询数据库的就别一次都查出来,该优化数据库就优化数据库。

此外,压力测试也很有必要,有的性能问题只有在数据量大了的情况下才出现。很多性能问题都是到了生产环境中才暴漏出来的。


分享到:


相關文章: