代码结构优化工作中的细节

原文地址: http://click.aliyun.com/m/6353/

摘要: 咱们说到程序优化,立马想到的是什么内容呢?一般情况下我们想到的可能是 程序执行速度 页面载入时间 内存占用 网络流量消耗 牺牲空间来换取执行速度的提升 执行重复操作来换取内存消耗的优化 以及用各种办法减少对数据库的查询 今天我们主要说的是另种优化,那就是代码结构的优化,而这一点往往更

咱们说到程序优化,立马想到的是什么内容呢?一般情况下我们想到的可能是

  • 程序执行速度
  • 页面载入时间
  • 内存占用
  • 网络流量消耗
  • 牺牲空间来换取执行速度的提升
  • 执行重复操作来换取内存消耗的优化
  • 以及用各种办法减少对数据库的查询

今天我们主要说的是另种优化,那就是代码结构的优化,而这一点往往更加重要。

优化可读性以及可扩展性

  • 硬件足够,系统复杂的时代,让代码易于阅读和调试,易于维护和扩展更重要。才能更好的团队合作,才能适应需求变化。
  • 咱们的代码,写1次,调试5次,修改10次,阅读50次。
  • 连续不断的变化会削弱原设计的概念完整性,从而最终导致软件的死掉。
  • 我们读代码就是用肉眼和大脑编译执行代码。
  • 不要让“其他人”读不懂你的代码,“其他人”可能就是一周后的你。
  • 优化时难以兼顾各个方面,当致力于性能优化时,很可能让应用程序内存消耗增加,同时代码可读性也变差。

优化既对立又统一

优化时难以兼顾各个方面,当致力于性能优化时,很可能让应用程序内存消耗增加,同时代码可读性也变差。

代码结构的优化实战

一个函数只做一件事
/**
 * 一个函数或者方法只做一件事情
 * 下面是的函数的功能是发送短信,但是它却完成里用户电话号码的查询
 * 应该把取用户手机号的逻辑提出
 */
function sendSMS($uid, $msg)
{
    $sql = "select phone from user where uid =".intval($uid);
    $re = M('user')->query($sql);
    $param['OperID'] = 'xxx';
    $param['OperPass'] = 'xxx';
    $param['msg'] = $msg;
    $param['DesMobile'] = $re[0]['phone'];
    $api = 'http://xxxx/QxtSms/QxtFirewall?'.urldecode(http_build_query($param));
    //....调接口发短信
}

//改进,我们工作中是不是也经常忽略这样的问题呢?

function getPhoneByUid($uid)
{
    $sql = "select phone from user where uid =".intval($uid);
    $re = M('user')->query($sql);
    return $re[0]['phone'];
}

function sendSMS($uid, $msg)
{

    $param['OperID'] = 'xxx';
    $param['OperPass'] = 'xxx';
    $param['msg'] = $msg;
    $param['DesMobile'] = getPhoneByUid($uid);
    $api = 'http://xxxx/QxtSms/QxtFirewall?'.urldecode(http_build_query($param));
    //....调接口发短信
}
删掉死代码
//1:去除死代码
function deadcode()
{
    setRunLog();
    ;//下面是不知死活的代码。。。
}

function setRunLog()
{
    $tree = array_reverse(debug_backtrace());
    $log = '';
    foreach ($tree as $k => $t)
    {
        $log .= $k.": File ".$t['file']."  , function ".$t['function']." , line ".$t['line']." <br />";
    }
    echo date('Y-m-d H:i:s').':I am running by:  <br />'.$log;
}

自己定义周期,如果一直没运行,则可以删除了(也还是有风险)

同一个变量别存两种数据
function addCart($item_id , $count)  
{  
    if(!is_array($item_id))  
    {  
        $_SESSION['cart']['item_id'] = $count;  
    }  
    else  
    {  
        foreach($item_id as $i_id => $count)  
        {  
            $_SESSION['cart']['i_id'] = $count;  
        }  
    }  
}  
addCart( 'IPHONE3' , 2 );  
addCart( array('IPHONE3' => 2 , 'IPAD' => 5) ); 

//更提倡这么写
function addCartSingle($item_id , $count)
{

}

function addCartArr($arr )
{

}
去掉重复代码

这样的代码在项目中是非常常见的,因为多版本的迭代,多个人书写,肯定会重复的,当需要修改业务逻辑的时候,就会发现漏改了。

//解决重复性代码
function reg_user()
{
    //insert into user...
    ;//注册用户 ...
}


function user_reg()
{
    //insert into user...
    ;//用户注册 ...
}

//每次修改要改两处,不然出BUG
//不能贸然删除,有好多地方都调用了。
//改成这样,虽然不完美,至少好一些了

function user_reg()
{
    return reg_user();
}
不要写过于高明的代码
//不写过于高明的代码
//2B 程序员
function swap1()
{
    $a = 2;
    $b = 8;
    list($a, $b) = array($b, $a);
    echo "$a , $b <br />";
}
swap1();

//普通程序员
function swap2($a, $b)
{
    list($a, $b) = array($b, $a);
    echo "$a , $b <br />";
}
swap2(2, 8);

//文艺程序员
function swap3($a,$b)
{
    $a=$a^$b;
    $b=$a^$b;
    $a=$a^$b;
    echo "$a , $b <br />";
}
swap3(2, 8);
提取出需要注释的逻辑不清代码
//提出需要注释的逻辑不清的代码
function loadHostConfig()
{
    //这里是取的当前URL的二级域名
    $host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
    $arr = explode('.', $host);
    $subdomain = strtolower($arr[0]);

    $client_arr = array(
        'edu' => 5,
    );
    if (isset($client_arr[$subdomain]))
    {
        define('UCAI_CLIENT_ID', $client_arr[$subdomain]);
        include_once SITE_PATH.'/config/'.$subdomain.'.class.php';
    }
    else
    {
        include_once SITE_PATH.'/config/www.class.php';
    }
}

//果断提出
//根据函数的意图命名——以它“做什么”命名,而不是以它“怎样做”命名。
function getSubdomain()
{
    $host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
    $arr = explode('.', $host);
    $subdomain = strtolower($arr[0]);
    return $subdomain;
}

function loadHostConfig()
{
    //这里是取的当前URL的二级域名

    $subdomain = getSubdomain();

    $client_arr = array(
        'edu' => 5,
    );
    if (isset($client_arr[$subdomain]))
    {
        define('UCAI_CLIENT_ID', $client_arr[$subdomain]);
        include_once SITE_PATH.'/config/'.$subdomain.'.class.php';
    }
    else
    {
        include_once SITE_PATH.'/config/www.class.php';
    }
}
返回值一致 单点返回 类型统一
class OneReturn
{

    public function bad($condition)
    {

        if ($condition == 1) {
            return 'one';
        }

        if ($condition == 2) {
            return 2;
        }

        return array(
            'value' => 3,
        );

    }

    public function good($condition)
    {

        $return = array('value' => 0);

        if ($condition == 1) {
            $return['value'] = 1;
        }

        if ($condition == 2) {
            $return['value'] = 1;
        }

        return $return;

    }

}

今天的经验分享就到这里啦。

原文地址: http://click.aliyun.com/m/6353/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值