避免问题发生的代码规范

避免问题发生的代码规范 – 猫之良品 – 博客园

最近在处理老项目的问题,发现并处理了很多缺陷,虽然项目功能也不是十分多,但维护所花费的时间却很多,这是因为项目代码编写的并不完善,很多问题都难以追查。虽然项目问题很难处理,但同时也让我深思一些代码规范是多么的重要。以下先列出几点我积累到的经验,也希望可以得到一些建议。

1. AJAX的JSON返回,应该包含状态status与信息message,在javascript端对状态分析而抛出message

案例:一个mootools ajax的例子

PHP:

function handlerAjax() {
    $model = new userModel();
    $row = $model->getItem(array('username' => $_POST['username']));
    echo $row->email;
    exit();
}

 
Javascript:

var myHTMLRequest = new Request.HTML(
    {
        url: 'index.php',
        onSuccess: function(response){
            $('email').value = response;
        }
    }
).post({'username':"william's"});

 

以上代码或许能正常工作,看起来也没什么问题。但如果PHP端出错,在javascript就无法得到正确的信息,在firebug上可以明确看到有javascript错误,会让人误解是javascript程序写错了,浪费了时间去查javascript的代码。应该修改为以下方式:

PHP:

function handlerAjax() {
    $model = new userModel();
    $result = array();
    try{
        $row = $model->getItem(array('username' => $_POST['username']));
        if($row) {
            $result = array(
                'status' => true,
                'data' => $row->email
            );
        } else {
            $result = array(
                'status' => false,
                'message' => 'User not exists.'
            );
        }
    }catch (MyException $e) {
        $result = array(
            'status' => false,
            'message' => $e->getMessage();
        );
    }
    echo json_encode($result);
    exit();
}

 
javascript:

var myRequest = new Request.JSON(
    {
        url: 'index.php',
        onSuccess: function(response){
            if(response.status) {
                $('email').value = response.data;
            } else {
                alert(response.message);
            }
        }
    }
).post({'username':"william's"});

 
总结:PHP端的代码通常比较容易测试,最简单的抛出个异常或者写个LOG,问题就很明显。但javascript端调试比较困难,而且AJAX的原理是javascript从php上获取信息,中间过程中谁出了问题就比较难预计。所以php端应该给javascript端足够多的信息,好让javascript端可以处理后端出错的情况。并且在两端交互中应该需要统一格式,统一用JSON或者XML。所以在我的程序里所有给javascript传递数据的格式都会是JSON。

2. 对于程序中遇到没有得到预期值的结果,要抛出异常

案例:文件打开
PHP:

$handle = fopen($_FILES['file1']['tmp_name'], "r");
// 处理文件...

 
有时候,人就是喜欢偷懒,并且PHP的新手都特别乐观,认为只不过打开个文件,能出什么差错呢?但是在实施主机上,情况总是很多的,因为一般的环境并不会把所有PHP扩展加载。并且在WINDOWS上的PHP环境可能没有得到足够的访问权限,就例如是TEMP目录,也许因为环境配置问题使PHP对TEMP目录都不能读写,而上传文件会先存放到TEMP目录,所以以上代码还是有可能打不开的,而且还不报错,让你整个流程出现问题都不报错,你就只有一行行代码地查。应该写成如下代码:

PHP:

if (($handle = fopen($_FILES['file1']['tmp_name'], "r")) !== FALSE) {
    // 处理文件...
} else {
    throw new MyException('error message...');
}

 
总结:多花点时间处理异常,为自己以后的维护工作变得更顺利,也为了别人的维护工作变得更顺利

3. 对于有时效性的程序异常,不能只是抛出到页面上,应该写进到LOG文件里,方便以后查询

案例:定时邮件发送
PHP:

function cronjobMail() {
    try {
        $model = new mailModel();
        $item = $model->getItem({array('id' => 1)});
    } catch(MyException $e){
        Watchbog::_($e->getMessage());
    }
}

 
总结:cronjob是服务器访问网站,不是浏览器访问网站,就算你抛出异常都会看不到,那么只能写进文件上,在一段时间后看下文件是否产生了异常信息,并且应该每一次cronjob执行都做一个记录,让PHP端可以知道cronjob的状态,记录last visit时间与执行时长,万一cronjob进程被关闭了,也能在PHP端查得到。

4. Javascript上遇到的异常,应该用console.log输出

PHP有异常需要抛出,javascript有异常也应该被抛出,这样有以后要查询问题会更容易。更多人喜欢用alert把信息直接弹出来,这就如PHP端用echo、var_dump把信息抛出来一样,单点的抛信息很没有效率,调试好又得清理它。用console.log只会把信息抛到console上,一般用户不会看到,不清理它也不影响用户体验。要注意不是所有浏览器都有console对象,需要写兼容层,我想这个大家都懂的。