博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
那些有坏味道的代码
阅读量:6825 次
发布时间:2019-06-26

本文共 2415 字,大约阅读时间需要 8 分钟。

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

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

嵌套太多

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

反而是不美了。

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/3446368.html,如需转载请自行联系原作者

你可能感兴趣的文章
Python脚本运行出现语法错误:IndentationError:unexpected indent
查看>>
ios开发--KVO浅析
查看>>
【Android】6.3 ProgressDialog
查看>>
Ecshop删除no_license点击查看 云登陆失败,您未有license
查看>>
ecshop模板标签的预定义变量
查看>>
php模板引擎技术简单实现
查看>>
转 Android中this、super的区别
查看>>
MySQL 报错ERROR 1054 (42S22): Unknown column 'plugin' in 'mysql.user'
查看>>
安装虚拟机,磁盘选择厚置备延迟置零与厚置备置零和Thin Provision有什么区别...
查看>>
微信小程序--问题汇总及详解之form表单
查看>>
debian wget 报ERROR: The certificate of ‘xxx’ is not trusted.
查看>>
jQuery 获取和设置radio 和 checkbox 值的操作
查看>>
XMLSpy 生成xml模板(转)
查看>>
指定屏幕区域截图
查看>>
php连接数据的步骤
查看>>
(错误)在VMmare中安装centos后不能联网
查看>>
hdu 1712 (分组背包)
查看>>
构建之法阅读笔记03
查看>>
C# 属性
查看>>
初识接口
查看>>