作者:matrix海子
来源:matrix海子(id:matrix_haizi)
早在2013年,国外有个程序员做了一个有意思的投票统计,该投票是让程序员从以下几个选项中选出平时在工作中自己认为最难做的事情:
做项目方案设计编写测试用例撰写设计文档向别人解释我们在做什么事情实现你不认同的feature在别人写的代码基础上做改造与人沟通给函数、变量命名进行工作量估时也许在大家的印象中,撰写设计文档和在别人写的代码基础上做改造应该是最难的事情。但是最终的投票结果确让大家意想不到,这次投票一起有4522名程序员参与了投票,排在第一位的是给函数、变量命名:
大概一半的人投票给了给函数、变量命名,从这次投票结果我们足可以看出:给函数、变量命名虽然是一件再普通不过的事情,但是要想把这件事做好绝非易事。那么今天,我们就来聊一聊如何给函数取一个好的名字。
一. 常见函数命名风格
目前来说,最常见的函数命名主要有两种风格:驼峰命名和帕斯卡命名。
驼峰命名:多个单词组成一个名称时,第一个单词全部小写,后面单词首字母大写;如:
public void setusername(string username);
帕斯卡命名:多个单词组成一个名称时,每个单词的首字母大写;
public void setusername(string username);
两种命名风格都是ok的,但要保证一点,对于一个团队或者一个项目,需要根据语言本身的推荐命名方式做好约定。比如java一般都采取驼峰命名,c#采取帕斯卡命名。
二. 函数命名最高境界
我们通常说:天下武功,唯快不破。那么对于函数命名来说最高境界是什么呢?我认为是:见字如面,顾名思义,就是看到函数的名字就知道这个函数具体做了哪些事情。
比如上面的函数:
public void setusername(string username);
但是下面这个函数命名就不是一个好的命名:
public string addcharacter(string originstring, char ch);
这个函数,一咋看,还不错,从函数字面意思看是给某个字符串添加一个字符。但是到底是在原有字符串首部添加,还是在原有字符串末尾追加呢?亦或是在某个固定位置插入呢?从函数名字完全看不出来这个函数的真正意图,只能继续往下读这个函数的具体实现才知道。
而下面这几个名字就比上面要好得多:
public string appendcharacter(string originstring, char ch); // 追加到末尾
public string insertcharacter(string originstring, char ch, int insertposition); // 插入指定位置
三. 函数命名最佳实践
1)要领1:动词选取要精准
通常来说,动词决定了一个函数要采取什么动作。动词取的好,一个函数名字已经成功了80%。
常用动词表:
2)要领2:名词使用领域词汇
动词决定了函数的具体动作,而名词决定了函数具体的操作对象,对于名词,尽量使用领域词汇,不要使用生僻或者大家很少使用的词语。
举个例子:集合的容量通常用capacity、集合实际元素个数用size、字符串长度用length,这种就遵循大家的使用习惯,不要用size去形如字符串的长度。
再比如,假如使用到建造者模式,那么通常会用build作为函数名字,这个时候就不要另辟蹊径,用create来作为函数名字,使用大家约定俗成的命名习惯更容易让你的代码被别人读懂。
常用名词表:
3)要领3:函数取名最忌讳名不副实
函数取名最忌讳的是名不副实,举个例子,假如有个cache类,里面有个函数判断key是否过期:
上面这个函数从函数字面意思看是判断key是否过期,但是!!它居然在函数里面隐藏了一段特殊逻辑:如果过期则删除掉key。这个就是典型的名不副实,这个是最忌讳的,会给后续的开发人员留下巨坑。
有两种方式去优化这段代码:
方式一:将隐藏逻辑去掉
方式二:改变函数名字
4)要领4:多查询条件的函数名字谨慎使用介词by
我们平时在写查询接口时,假如有多个查询参数怎么办?每个通过by一起连接依赖?no!这绝对不是明智的方式。假如一开始产品的需求是通过学生姓名查询学生信息,写出来的可能是这样的函数:
public list getbyname(string name);
然后突然又有一天产品提出了新的需求,希望同时可以通过姓名和电话号码来查询学生信息,那么函数可能变成这样了:
public list getbynameandmobile(string name, string mobile);
接着,没过多久,产品又希望根据学生年龄来查询学生信息,那么函数可能变成这样了:
public list getbynameandmobileandage(string name, string mobile, int age);
如果这样来给函数命名,那么你的噩梦大门即将打开。
通常比较好的做法是:
如果是通过主键id来查询,那么可以通过by来连接查询信息,比如:
public student getbystudentid(long studentid);
如果是通过其他属性来查询,并且未来会存在多个组合查询的可能性,建议进行封装,比如:
public list getstudents(studentsearchparam searchparam);
最后,建议大家平时在写代码过程中,不要怕在函数命名上耗费时间,一个好的函数命名在后期会大大减少你代码重构的成本,争取对函数命名做到见字如面。
34张架构史上最全技术知识图谱
程序员专属手机壁纸来了。。。
钢筋除锈方法教你后浇带怎么快速除锈!
今年投资做什么生意好 代理古井特曲致富多多
新密市塑料大棚骨架
丰台专业的集装箱卫生间定制厂家,物美价廉
【亲身使用揭秘】 格力(GREE)1.5匹 空调 NhPaB1W 怎么样,格力和美的哪个好
给函数取一个“好”的名字
云南卧室吊顶安装报价
2019年南非国际家禽及畜牧展览会北京加达展览
厂家直销 日本塑料不锈钢4面刨刀 厨房刨子 蔬菜刨刀
滨海国际创意园写字楼物业直租 直租
快餐十大加盟店排行榜,渔遇上鱼藤椒鱼饭让加盟商可以放心赚钱
母婴产品从哪里进货?六大进货渠道要知道
优质新三板项目寻找新三板分销代理商
咸宁专业生产手持钢筋弯曲机的厂家
做优品俪嘉代理加盟有哪些条件?
节能型3pe防腐钢管生产厂家
三水焊工证、电工证、车工证等宏历渠道岗位证
NS-AUV 火焰探测器康士廉探头-CAT 1531真空泵高压柱塞泵油脂报价CAT 10
广东三合一围字机生产公司奥凯数控,开拓奉献 争创一流。
引起JA系列电子天平称量不稳定的因素