代码重构-有意义的命名

作者: 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

相关文章

  • 代码重构-有意义的命名

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

  • idea如何重构与抽取

    重构: 重命名(变量重新命名) 抽取: 抽取参数(静态变量,成员变量,局部变量) 抽取函数(重复代码抽取)

  • Android开发中不可忽略的代码规范

    Android开发中的代码规范 最在重构自己的项目的时候,发现自己在以前的开发中命名不是非常规范,给现在的代码重构...

  • 有意义的命名

    有意义的命名 我们给变量,函数,参数,类和封包命名,我们给源代码及源代码所在目录命名,既然有这么多命名要做,不妨做...

  • 代码整洁之道CheckList

    总结看完《代码整洁之道》这本书之后得到的CheckList,可以用来指导之后的代码review和重构。 命名 名副...

  • 代码重构专题(转载)

    代码重构(一):函数重构规则代码重构(二):类重构规则代码重构(三):数据重构规则代码重构(四):条件表达式重构规...

  • 命名空间(namespace)

    命名空间,也称名称空间,名字空间。命名空间是用来组织和重构代码的。如同名字一样的意思,NameSpace(名字空间...

  • Clean Code Notes(代码规范)

    [TOC] Clean Code Notes 1_命名 1.1_命名要点 有意义的命名 有意义的区分 有意义命名部...

  • 《重构--改善既有代码的设计》读书笔记

    《重构--改善既有代码的设计》读书笔记 1为什么重构有用 所有有意义的事情总结下来,都是完成了一个有用的功能,或者...

  • Visual Studio 快捷键提高开发

    提高使用 Visual Studio 开发效率的键盘快捷键标题 关键字 万能重构. 重构 重命名 其他. 重命名....

网友评论

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

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