代码优化
代码质量优化
———————————————————————————————————————
把子程序的一部分提取成另一个子程序,不会降低整个程序的复杂度,只是把决策点移到其他地方,但是这样做可以降低你在同一时间必须关注的复杂度水平。由于重点是要降低你需要在头脑中同时考虑的项目的数量,所以降低一个给定程序的复杂度是有价值的。
1.提炼函数(php为例,下面一样):
function test($number){
if($number < self::MIN_NUMBER) {
$number = self::MIN_NUMBER;
}
for($i = 0; $i < $number; $i++){
//some code
}
}
可以替换成下面这种模式:
function test($number){
$number = getMin($number);
for($i = 0; $i < $number; $i++){
//some code
}
}
function getMin($number){
if($number < self::MIN_NUMBER){
return self::MIN_NUMBER;
}
return $number
}
2.替换算法(把复杂算法替换为另一个更清晰的算法):
if($str == 'China'){
$result = '中国人';
} else if($str == 'US'){
$result = '美国人';
} else if($str == 'France'){
$result = '法国人';
}
变成这样:
$people = [
'China' => '中国人',
'US' => '美国人',
'France' => '法国人'
];
$result = $people[$str];
3.逆向表达(调换条件表达顺序达到简化复杂度):
if((条件1 && 条件2) || !条件1){
return true;
} else{
return false;
}
变成这样:
if(条件1 && !条件2){
return false;
}
return true;
4.分解条件(对复杂条件表达式(if、else)进行分解并提取成独立函数):
if(do_some_1($number) || do_some_2($number)){
$number = $number.$someStr1.$someStr2.'123456789';
} else{
$number = $number.$someStr3.$someStr4.'123456789';
}
变成这样:
if(do_some_fun($number)){
$number = do_some_fun1($number);
} else{
$number = do_some_fun2($number);
}
5.合并条件(将这些判断合并为一个条件式,并提取成独立函数):
if($x < 1) return 0;
if($y > 10) return 0;
if($z != 0) return 0;
变成这样:
if(get_result($x,$y,$z)) return 0;
6.移除控制标记(可以使用break和return取代控制标记。):
$bool = false;
foreach($arrs as $arr){
if(!$bool){
if($arr == 1){
someFunction();
$bool = true;
}
if($arr == 2){
someFunction();
$bool = true;
}
}
}
复制代码
变成这样:
foreach($arrs as $arr){
if($arr == 1 || $arr == 2){
someFunction();
}
break;
}
7.以多态取代条件式(将整个条件式的每个分支放进一个子类的重载方法中,然后将原始函数声明为抽象方法。由于php是弱类型语言,这里体现的有点模糊):
复制代码
switch ($cat){
case ‘fish’:
eatFish();
case ‘moss’:
eatMoss();
}
function eatFish() {
echo "Whale eats fish";
}
function eatMoss() {
echo "Whale eat moss";
}
复制代码
变成这样:
复制代码
interface Eat {
function eatFish();
function eatMoss();
}
class Whale implements Eat {
public function eatFish() {
echo "Whale eats fish";
}
public function eatMoss() {
echo "Whale eat moss";
}
}
复制代码
8.参数化方法(建立单一函数,以参数表达那些不同的值):
$result = min(lastUsage(), 100) * 0.03;
if(lastUsage() > 100){
$result += (min(lastUsage(), 200) - 100) * 0.05;
}
变成这样:
复制代码
$result = getMin(0,100) * 0.03;
$result += getMin(100,200) * 0.03;
function getMin($start, $end){
if(lastUsage() > $start){
return (min(lastUsage(),$end) - $start);
}
return 0;
}
复制代码
9.明确函数取代参数(针对该参数的每一个可能值,建立一个独立函数):
if($name == 'width'){
$width = $value;
}
else if ($name == 'height'){
$height = $value;
}
变成这样:
function setWidth($value){
$width = $value;
}
function setHeight($value){
$height = $value;
}