1. 背景
最近接手了个项目,在熟悉代码的时候,发现了好多可以优化的代码,这些代码都违反了一个规范,叫 方法只做一件事
感觉挺有记录意义的,所以来写一下这些问题代码,以及我觉得这些代码的问题点,还有就是优化
2. 示例一
2.1 问题代码
// 通过用户id判断有没有权限
func (userAuth *UserAuth) CheckPermission(uid int64, needAdminPermission bool) (hasPermission bool) {
user, err := userAuth.GetUserInfoById(uid)
// 用户存在即有权限
if err != nil {
hasPermission = true
}
// 需要管理员权限
if needAdminPermission {
if user.IsAdmin() {
hasPermission = true
} else {
hasPermission = false
}
}
return
}
2.2 问题点
这个CheckPermission方法做了两件事:
- 判断用户是否有一般的权限
- 判断用户是否有管理员的权限
它通过needAdminPermission
这个布尔值来决定需要做哪件事,这样会带来一些问题
-
可读性:最大的坏处是可读性变差。实际的代码并没有那么简单,它做了多件事,相应地,逻辑会变复杂,代码行数会增加,这些不利于问题的排查、后人接手。更坏的情况下,做了多件事情的方法甚至都不能做到见名知意
-
灵活、可扩展性:想想,万一需求变了,需要加多一个角色权限,这个方法好扩展嘛
-
可测试性:一般来说,入参越少、功能越少的方法,可测试性越高,写单测越简单。如果让我写这个函数的单测,我会这样按照入参来决定用例有哪些,那么这个函数的用例就有六条,不存在的用户+true/false,普通用户+true/false,管理员+true/false
2.3 优化
将CheckPermission拆分成两个方法,一个用来校验普通用户的,一个用来校验管理员的
// 通过用户id判断有没有权限
func (userAuth *UserAuth) CheckUserPermission(uid int64) (hasPermission