读书人

怎么编写保质量代码

发布时间: 2013-03-01 18:33:02 作者: rapoo

如何编写保质量代码
摘要:在平时的编程工作中,大多数程序员很少会关心细节问题,本文作者跨越多个语言,为大家总结了20条常规陷阱,并提供了很好的解决方案,供大家参考学习。

不管你现在的编程技能有多么的高超,曾经你也是个亦步亦趋,不断的学习的初学者。在编程这条曲折的道路上,我想你肯定犯过一些低级的错误、遇见过一些普通的编码陷阱。本文作者跨越多个语言,为大家总结了20条常规陷阱,并提供了解决方案。

JavaScript篇

1.不必要的DOM操作

例如下面这段代码:

  1. // anti-pattern
  2. }

这段代码对DOM进行了100次修改,并且创建了100个不必要的jQuery对象。正确的做法是使用一个文档片段,或者创建一个字符串,把100个<li>元素赋给该字符串。然后附加到HTML中。这样就只需运行DOM一次,代码如下:

  1. liststring += document.getElementById(
  2. }
  3. liststring += lis.join(document.getElementById(
  4. }

语法结构清晰并且能起到解释性功能。

例如想要对给定的数字加5,仍采用上述命名模式,比如:

  1. }

有时,你会根据返回值命名,例如该函数要返回一个HTML字符串,那么可以命名为getTweetHTML(),如果函数只是做一些操作,无需返回值,那么可以在前面加一个do前缀。例如doFetchTweets()。

构造函数通常会遵循类原则,大写第一个字母:

  1. }

命名应带有描述性,比如操作型的函数在前面加do,另外要具备可读性和提示性。

3.在for...Loops中使用hasOwnProperty()方法

JavaScript数组是没有关联的,可以把它当做哈希表,使用循环来遍历对象属性:

  1. // alert's value of property
  2. }

然而,存在的问题是for...in loop是在对象属性链上遍历每个枚举类型的属性,如果你只想使用对象实际拥有的属性,这可能有问题的。那怎么解决呢?你可以使用hasOwnProperty()方法。代码如下:

  1. alert(someObject[prop]); // alert's value of property
  2. }
  3. }

4.比较布尔值

把布尔值作为条件进行比较,其实这是在浪费电脑的计算时间。看下面这个例子吧:

  1. // do something for true
  2. } // do something for false
  3. }

其实foo==true这个比较完全是多余的,因为foo已经是布尔类型。直接这样写就行:

  1. // do something for true
  2. } // do something for false
  3. }

又或者这样写:

  1. // do something if foo is false
  2. } // do something if foo is true
  3. }

5.事件绑定

在JavaScript中,事件是个复杂的问题。事件冒泡(event bubbling)和委托正在取代内联事件(inline onclick)操作(一些特殊的“初始页”除外)。

假设你有一个图片网格,需要启动一个modal lightbox窗口。千万不要采取下面的做法,示例采用的是jQuery,如果你使用相似的库或者其他,冒泡机制也同样适合传统的JavaScript。

相关的HTML代码:

  1. <>
  2. <><></>
  3. <><></>
  4. <><></>
  5. ...
  6. </>

不好的JavaScript写法:

  1. $(});

这段代码假设调用lightbox,里面传递一个anchor元素并且引用全屏图片。与其绑定每个anchor元素还不如直接使用#grid-container元素。

  1. $(});

在这段代码中,this和event.target都表示anchor元素。同样你也可以在任何父元素上使用。只要保证所定义的元素是事件目标就行(event's target)。

6.避免三元冗余

在JavaScript和PHP中,过度使用三元语句是很常见的事情:

  1. // javascript
  2. // php
  3. // javascript
  4. // php
  5. // anti-pattern
  6. {
  7. }
  8. }
  9. }
  10. {
  11. }
  12. // Show error messages
  13. ));
  14. }
  15. // Save the page
  16. {
  17. try
  18. {
  19. {
  20. }
  21. }
  22. // Show error messages
  23. catch (Exception {
  24. // Stop method execution with return, or use exit
  25. }
  26. // Got this far, must not have any trouble
  27. } }
  28. }

这是很常见的意大利面条式的代码,通过转换条件对上述代码进行优化,不仅可以增加其可读性,看起来还会更加简单,如下:

  1. }

11.使用While进行简单的迭代

使用for进行循环是很常见的事情:

  1. }

当然,for循环也有许多优势,但是对于一些的循环,使用while或许会更好:

  1. var i = x;
  2. ...
  3. }

12.保持方法可维护性

让我们来看一下这个方法:

  1. }
  2. }

再看如下代码:

  1. }
  2. }
  3. }
  4. }

对比两段代码,第二段代码更加简洁、可读和可维护。

13.避免深层嵌套

太多层的嵌套会让代码很难阅读、理解和维护。看看下面的代码:

  1. doSomethingSpecial();
  2. }
  3. doSomethingElse();
  4. }
  5. }
  6. }

条件里面又嵌套多个条件,通过转换条件,我们对代码进行了调整:

  1. }
  2. doSomethingSpecial();
  3. }
  4. doSomethingElse();
  5. }

相对于前面的代码,这段代码简洁了很多,并且所实现的功能也是一样的。

当你在if里面使用嵌套,请仔细检查代码,里面可能同时执行多个方法,例如下面这段代码:

  1. }

这种情况下,可以把嵌套代码提取出来:

  1. }
  2. }
  3. }

给23和“superComputer”赋予相应意义的变量名:

  1. }

可能会有人认为,一些无意义的变量尽量少定义,虽然它们对性能的影响是微不足道的。但可读性永远处于优先地位。请记住:不要随便优化性能,除非你知道为什么。

15.使用Built-in数组函数

使用built-in函数来代替foreach()

差的代码:

  1. }

改进后的代码:

  1. }

$result变量其实是不需要的。

  1. return $query->result();
  2. }

虽然这些差别都是微不足道的,但对于养成良好的编码习惯还是 很重要的。

通用篇

17.依赖数据库引擎

使用数据库来专门处理数据会让你的程序更高效。

例如,在大多数情况下,你可以避免冗余的数据查询。大多数的plug-and-play用户管理脚本在用户注册时都使用了两次数据查询:先检查用户名/邮件是否存在,另外再把用户信息插入到数据库中。一个比较好的做法是在数据库中设置username字段为UNIQUE,然后你可以利用本地的MySQL函数来检查用户名是否存在,然后添加进去。

18.正确命名变量

使用x、y、z命名变量的时代已经结束(除非是处理一个坐标系统)。变量是你逻辑代码的重要组成部分。不想键入长名字吗?获取一个好的IDE吧,使用IDE只需一眨眼的功夫就可以完成变量命名。

19.方法表示动作

见名知意,看到方法名字就知道它执行了哪些动作。使用一个短的,但具有描述性的范围命名(例如:public methods即可这样命名);使用一个长的名字,并且可以更加详细的描述(例如:定义private/protected methods)。这样会让你的代码更加可读可写。

当然也要避免用非英语来进行命名。例如使用“做些什()”或者делатьчтото()命名,简直是糟透了的命名。对于其他程序员来说,真的很难理解。尤其是在一个团队里,请记住,让你命名更加规范些吧!

20.结构的定义

最后,我们来说一下代码结构,从可读性和可维护性来讲,代码结构也是相当重要的,下面我们从两方面来讲:

读书人网 >编程

热点推荐