典型问题2:不必要的嵌套代码
层次嵌套过多问题
在业务逻辑中,如果代码层次嵌套层次过多,会导致难以理解代码表达的逻辑。
下面join函数是要连接两个字符串,当s1或s2为空时,返回错误。该函数共有4层嵌套,虽然业务逻辑正确,但难以理解。
func join(s1, s2 string, max int) (string, error) {
if s1 == "" {
return "", errors.New("s1 is empty")
} else {
if s2 == "" {
return "", errors.New("s2 is empty")
} else {
concat, err := concatenate(s1, s2)
if err != nil {
return "", err
} else {
if len(concat) > max {
return concat[:max], nil
} else {
return concat, nil
}
}
}
}
}
func concatenate(s1 string, s2 string) (string, error) {
// ...
}
如何避免代码嵌套过多
避免代码层级嵌套过多,需要遵守“尽早返回”的原则。具体如下:
-
if中若有return,则忽略后面的else
-
翻转if-else逻辑,尽早返回
上述join函数改进后的逻辑,如下
func join(s1, s2 string, max int) (string, error) {
if s1 == "" {
return "", errors.New("s1 is empty")
}
if s2 == "" {
return "", errors.New("s2 is empty")
}
concat, err := concatenate(s1, s2)
if err != nil {
return "", err
}
if len(concat) > max {
return concat[:max], nil
}
return concat, nil
}
func concatenate(s1 string, s2 string) (string, error) {
// ...
}
让代码具备高可读性对于研发者是非常有挑战的,因此,不要想着一次就把代码写好。在研发过程中持续的 “重构”。
下一节,介绍滥用init函数导致的问题以及如何避免的方法。