这是写给新手的。嗯,我实际上也是个新手。老手们应该可以不看,看了如果觉得有地方不对,请多多批评。谢谢!
基于数组对if语句的重构。
用if时。
<?php
$table = 'test_order';
if ($table === 'test_order' OR
$table === 'test_client' OR
$table === 'test_area')
{
echo $table;
}
else
{
die('err');
}
?>
用数组代替多个OR时。
<?php
$table = 'test_order';
$arr = array(
'test_order' => '',
'test_area' => '',
'test_client' => '',);
if (isset($arr[$table]))
{
echo $table;
}
else
{
die('err');
}
?>
很明显用数组代码更少,更重要的是,数据可以作为值来传递,而在php中,代码是不能作为数据结构来传递的。当然,有时候用数组会损失一点点效率,但不是系统瓶颈的话,是不值得去优化的——过早优化之所以不好,是因为很多时候优化 约等于 “写死”, 也就失去了灵活性。
基于switch和函数对if语句的重构。
<?php
$inkai_pattern = '3';
$dly_summary = 123;
$dly_sum_nyukai = 55;
$dly_nyu_keskin2 = 1;
$dly_nyu_keskin3 = 2;
$dly_nyu_keskin4 = 4;
$dly_nyu_keskin5 = 8;
$dly_nyu_keskin6 = 16;
$dly_dpe_urikin = 13;
$dly_bup_urikin = 14;
// 重构前的代码变量都是些日语拼音,不过我们单位多数的表都是日语拼音命名的。
if ($inkai_pattern == "1")
{
$dly_nyu_genkin = $dly_summary - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
$dly_tenant_kin = 0;
}
elseif ($inkai_pattern == "2")
{
$dly_nyu_genkin = 0;
$dly_tenant_kin = $dly_summary - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
}
elseif ($inkai_pattern == "3")
{
$dly_nyu_genkin = $dly_sum_nyukai + $dly_dpe_urikin + $dly_bup_urikin;
$dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
}
elseif ($inkai_pattern == "4")
{
$dly_nyu_genkin = $dly_sum_nyukai + $dly_bup_urikin;
$dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
}
elseif ($inkai_pattern == "5")
{
$dly_nyu_genkin = $dly_sum_nyukai;
$dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
}
elseif ($inkai_pattern == "6")
{
$dly_nyu_genkin = $dly_sum_nyukai;
$dly_tenant_kin = $dly_summary - $dly_nyu_genkin - ($dly_nyu_keskin2 + $dly_nyu_keskin3 + $dly_nyu_keskin4 + $dly_nyu_keskin5 + $dly_nyu_keskin6);
}
var_dump($dly_nyu_genkin, $dly_tenant_kin);
// 重构后的代码
list($dly_nyu_genkin, $dly_tenant_kin) = get_cash_deposit($inkai_pattern, array(
'all_summary' => $dly_summary,
'all_sum_nyukai' => $dly_sum_nyukai,
'bup_urikin' => $dly_dpe_urikin,
'dpe_urikin' => $dly_bup_urikin,
'nyu_keskin2' => $dly_nyu_keskin2,
'nyu_keskin3' => $dly_nyu_keskin3,
'nyu_keskin4' => $dly_nyu_keskin4,
'nyu_keskin5' => $dly_nyu_keskin5,
'nyu_keskin6' => $dly_nyu_keskin6,
));
var_dump($dly_nyu_genkin, $dly_tenant_kin);
function get_cash_deposit($inkai_pattern, $data)
{
//对未定义的值设定默认值, 如果必须有值,则不应设默认值。
$data = array_merge(
array(
'bup_urikin' => 0,
'dpe_urikin' => 0,
), $data
);
$data['_pattern'] = (int) $inkai_pattern;
{// 很旧的项目配置register_globals = on ,不可以用extract,所以以后做新项目一定要把这个关了。
/* $all_summary = $data['all_summary'];
$all_sum_nyukai = $data['all_sum_nyukai'];
$bup_urikin = $data['bup_urikin'];
$dpe_urikin = $data['dpe_urikin'];
$nyu_keskin2 = $data['nyu_keskin2'];
$nyu_keskin3 = $data['nyu_keskin3'];
$nyu_keskin4 = $data['nyu_keskin4'];
$nyu_keskin5 = $data['nyu_keskin5'];
$nyu_keskin6 = $data['nyu_keskin6'];
$_pattern = $data['_pattern']; */
//觉得自己傻了,实际上可以用一个循环代替extract
foreach ($data as $key=>$val)
{
${$key} = $val;
}
}
$sum_nyu_keskin = $nyu_keskin2 + $nyu_keskin3 + $nyu_keskin4 + $nyu_keskin5 + $nyu_keskin6;
$nik_data = 0;
$tenant_kin = 0;
while (true) { switch ($_pattern)
{
case 1:
$nik_data = $all_summary - $sum_nyu_keskin;
$tenant_kin = 0;
break 2;
case 2:
$nik_data = 0;
$tenant_kin = $all_summary - $sum_nyu_keskin;
break 2;
case 3:
$nik_data = $all_sum_nyukai + $bup_urikin + $dpe_urikin;
$_pattern = 101;
break;
case 4:
$nik_data = $all_sum_nyukai + $bup_urikin;
$_pattern = 101;
break;
case 5:
case 6:
$nik_data = $all_sum_nyukai;
$_pattern = 101;
break;
case 101:
$tenant_kin = $all_sum_nyukai - $nik_data - $sum_nyu_keskin;
break 2;
}}
return array($nik_data, $tenant_kin);
}
?>
如果有几个地方要用,显然要使用函数,因为参数较多,所以使用数组作参数。如果就这个地方用,改成switch就可以了,写成函数在一定程度上会影响开发效率。
用循环及数组做重复的工作的例子——下面是建文件夹的例子。
<?php/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
define('CLIENT_DIR', rtrim($_SERVER['DOCUMENT_ROOT'], '/'));
$client_id = 1;
$client_album_name = 'default';
/*
// 重构前的代码
$album_path = CLIENT_DIR . '/album';
if (( ! is_dir($album_path)) && ( ! @mkdir($album_path, 0755)))
{
echo($album_path . ' mkdir err');
}
$client_path = $album_path. '/'.$client_id;
if (( ! is_dir($client_path)) && ( ! @mkdir($client_path, 0755)))
{
echo($client_path . ' mkdir err');
}
$album_name_path = $client_path. '/'.$client_album_name;
if (( ! is_dir($album_name_path)) && ( ! @mkdir($album_name_path, 0755)))
{
echo($album_name_path . ' mkdir err');
} */
/*
// 重构后的代码
$arr_path = array();
$arr_path[] = CLIENT_DIR . '/album';
$arr_path[] = $arr_path[0]. '/'.$client_id;
$arr_path[] = $arr_path[1]. '/'.$client_album_name;
foreach ($arr_path as $path)
{
if (( ! is_dir($path)) && ( ! @mkdir($path, 0755)))
{
echo($path . ' mkdir err');
}
} */
// 也可以这样写
$arr_path = array('album', $client_id, $client_album_name);
$path = CLIENT_DIR;
foreach ($arr_path as $v)
{
$path .= '/'.$v;
if (( ! is_dir($path)) && ( ! @mkdir($path, 0755)))
{
echo($path . ' mkdir err');
}
}
?>
抽象出sql语句中的重复代码。
比如手写sql语句,并用sql方法分页要写两个sql。
SELECT COUNT(*) AS `numrows` FROM client WHERE client_attention & 1 > 0
SELECT * FROM client WHERE client_attention & 1 > 0 LIMIT 5
这个where 部分是重复的,可以把$where = ' WHERE client_attention & 1 > 0 '; 写在前后,后头要用时再拼一来。
要尽量避免重复的代码,这样会好维护一些。嗯,有个定律要破窗定律,每个程序员多多少少会被原来的代码影响——要做一个文艺的程序员,就要减少copy的次数,要克服懒惰的习性。
当然,写出这样的代码还有别的原因。
1、项目时间紧,加班时想早点回去的可能性。
2、没有实行结对编程。程序员的思维修炼如是说:“当结对编程时,我经常感觉到导航员能够进入‘模式匹配’模式,而驾驶员则不行。有时这会引起分歧。导航员说‘这里的所有代码和那边的代码完全一样,我是说——际了这些字......’驾驶员则不同意,因为他在驾驶时看不到这些。”——导航员的水平并不会比驾驶员高,只是因为情境不同,所以观察到的东西不同,我想。
3、项目紧的时间过去后想轻松一下,并没有进行重构,然后遇到新修改又猛加班。如此恶性循环,交货时间和产品质量都无保证。