zoukankan      html  css  js  c++  java
  • 重构24-Remove Arrowhead Antipattern(去掉箭头反模式)

    基于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);
    }
    }
    如你所见,该方法大大整价了可读性和以后的可维护性。不难看出,该方法的所有可能的路径都会经过验证。 




  • 相关阅读:
    C++资源之不完全导引(下)
    Box2D:给你的Qt程序加上物理引擎
    优秀程序员45种习惯
    Android中AVD的使用以及错误处理方法
    C++资源之不完全导引(上)
    CSS制作横向菜单,如何让li元素在ul中居中?
    PHP SESSION
    函数返回值
    鼠标经过tr背景变色的js代码
    点击按钮下载
  • 原文地址:https://www.cnblogs.com/jgig11/p/5786395.html
Copyright © 2011-2022 走看看