咱们说到程序优化,立马想到的是什么内容呢?一般情况下我们想到的可能是
- 程序执行速度
- 页面载入时间
- 内存占用
- 网络流量消耗
- 牺牲空间来换取执行速度的提升
- 执行重复操作来换取内存消耗的优化
- 以及用各种办法减少对数据库的查询
今天我们主要说的是另种优化,那就是代码结构的优化,而这一点往往更加重要。
优化可读性以及可扩展性
- 硬件足够,系统复杂的时代,让代码易于阅读和调试,易于维护和扩展更重要。才能更好的团队合作,才能适应需求变化。
- 咱们的代码,写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;
}
}
今天的经验分享就到这里啦。
时间: 2024-10-02 16:01:21