设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

20条常见的编码陷阱 你中枪了没?

2012-11-20 14:18| 发布者: 红黑魂| 查看: 3107| 评论: 0|来自: CSDN

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

12.保持方法可维护性

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

  1. class SomeClass {  
  2.    function monsterMethod() {  
  3.       if($weArePilots) {  
  4.          $this->goAndDressUp();  
  5.          $this->washYourTeeth();  
  6.          $this->cleanYourWeapon();  
  7.          $this->takeYourHelmet();  
  8.          if($this->helmetDoesNotFit())  
  9.             $this->takeAHat();  
  10.          else 
  11.             $this->installHelmet();  
  12.          $this->chekcYourKnife();  
  13.          if($this->myAirplain() == "F22")  
  14.             $this->goToArmyAirport();  
  15.          else 
  16.             $this->goToCivilianAirport();  
  17.          $this->aim();  
  18.          $this->prepare();  
  19.          $this->fire();  
  20.       }  
  21.    }  

再看如下代码:

  1. class SomeClass {  
  2.    function monsterMethod() {  
  3.       if($weArePilots) {  
  4.          $this->prepareYourself();  
  5.          $this->tryHelmet();  
  6.          $this->findYourAirport();  
  7.          $this->fightEnemy();  
  8.       }  
  9.    }  
  10.    private function prepareYourself() {  
  11.       $this->goAndDressUp();  
  12.       $this->washYourTeeth();  
  13.       $this->cleanYourWeapon();  
  14.       $this->chekcYourKnife();  
  15.    }  
  16.    private function tryHelmet() {  
  17.       $this->takeYourHelmet();  
  18.       if($this->helmetDoesNotFit())  
  19.          $this->takeAHat();  
  20.       else 
  21.          $this->installHelmet();  
  22.    }  
  23.    private function findYourAirport() {  
  24.       if($this->myAirplain() == "F22")  
  25.          $this->goToArmyAirport();  
  26.       else 
  27.          $this->goToCivilianAirport();  
  28.    }  
  29.    private function fightEnemy() {  
  30.       $this->aim();  
  31.       $this->prepare();  
  32.       $this->fire();  
  33.    }  

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

13.避免深层嵌套

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

  1. function doSomething() {  
  2.     if ($someCondition) {  
  3.         if ($someOtherCondition) {  
  4.             if ($yetSomeOtherCondition) {  
  5.                 doSomethingSpecial();  
  6.             }  
  7.             doSomethingElse();  
  8.         }  
  9.     }  

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

  1. function doSomething() {  
  2.     if (!$someCondition) {  
  3.         return false;  
  4.     }  
  5.     if (!$someOtherCondition) {  
  6.         return false;  
  7.     }  
  8.     if ($yetSomeOtherCondition) {  
  9.         doSomethingSpecial();  
  10.     }  
  11.     doSomethingElse();  
  12. }  

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

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

  1. function someFunc() {  
  2.    if($oneThing) {  
  3.       $this->doSomething();  
  4.       if($anotherThing)  
  5.          $this->doSomethingElse();  
  6.    }  

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

  1. function someFunc() {  
  2.    if($oneThing) {  
  3.       $this->doSomething();  
  4.       $this->doAnotherThing($anotherThing);  
  5.    }  
  6. }  
  7. private doAnotherThing($anotherThing) {  
  8.    if($anotherThing)  
  9.       $this->doSomethingElse();  

14.避免使用匿名数字和字符串(Avoid Magic Numbers and Strings)

使用匿名数字和字符串是有害无益的,在代码里定义需要使用的变量和常量。比如下面这段代码:

  1. function someFunct() {  
  2.    $this->order->set(23);  
  3.    $this->order->addProduct('superComputer');  
  4.    $this->shoppingList->add('superComputer');  

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

  1. function someFunct() {  
  2.    $orderId = 23;  
  3.    $selectedProductName = 'superComputer';  
  4.    $this->order->set($orderId);  
  5.    $this->order->addProduct($selectedProductName);  
  6.    $this->shoppingList->add($selectedProductName);  

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

15.使用Built-in数组函数

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

差的代码:

  1. foreach (&$myArray as $key =>$element) {  
  2.    if ($element > 5) unset ($myArray[$key]);  

改进后的代码:

  1. $myArray = array_filter($myArrayfunction ($element) { return $element <= 5;});  

PHP里面提供了许多数组方法。起初会混淆,但是试着花时间好好学学它们。

16.不要过度使用变量

大家在开发过程中很容易使用变量,但请记住,变量是需要存储在内存中的。看下面这段代码:

  1. public function get_posts() {  
  2.    $query = $this->db->get('posts');  
  3.    $result = $query->result();  
  4.    return $result;  

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

  1. public function get_posts() {  
  2.    $query = $this->db->get('posts');  
  3.    return $query->result();  

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

通用篇

17.依赖数据库引擎

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

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

18.正确命名变量

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

19.方法表示动作

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

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

20.结构的定义

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

  • 首行缩进4字节或2个标签宽度。
  • 设置合理的线宽(line-width)并且保持。一行只有40个字节?我们已经不是70年代的人了。一行限制在120个字节,并且在屏幕上放一个标签,并且驱使IDE保持。

结论

发生错误不要紧,关键是要总结错误,并且从中吸取教训,只有不断总结和学习,才能让你的编程之路走的更远。

来自:20 All Too Common Coding Pitfalls For Beginners


酷毙
1

雷人

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部