写给新手,用最基础的方法重构代码

    这是写给新手的。嗯,我实际上也是个新手。老手们应该可以不看,看了如果觉得有地方不对,请多多批评。谢谢!

基于数组对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、项目紧的时间过去后想轻松一下,并没有进行重构,然后遇到新修改又猛加班。如此恶性循环,交货时间和产品质量都无保证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值