给函数取一个“好”名字

参考资料:https://www.cnblogs.com/dolphin0520/p/10567879.html

一、常见的函数命名风格

目前,函数最常见的两种命名风格:

(1)驼峰命名法: 多个单词组成一个名称时,第一个单词全部小写,后面单词首字母大写;如:

 void setUserName(string userName);

(2)帕斯卡命名法:多个单词组成一个名称时,每个单词的首字母大写;如:

 void SetUserName(string userName);

两种命名风格都是OK的,但要保证一点,对于一个团队或者一个项目,需要根据语言本身的推荐命名方式做好约定。

二、函数命名最高境界

我认为函数命名的最高境界是:见字如面,看到函数的名字就知道这个函数的功能。

比如上面的函数:

 void SetUserName(string userName);

但是下面的这个函数命名就不是一个好的命名:

string AddCharacter(string originString, char ch);

这个函数,一咋看,还不错,从函数字面意思看是给某个字符串添加一个字符。但到底是在原有字符串首部添加,还是在原有字符串末尾追加?亦或者是在某个固定位置插入呢?从函数名字完全看不出来这个函数的真正意图,只能继续往下读函数的具体实现才知道。

下面这几个名字就比上面要好得多:

string AppendCharacter(string originString, char ch);     //追加到末尾

string InsertCharacter(string originString, char ch, int insertPosition); //插入到指定位置

三、函数命名关键要领

(1)要领1:动词选取要精准

        通常来说, 动词决定了一个函数要采取什么“动作”。动词取得好,一个函数命名已经成功了80%。

        常用的动词表:

类别单词
添加/插入/创建/初始化/加载 add/append/insert/create/initialize/load
删除/销毁delete/remove/destroy/drop
打开/开始/启动open/start
关闭  close/stop
获取/读取/查找/查询get/fetch/acquire/read/search/find/query
设置/重置/放入/写入/释放/刷新set/reset/put/write/release/refresh
发送/推送send/push
接收/拉取receive/pull
提交/撤销/取消submit/cancel
收集/采集/选取/选择collect/pic/select
提取/解析sub/extract/parse
编码/解码encode/decode
填充/打包/压缩fill/pack/compress
清空/拆包/解压flush/clear/unpack/decompress
增加/减少increase/decrease/reduce
分隔/拼接split/join/concat
过滤/校验/检测filter/valid/check

(2)名词使用领域词汇:

       举个例子:集合的容量通常用capacity、集合实际元素个数用size、字符串长度用length,这种就遵循大家的使用习惯,不要用size去形容字符串的长度

        再比如,加入使用到建造者模式,那么通常用build作为函数名字,这个时候不要另辟蹊径,用create作为函数名字,使用大家约定俗称的命名习惯可以大大增加代码的可读性。

        常用名词表

类别单词
容量/大小/长度capacity/size/length
实例/上下文instance/context
配置config/settings
头部/前面/前一个/第一个header/front/previous/first
尾部/后面/后一个/最后一个tail/back/next/last
区间/区域/某一部分/范围/规模range/interval/region/area/section/scope/scale
缓存/缓冲/会话cache/buffer/session
本地/局部/全局local/global
成员/元素member/element
菜单/列表menu/list
源/目标source/destination/target

(3)要领3:函数取名最忌讳“名不副实”

举个例子,有个函数判断是否存在key:

bool IsExist(string key)
{
   if(存在)
  {
     Delete(key);
     return true;
   }
  else
  {
     return false;
  }
}

上面这个函数从函数字面意思看是判断key是否存在,但是!!它居然在函数中隐藏了一段特殊逻辑:如果存在则删除key。这个就是典型的“名不副实”。这个是最忌讳的!会给后续的开发人员留下“巨坑”!!

有两种方式去优化这段代码:

1)将隐藏的逻辑去掉:

bool IsExist(string key)
{
   if(存在)
  {
     return true;
   }
  else
  {
     return false;
  }
}

2)改变函数名字

bool DeleteIfExist(string key)
{
   if(存在)
  {
     Delete(key);
     return true;
   }
  else
  {
     return false;
  }
}

(4)要领4:多查询条件的函数名字谨慎使用介词by

       我们平时在写查询接口时,假如有多个查询参数怎么办?每个通过by一起连接依赖?No!这绝对不是明智的方式。假如一开始产品的需求是通过学生姓名查询学生信息,写出来的可能是这样的函数:

List<Student> GetByName(string name);

然后有一天产品提出了新的需求,希望同时可以通过姓名和电话号码来查询学生信息,那么函数可能变成这样了:

List<Student> GetByNameAndMobile(string name, string mobile);

接着可能又会变成这样:

List<Student> GetByNameAndMobileAndAge(string name, string mobile, int age);

如果这样给函数命名,那么你的噩梦大门即将打开。

通常比较好的做法是

1)如果是通过主键id来查询,那么可以通过by 来连接查询信息,

Student GetByStudentId(long studentId);

2)如果是通过其他属性来查询,并且未来会存在多个组合查询的可能性,建议进行封装,比如

List<Student> GetStudent(StudentSearchParam searchParam);

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值