SonarQube 重构此方法以降低其认知复杂性

2023-11-23

我有以下实用方法,并且我正在使用多个 if 语句并遇到认知复杂性问题。我浏览了一些链接,但我无法理解应该如何更改代码而不影响此方法的用户。

public static boolean isWrapperValid(WrapperClass wrapper, boolean isTechnicalToken){

    String key=null;
    boolean isValidWrapper = false;

    if (wrapper != null && wrapper.length() > 7
        && wrapper.substring(0, 6).equalsIgnoreCase("XYZ"))
    {
        wrapper= wrapper.substring(7, wrapper.lastIndexOf('.')+1);
    }
    if(wrapper != null && wrapper.equalsIgnoreCase("TFR")) {
        isValidWrapper=Boolean.TRUE;
    }
    try {
         key = wrapper.getKey();
    }
    catch (Exception exception) {
        return isValidWrapper;
    }

    if(key!=null) {

        Date tokenExpiryTime = key.getExpiresAt();

        if(tokenExpiryTime!=null) {
            return isValidWrapper;
        }

        String algorithm=key.getAlgorithm();
        if(!DESIRED_ALGO.equals(algorithm)) {
            return isValidWrapper;
        }

        String value6=key.getType();
        if(!DESIRED_TYPE.equals(value6)) {
            return isValidWrapper;
        }


        if(key.getValue1()!=null && key.getValue2().size()>0 && key.getValue3()!=null && key.getValue4()!=null && key.getValue5()!=null) {
            isValidWrapper=Boolean.TRUE;
        }
    }

    return isValidWrapper;
}

请分享您重构此代码的建议。


我不认为合并很多if条件之一或者简单地做一下代码清理,例如通过改变一些指令的顺序,就可以解决你的问题。

您的代码不匹配单一责任原则。您应该将这个大方法重构为更小的部分。因此,它将是可测试的,更易于维护和阅读。我花了一些时间做了这个:

public static boolean isWrapperValid(WrapperClass wrapper, boolean isTechnicalToken) {

    final WrapperClass unpackedWrapper = unpackWrapper(wrapper);
    boolean wrapperValid = isUnpackedWrapperValid(unpackedWrapper);

    Key key = null;
    try {
        key = unpackedWrapper.getKey();
    } catch (final Exception exception) {
        return wrapperValid;
    }

    if (key != null) {   
        if (doesKeyMeetsBasicConditions(key)) {
            return wrapperValid;
        }
        if (doesKeyMeetsValueConditions(key)) {
            return true;
        }
    }
    return wrapperValid;
}

protected static WrapperClass unpackWrapper(final WrapperClass wrapper) {      
    if (wrapper != null && wrapper.length() > 7 && wrapper.substring(0, 6).equalsIgnoreCase("XYZ")) {
        return wrapper.substring(7, wrapper.lastIndexOf('.') + 1);
    }
    return wrapper;
}

protected static boolean isUnpackedWrapperValid(final WrapperClass wrapper) {
   return wrapper != null && wrapper.equalsIgnoreCase("TFR");
}

protected static boolean doesKeyMeetsBasicConditions(final Key key) {
    Date tokenExpiryTime = key.getExpiresAt();
    if (tokenExpiryTime != null) {
        return true;
    }
    
    String algorithm = key.getAlgorithm();
    if (!DESIRED_ALGO.equals(algorithm)) {
        return true;
    }
    
    String value6 = key.getType();
    return !DESIRED_TYPE.equals(value6);
}

protected static boolean doesKeyMeetsValueConditions(final Key key) {
    return key.getValue1() != null && key.getValue2().size() > 0
           && key.getValue3() != null && key.getValue4() != null
           && key.getValue5() != null;
}

我不知道域逻辑,所以我的一些方法有愚蠢的名称等。正如你所看到的,现在你有很多较小的方法,没有很多分支(if条件) - 更容易测试(静态代码不好,但你可以使用例如来模拟它电源模拟).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SonarQube 重构此方法以降低其认知复杂性 的相关文章

