如何降低代码复杂度
不管是作为后端语言的php(用java、go的别撇嘴,在我们的项目里边,php是绝对的后端),还是作为前端的js,很多早期甚至中级的开发者,都没有注意到代码逻辑层次的问题。更没有注意到的是,代码逻辑层次太多的代码,很容易买下隐患,而且可读性和可扩展性都比较差,容易形成bug。
今天审核代码的时候,遇到一个逻辑层次非常多的代码,当时就被震撼到了。不过在自己处于那个阶段的时候,何尝没有过类似的问题和烦恼呢,因此,还是分享一下如何化解其这种多逻辑层次的思路。
private function translateList($stores)
{
$storeIds = !empty($stores['data']) ? array_column($stores['data'], 'store_id') : array();
if ($storeIds) {
// ...
foreach ($stores['data'] as &$data) {
//子账号名称
foreach ($subacc as $k => $sub) {
...
}
foreach ($data as $key => $val) {
if (in_array($key, $filter) && empty($val)) {
$data[$key] = "- -";
}
//区别主账号子账号,是主账号给列出来
if ($key == "sub_count") {
if (!empty($val)) {
$data['uid_type'] = "主账号:";
foreach ($data['child_name'] as $child) {
$data['uid_type'] .= $child['uid_uname'].",";
}
} else {
$data['uid_type'] = "子账号";
}
}
if ($key == "sub_count") {
...
}
}
}
}
return $stores;
}初略算了一下,最深的逻辑层次竟然达到7层。逻辑层次和空间维度差不多,每增加一个维度,信息和变数就增加指数级的变化。对于空间维度,我们最能理解的也就是3维了。实际上,对于代码的逻辑层次,要想比较顺畅地理解下来,3层也就是一个临界点了,最大的话,就得烧脑了。
那么,怎么降低代码的逻辑层次呢?我对开发人员给出了几个建议:
1. 异常流程尽早结束
比如,函数一开始就通过if来对有$stores的情况进行了判断,后面所有的逻辑都被包裹在if语句里边。事实上,反过来先写异常流程,将使代码逻辑变得一下子简单明了了。
if (!$stores) {
return $stores;
}
// 正常逻辑这样,大部分正常逻辑不再被嵌套在if语句里边,理解起来更加清晰。
2. 明晰逻辑层次
可以多做几次循环,每个循环做一两件事情,而不是把所有要做的事情都放到一个循环里边。
这样做的话看起来轻松,有条理;改起来很容易定位
3. 多用系统函数。
比如,下面的代码:
$data['childs_name'] = "";
foreach ($data['child_name'] as $child) {
$data['childs_name'] .= $child['uid_uname'].",";
}用系统函数implode即可降调一个逻辑层次:
$data['child_name'] = implode(',', $data['child_name']);4. 对于一些复杂的逻辑算法,也可以将其抽象成函数,通过调用函数来降低逻辑层次。
通过上述行之有效的方法,降低代码层次,将使代码结构和层次更加清晰,便于理解,便于扩展。