重构24-Remove Arrowhead Antipattern(去掉箭头反模式)

时间:2024-01-21 10:25:33
基于c2的wiki条目。Los Techies的Chris Missal同样也些了一篇关于反模式的post。 
简单地说,当你使用大量的嵌套条件判断时,形成了箭头型的代码,这就是箭头反模式(arrowhead antipattern)。我经常在不同的代码库中看到这种现象,这提高了代码的圈复杂度(cyclomatic complexity)。 下面的例子演示了箭头反模式
public class Security {
public ISecurityChecker SecurityChecker;//getter setter

public Security(ISecurityChecker securityChecker) {
SecurityChecker = securityChecker;
}

public Boolean HasAccess(User user, Permission permission, List<Permission> exemptions) {
Boolean hasPermission = false;
if (user != null) {
if (permission != null) {
if (exemptions.size() == 0) {
if (SecurityChecker.CheckPermission(user, permission) || exemptions.contains(permission)) {
hasPermission = true;
}
}
}
}
return hasPermission;
}
}
移除箭头反模式的重构和封装条件判断一样简单。这种方式的重构在方法执行之前往往会评估各个条件,这有点类似于契约式设计验证。下面是重构之后的代码:
public class Security {
public ISecurityChecker SecurityChecker;//getter setter

public Security(ISecurityChecker securityChecker) {
SecurityChecker = securityChecker;
}
public Boolean HasAccess(User user, Permission permission, List<Permission> exemptions) {
if (user == null || permission == null){
return false;
}
if (exemptions.contains(permission)){
return true;
}
return SecurityChecker.CheckPermission(user, permission);
}
}
如你所见,该方法大大整价了可读性和以后的可维护性。不难看出,该方法的所有可能的路径都会经过验证。