代码重构-有意义的命名

作者: niknowzcd | 来源:发表于2018-01-19 21:54 被阅读162次

    写在文前:大部分程序员都能写出计算机可以理解的代码,唯有优秀的程序员才能写出让人容易理解的代码

    编码过程中,我们需要给变量,函数,参数,类,资源文件定义命名,合适的名字能给编码带来不少好处,比如易查找,见其名知其意等

    以下就讲述一些合理命名的简单规则

    名副其实

    在查看变量,函数或者类起到什么作用的时候,根据它们的名字就应该知道个大概,包括为什么会存在,存在的作用,什么时候会被使用到。

    举个Android下最简单的例子,比如 AddressAdapter这个类,从名字中你就能得知这个是一个关于地址的适配器,会在展示地址列表的时候被调用。

    既然说到名副其实,还可以提一提魔术数.因为魔术数是典型的名不符实。
    何为魔术数?

    魔术数 :是程式设计中所谓的直接写在程式码里的具体数值(如“10”“123”等以数字直接写出的值)。虽然程式作者写的时候自己能了解数值的意义,但对其他程式员而言,甚至制作者本人经过一段时间后,会难以了解这个数值的用途,只能苦笑讽刺“这个数值的意义虽然不懂,不过至少程式会动,真是个魔术般的数字”而得名。

    比如:

    for(int i=0;i<10;i++){
        if(i==4){
            //todo 
        }
    }
    

    上述for循环中,i==4中的这个 4就是魔术数,从这段代码来看,我们只知道i==4的时候,会有特殊的事情触发,但我们不知道4这个数字有什么意义。

    for(int i=0;i<10;i++){
        if(isLogin(i)){
            //todo 
        }
    }
    
    Bolean isLogin(int i){
        return i==4;
    }
    

    如果改成这样的代码,我们便能轻易的知道当 i==4的时候表示已经登录,这样的话对if语句中所要执行的逻辑也能知晓个大概。

    避免误导

    你取得名字应该有特定的意义,同时还要注意不要与代语音中那些理所当然的术语所冲突。

    举个简单的列子,比如有一个书的数据集(books),而有的人习惯命名为bookLists,当然这个名字也很合理,只不过这时一定要注意,承载这个数据集的容器究竟是什么。 如果容器是一个Map,那么bookLists这个名字就会误导别人,这时取名 bookMap 或者干脆就取 books 会更好.

    同样的情况还会出现在其他时候,总的来说,不要让除你之外的其他人在看到某个名字的时候,会想到很多种解释。

    做有意义的区分

    当业务逻辑越来越复杂的时候,你就不得不往上堆砌更多的代码和变量。这时你可能就需要较劲脑汁的想变量名,尤其是那种含义类似,但又必须又多个变量的情况。

    就比如数据集 mDatas 这个名字虽然意义不够明显,但是在只有一个数据集的情况下却也是十分容易理解。如果这时又必须一个变量来表示一个新的数据集,可能为了方便顺手就是 CTRL+D 复制加个2,一个mDatas2就出来了。

    当然就算 mDatas mDatas2对我等程序员也就吹灰之力,况且数据集一般也不对多到mDatas3 4 5 这个样子。

    只不过这种命名方式放到view中可能就不太一样的,业务逻辑一复杂,出个个10个8个view还是有可能的。

    所以为了更好的辨认,可以按照变量的具体作用来划分,就比如上述的例子,可以简单的划分为 topDatas,bottomDatas,也可以是bookDatas,subBookDatas等。

    百度一下,你就知道(拼音型命名/强行缩写型命名)

    对于一些初入行的,尤其是那些英语水平一般的童鞋。有的时候找不到一个合适的英文组合来命名,这个时候可能为了好记(相比之下),就采取的怕拼音的方式命名。拼音命名这可能跟我们的拼音刚好是英文字母有关系吧!

    当然这肯定是不推荐的,就算是国内,绝大部分的程序员还是习惯英文命名,shenchengriqi 这么一个命名估计大部分程序员都会瞬间爆炸吧。
    况且现在这个社会,翻译工具这么发达,generationDate这种直译的单词都更容易理解。

    另外还有一些人命名时习惯性的缩写,比如生成日期根据用户ID,直译的话 generationDateByUserId 有的人一看太长了,不美观,于是就缩写成genDataById 短是短了,可是词不达意了。

    更合适的方式可以是

    1. 换个词语 createDataById
    2. 通过参数来界定 generationDate(id)
    3. ..其他

    给每个概念定义一个词

    给每个抽象的概念定义一个词,并一直保持下去。

    什么意思呢?我相信应该会有不少人在进行网络请求的时候会想,我是用requestDatas呢?还是fetchDatas呢?亦或者干脆getDatas得了,甚至可能会因为request看着太熟悉了,想着换个词语来表达获取数据的意思。

    一个概念对应着多个词语,这种做法显得有些可笑。不管是你自己还是与你共同协作的人都会因为这种情况而做无用功。

    从现在开始,你就应该学会给每个概念定义一个显而已懂的词语。

    最后给出我自己在编码过程中的一些命名规范

    Android 下资源文件的命名规范

    drawable下:

    图标:icon_xxx
    背景:bg_xxx
    图片:img_xxx
    选择器:select_xxx
    

    layout下:

    activity_xxx
    frag_xxx
    dialog_xxx
    view_xxx
    

    颜色:

    颜色渐变
    color_white_1   #fff
    color_white_2   #333
    color_white_3   #666
    color_white_4   #999
    
    多色调 res目录下建立一个color文件夹
    text_white_gray
    text_white_yellow
    

    相关文章

      网友评论

        本文标题:代码重构-有意义的命名

        本文链接:https://www.haomeiwen.com/subject/dmravxtx.html