60

怎么样才能不写出别人嘴里的烂代码

 4 years ago
source link: https://www.tuicool.com/articles/fQZZFjZ
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

每个人对于好的代码在自己不同的时期都有不一样的理解。当个人所在的层次变化,好代码的概念也会跟着变化。

yauaE36.jpg!web

刚敲代码的时候

"老夫上手就是复制粘贴,别跟我说什么编码规范,设计模式"。刚入行的人一般都是接触到底层业务的开发,而且一般是比较浅显的业务需求。编码本身也有金字塔层级,最底端的人用于做着繁杂,混乱,变化莫测的业务需求。基本上今天写完明天改的那种。在这样的前提下,对于一个刚刚接触敲代码行业的新人而言,考虑编码规范,设计模式,几乎是不可能的。一切以按时完成任务为主要目的。

工作换了几次,改过几次别人的代码

"这写的什么玩意,简直是一坨翔,还不如自己重写"。写代码一定时间之后,自己的能力有所提升,接触到的东西越多,逐渐形成一套自己的感性认识。会一种感觉什么是好的代码,什么是不好的代码,但仅仅是感性层面的认识。

但是,每次当你辛苦重写完之前那套你认为是"一坨翔"的代码之后,你会发现,靠,跑不通了,不是这报错就是那报错。修修补补之后发现,自己重写的代码与重写自己自己的构想有很大出入。

又一段时间之后,终于代码稳定没啥爆bug的地方了,后面的人员看你的代码,还是想着,"这写的什么玩意,就是一坨翔"

在改别人的代码与被别人改代码挣扎多年

随着时间推移,发际线的上升,开始脑袋比较灵光了。看事情知道从不同的角度去看了,知道任何事情的存在必定有一定存在的因素。不再是上来就把别人写的代码重写一遍,更多的是按一定的标准去重构。

重构跟重写是有很大区别的。重写是在了解代码逻辑之后,全部按自己的思路完全实现一遍。重构是修改代码中不符合规范,或不正确的地方,不合理的地方。

相对于重写而言,优秀的重构所需要的能力比重写要高很多。重写我不用管内外部依赖,反正都是推翻重新来过。而重构需要兼容整个项目,甚至是外部项目的依赖。

怎么样才能不写出一坨翔

说了这么多废话,其实我也不知道什么样的代码是好的代码,毕竟大家都说好的代码是不存在的。

只是说,尽可能的符合多数人的习惯,简洁不冗余的代码是稍微好的代码。

工作中整理了一些习惯,避免自己把代码写成一坨翔:

1)不要犯低级的语法错误,尽管不是ERROR级别的错误

这是最基本的,学习一门编程语言,不应该在对外项目代码中有语法错。语法错误只会让人家觉得你很low,是一个菜鸟。

例如定义常量,非静态方法不要使用静态方式调用

defiend(APP) or defien(APP,1);

2)检查用户输入数据

业务中有一条规矩,永远不要相信用户的输入数据。不能假设用户会按你需要的数据给你请求数据。

例如:

if($params['status'])
{

}

params 是用户请求参数,在判断取值之前,应该先判断是否有这个数据吧

3) 函数定义,默认参数应该放在末尾

例如下面的:

function makeSign($data,$header='',$clientip){

}

4)判断语句减少嵌套

function makeSign($data){

    if($data['status'] == 1)
    {
        if($data['client_id'] == 2)
        {
            if($data['type'] == 3)
            {
                //....业务逻辑2
                $status = 1;
            }
            else
            {
                //....业务逻辑1
                $status = 0;
            }
        }
        else
        {
            //....业务逻辑1
            $status = 0;
        }
    }
    else
    {
        //....业务逻辑1
        $status = 0;
    }
    return $status;
}

可修改为:

function makeSign($data){
    $data = array_merge(['status'=>0,'type'=>0,'client_id'=>0],$data);
    if($data['status']!=1 || !$data['type']!=1 || $data['client_id']!=1)
    {
        //....业务逻辑1
        return $status;
    }
    //....业务逻辑2
    return 1;
}

5)函数的输出尽可能同意,或者可以根据外部指定返回不同类型

function checkDataClient($clientId){
    if($clientId%2){
        return true;
    }
    return false;
}
function getdata($data){
    $data = array_merge(['client_id'=>0],$data);
    $res = $this->checkDataClient($data['client_id']);
    if( $res )
    {
        return $data;
    }
    return ['code'=>1,'msg'=>'非法用户'];
}

getdata方法,在client_id的数据非法的时候与合法的时候返回的数据格式不一致。

修改:

function getdata($data){
    $data = array_merge(['client_id'=>0],$data);
    $res = $this->checkDataClient($data['client_id']);
    if( $res )
    {
        return ['code'=>0,'msg'=>'','data'=>$data];
    }
    return ['code'=>1,'msg'=>'非法用户','data'=>[]];
}

6)类对象不要相互引用

时刻注意,构建的代码应该是一个层级的树状结构而不应该是网状结构。当代码变成网状结构的时候就是灾难爆发的时候,动任何一个地方都有可能引爆全部业务。相互引用也会造成内存的问题

7)编码规范化,最好是强制格式化指定的规范

规范不要靠嘴说!不要靠嘴说!不要靠嘴说!直接用工具格式化。任何语言都有业界比较好的规范,遵循规范,起码你代码看上去,阅读起来比较方便。

8)代码放置的位置要慎重

业务迭代的过程中,代码改来改去,今天加点,明天删点。但是代码的位置一定要思考清楚。

比如一个登陆验证:

function init(){
    if(!session('user_name'))
    {
        getUserNameFromDb(session('user_id'));
    }
    if(!session('user_id'))
    {
        throw new \Exception("请先登录", 1);
    }
    ...
}

这一看就是后期修改添加的代码,还放错位置了

可用工具

代码格式化可以用 phpcs

代码的低级错误 可以用 phplint , phpstan 做代码静态检查

代码设计层面,代码规范上,命名等可以使用 phpmd


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK