编程5分钟,起名2小时。
- 场景实战
方法应该具有单一职责特效,通过一个比较好的命名来实现较高的可读性。即实现less is more。那么平时在开发中如何对一些常见的方法来进行命名?
方法命名采用小驼峰的形式,首字小写,往后的每个单词首字母都要大写。和类名不同的是,方法命名一般为动词或动词短语,与参数或参数名共同组成动宾短语,即动词 + 名词。一个好的函数名一般能通过名字直接获知该函数实现什么样的功能。
举几个常见的例子:
例如checkXxx或者validateXx方法,给人的职责便是校验业务,不推荐返回响应对象。
find/getXxx返回值为应该为Collection,不推荐是boolean类型。
若方法响应值为boolean类型,方法的前缀推荐为exists/has/is等。
find或者exists方法不推荐抛出异常,若未查询到推荐返回null。
1.1 方法的单一职责进行命名
下面可以看到一个“名不符实”的危害。
函数取名最忌讳的是"名不副实",举个例子,假如有个Cache类,里面有个函数判断key是否过期:
public boolean isExpired(String key) {
// 当前时间戳
long curTimestamp = DateUtils.nowUnixTime();
// 获取key的存入时间戳
long storeTimestamp = getStoreTimestamp(key);
if (curTimestamp - storeTimestamp > MAX_EXPIRE_SECONDS) {
// 注意这个地方的delete是个隐藏逻辑
delete(key);
return true;
}
return false;
}
上面这个函数从函数字面意思看是判断key是否过期,但是!!它居然在函数里面隐藏了一段特殊逻辑:如果过期则删除掉key。这个就是典型的"名不副实",这个是最忌讳的,会给后续的开发人员留下"巨坑"。
有两种方式去优化这段代码:
方式一:将隐藏逻辑去掉
public boolean isExpired(String key) {
// 当前时间戳
long curTimestamp = DateUtils.nowUnixTime();
// 获取key的存入时间戳
long storeTimestamp = getStoreTimestamp(key);
if (curTimestamp - storeTimestamp > MAX_EXPIRE_SECONDS)