随机推荐

  • java:为什么局部变量应该声明为final [重复]

    这个问题在这里已经有答案了 可能的重复 在Java中将方法参数声明为final是否有任何性能原因 为什么在 Java 中将局部变量和方法参数标记为 final 我正在使用 PMD 来查看代码违规情况 在 webService 方法中 我有下
  • C# 如何检查两个值之一是否为 TRUE?

    对于 C 专家来说这应该是一个简单的问题 我基本上想检查一个值或另一个值是否为 TRUE 代码如下 if Boolean Parse staff getValue Male Boolean Parse staff getValue Fema
  • 更改 DataGridView 中按钮的颜色

    我到处寻找这个问题的答案 这篇文章的答案 更改 DataGridView 单元格中按钮的颜色没有回答我关于字体的问题 我已经尝试过以下方法 DataGridViewRow r dataGridView Rows 0 r Cells 1 St
  • 用于 PHP 的 Microsoft sqlsrv 驱动程序在查询“SELECT SCOPE_IDENTITY() AS id”时不返回任何结果

    使用 php mssql 驱动程序 此查询工作正常 INSERT INTO Table columnName VALUES text SELECT SCOPE IDENTITY AS id 表确实有一个 id 列 它是一个标识 我将执行该查
  • MVC - 模型与同一页面上的多个实体绑定

    我想知道如何在从页面上多个实体返回信息的场景中使用模型绑定 我想显示来自两个单独实体的字段组合 即客户 地址 我正在为我的模型使用 Microsoft 的 DAAB 和自定义业务实体 有任何想法吗 如果您尝试在回发时绑定到多个模型 则应尝试
  • 如何在 MS SQL Server 2008 上设置日期格式

    我想根据模式格式化日期 例如 22 01 2015 或 2016 12 15 在 NET Framework 中 我们有 DateTime gt ToString 方法 它接受格式作为参数 甚至接受 string Format 它的作用相同
  • 在 Web 应用程序中处理时区

    在我们的网络应用程序中 我们需要显示并输入 不同时区不同国家的日期时间信息 目前 我们正在为每个国家 地区维护单独的 Web 服务器和单独的数据库 oracle 11g 我们计划将所有内容合并到一个具有单一数据库 Oracle 11g 的门
  • 如何在此 SSRS 表达式中“指定数据集聚合”?

    我的 SSRS 报告中需要一个行值 该值是根据报告中已使用的几个字段计算得出的 我希望它显示在名为 textboxPercentageValue 的文本框中 用半简单的英语来说 表达式 公式是 If the value of the Wee
  • Android 自定义 ArrayAdapter 在过滤后不刷新

    所以我有一个习惯ArrayAdapter所以我可以使用标题 副标题视图ListView 我有一个EditText它接受一个字符串并过滤适配器 过滤器的工作原理是过滤正确的对象 我可以通过单击它来判断 它以正确的 附加 开始意图 但是 即使过
  • Javascript:关于如何定义新数据类型有哪些指导原则?

    假设您正在创建数据类型并公开其行为 您能否举例说明何时使用 一个功能和新功能 define new data type var CustomDataType function this a whatever this doX functio
  • 设置内联元素的宽度

    您可以设置内联元素的宽度 例如 span em and strong 但在放置它们之前您不会注意到任何效果 a 我以为内联元素的宽度不能设置 b 假设可以设置宽度 在我们定位内联元素之前 我们不会注意到任何效果 因此我们指定的宽度 位置如何
  • “撤消”功能的最佳设计模式[重复]

    这个问题在这里已经有答案了 可能的重复 撤消引擎的设计模式 一般来说 您如何处理应用程序中支持 撤消 功能的问题 我曾经开发过网络应用程序和桌面应用程序 但我从来没有真正对我制作的任何 撤消 系统感到满意 我相信应该是Command设计模式
  • Angular2.js 与 Angular2.dev.js

    我想知道之间的差异angular2 js and angular2 dev js 当然还有更多文件 例如 router dev js and router js还有 我的问题是为什么有两个版本 它们之间有什么区别 angular2 dev
  • Ruby on Rails 使用外键删除固定装置

    我在使用使用外键的装置设置测试时遇到问题 如果有人能帮助我理解这一点 我将不胜感激 比方说 user type模型有一个参考 role模型 当测试执行时 测试数据库中的所有数据都被删除并再次重新插入 Rails 首先从角色模型中删除数据 而
  • 在 JS 中访问 Asp.Net Session 变量

    我无法访问 js 文件中的变量 我在页面顶部的代码是 然后我想访问我的 js 文件中的权限 我现在只想提醒您这一点 我能做到吗 thanks 您必须将会话值存储在隐藏字段中 之后您可以在 JS 中访问隐藏的 FieldValue
  • php中的应用范围

    我需要在所有请求之间共享相同的数组对象 无论来自同一浏览器 用户的请求如何 php 中是否有任何应用程序范围可以存储该数组对象 我正在使用 php 5 x 如果您想在每个用户的所有请求中共享它 使用会话可能是要走的路 如果您想在所有用户的所
  • 从 dict 创建 ORM 对象并添加到会话中

    假设我有一个User具有属性的模型id name email和一段关系languages 是否有可能创建一个User来自现有数据的实例 其行为就像我查询它一样dbsession query User get 42 我的意思特别是我希望能够访
  • 在 Qt MainWindow 上设置 WA_DeleteOnClose 属性时,删除 ui 指针时程序崩溃

    我已经设置了WA DeleteOnClose主窗口中的小部件属性 setAttribute Qt WA DeleteOnClose 但是 每当我关闭该主窗口时 我都会在其析构函数中遇到段错误 该析构函数只包含delete ui 简而言之 在
  • Pandas:将日期范围解压缩为单个日期

    Dataset 我有一个 1GB 的股票数据集 其中包含日期范围内的值 日期范围没有重叠 数据集按 股票代码 开始日期 排序 gt gt gt df head start date end date val ticker AAPL 2014
  • SonarQube 重构此方法以降低其认知复杂性

    我有以下实用方法 并且我正在使用多个 if 语句并遇到认知复杂性问题 我浏览了一些链接 但我无法理解应该如何更改代码而不影响此方法的用户 public static boolean isWrapperValid WrapperClass w