那些有坏味道的代码

简介:

最近每天早上上班的第一件事情就是把昨天写的代码重构优化一下,以前没弄过,现在发现这个过程真是非常爽的。看着代码一点点变好,还是很不错的感觉。

最经常遇到的一些坏味道这里列一下:

嵌套太多

1
2
3
4
5
6
7
8
9
10
if  (! empty ( $data ) {
     if  ( is_array ( $data )) {
         foreach ( $data  as  $item ) {
             // Do something
         }
         return  $data ;
     }
} else  {
     return  null;
}

这里的问题就是代码嵌套太多层了,如果foreach里面有很多东西的话更难看

改成:

1
2
3
4
5
6
7
8
if  ( empty ( $data ) || ! is_array ( $data )) {
     return  null;
}
 
foreach ( $data  as  $item ) {
     //Do something
}
return  $data ;

其实上面一个代码一定是最符合人类思维才会这样写的,而且不得不承认很容易会写出这样的代码

后面的那个代码把阅读顺序稍微修改了下,不大影响阅读,也能优化代码,不错的。

函数返回数据的验证

1
2
3
4
5
6
7
8
9
10
11
if  ( $ver  >= 10901601) {
     $suggestIds  = SuggestModel::getSuggestIds( $word );
     if  (! empty ( $suggestIds )) {
         $this ->doAction( $suggestIds );
     } else  {
         $searchIds  = $this ->getSearchIds( $word );
         if  (! empty ( $searchIds )) {
             $this ->doAction( $searchIds );
         }
     }
}

上面一段代码,当去Suggest中获取数据失败的时候,就去Search中获取ID,但最后实际都是做一样的操作doAction

那么可以优化:

1
2
3
4
5
6
7
8
9
10
if  ( $ver  < 10901601) {
     return ;
}
 
$ids  = array ();
$ids  = SuggestModel::getSuggestIds( $word );
if  ( empty ( $ids )) {
     $ids  = $this ->getSearchIds( $word );
}
$this ->doAction( $ids );

首先由于php是若类型的,所以需要养成的好习惯:

1 一个封闭函数应该返回什么类型的数据就返回什么类型的数据

比如这里的getSearchIds的函数,如果内部原先是期望返回array的,那么如果里面的数据为空的话,请直接返回array(),不要返回null或者false。

2 一个封闭的函数最开头需要做预防性的行为

比如这里的doAction($ids) 最先需要对ids如果为空数据的话如何处理

这里的getSearchIds和doAction应该是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function  getSearchIds( $word ) {
     if  ( empty ( $word )) {
         return  array ();
     }
 
     //DoSomething
     return  $ids ;
}
 
funciton doAction( $ids ) {
     if  ( empty ( $ids )) {
         return  false;
     }
 
     // DoSomeThing
     foreach ( $ids  as  $id ) {
         // Do SomeThing
     }
     return  true;
}

可以看到,这样做如果ids是array(), 会被过滤掉,即使没有过滤,foreach也不会发出warnging。

返回格式映射

php的controller中做的最多的是什么,一定是会说是返回格式的映射

一个controller中的逻辑大概是:

step1: 获取参数

step2: 根据参数获取数据

step3: 将数据重新组装返回

如果你的php是一个接口,那么这个第三步的东西估计是天天需要做的

所以治本的方法就该是学习rest风格,先定义好一种通用的数据,然后做个通用的映射逻辑(这个是可以做的,因为数据库的格式其实是固定的)

通用代码

通用代码是经常遇到的一个问题,显而易见,如果一份代码经常使用,那么就应该把它封装起来,然后做成一个通用的。

但是呢,我的观点是不能“滥通用”。意思就是不能每每看一个东西就认为是通用的。

比如有个观点“所有配置文件都应该放在统一的地方”。

这个我认为是不必要的,只有使用一次的配置数据就应该放在使用的地方,这样能保证代码的可读性

比如这里的:

1
2
3
4
5
6
7
8
function  getManualAppsIds()
{
     $config  = '/data/conf/test.json' ;
     $content  = file_get_contents ( $config );
     $manuals  = json_decode( $content , true);
 
     return  manuals;
}

config这个变量,有人就会习惯放在其他代码里面,或者通用。但是实际上,这个几乎是永远不会再用,如果把它放到一个所谓“通用”的地方,读代码的话会出现阅读障碍。

反而是不美了。

目录
相关文章
|
9月前
|
程序员 开发者
对程序员来说最重要的小事——整洁代码
对程序员来说最重要的小事——整洁代码
95 0
|
10月前
|
数据库
代码坏味道
代码坏味道
84 0
|
10月前
|
数据库
我又写了一堆烂代码
“我又写了一堆烂代码!” 这句话我经常对自己说,目的是为了督促自己不断地思考所写的代码是否足够可靠。
39 0
|
12月前
|
消息中间件 JavaScript 小程序
用1个月重构了同事写的烂代码,我总结出了15条重写烂代码的经验!
用1个月重构了同事写的烂代码,我总结出了15条重写烂代码的经验!
|
程序员
笑出腹肌!有些程序员真会玩代码注释
笑出腹肌!有些程序员真会玩代码注释
64 0
笑出腹肌!有些程序员真会玩代码注释
|
数据库
【硬着头皮】 比较两个数大小,麻烦写得整洁点
【硬着头皮】 比较两个数大小,麻烦写得整洁点
【硬着头皮】 比较两个数大小,麻烦写得整洁点
|
JSON Java 测试技术
如何写出让人抓狂的代码?
如何写出让人抓狂的代码?
如何写出让人抓狂的代码?
|
程序员 API 数据库
想要写出好味道的代码,你需要养成这些好习惯!
大家好,我是小羽。无论做什么行业,良好的习惯会让我们受益终生。它就如我们的指南针一样,指引着我们的行动,从而走向成功。养成良好的习惯,会让我们的工作更加顺利,生活也会变的更加清晰。当我们久...
151 0
想要写出好味道的代码,你需要养成这些好习惯!
|
Cloud Native IDE 小程序
被解救的代码 - 代码即服务时代来了!
人类对自由的追求从未停止,我们用战斗获得民族自由,我们用代码获得双手自由,同时代码作为服务器的奴隶,也开始蠢蠢欲动,革命已经开始,当代码翻身做主,作为开发者的我们又该如何适应新时代的到来?
被解救的代码 - 代码即服务时代来了!
|
编译器
“整洁代码根本就是个骗局!”
怎样的代码才是整洁的代码,而怎样的代码不是呢?——事实上,没有人会写整洁的代码。

相关实验场景

更多