降低if-else语句的代码复杂度

时间:2019-07-25 23:20:37

标签: java if-statement sonarqube

我的代码分析插件抱怨包含以下代码的方法的代码复杂性。我注意到以下代码看起来可以合并,但是我不确定该怎么做:

for(Command command : commands) {
    if (command instanceof AddCommand || command instanceof UpdateCommand) {
        if (!isMaturityDateInPast() && !paymentDueDate().isAfter(LocalDate.now())) {
            command.execute(request);
        }
    } else {
        command.execute(request);
    }
}

我尝试引入布尔变量并将其设置在if和else语句中,但这只会增加更多的代码行。 在逻辑上放置有共同点的代码部分时,我不是很好。我可以告诉我们if-else可以合并使用,但是我不知道该怎么做。有人可以照亮吗?

5 个答案:

答案 0 :(得分:5)

我会尽早进行<!-- I used "Font Awesome" to render a checkmark --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.9.0/css/all.min.css" /> <!-- this ".card" won't have any scrolling (acting like a real card) --> <div class="card z-depth-3"> <div class="overlay"><i class="fa fa-check"></i></div> <div class="location">Home</div> <!-- for demo purposes I used a placeholder image from "https://placeholder.com" --> <img class="logo" src="https://via.placeholder.com/50" height="50" width="50"> <div class="name">Name</div> </div> <!-- this ".card" will have some scrolling to show the placement of the checkmark when scrolling --> <div class="card has-height z-depth-3"> <div class="overlay"><i class="fa fa-check"></i></div> <div class="location">Home</div> <!-- for demo purposes I used a placeholder image from "https://placeholder.com" --> <img class="logo" src="https://via.placeholder.com/50" height="50" width="50"> <div class="name">Name</div> </div>以避免重复var newItm = new Import.EntityClasses.ImportSiteList(); context.Entry(newItm).State = EntityState.Added; context.Entry(newItm).CurrentValues.SetValues(ssItm); context.SaveChanges(); 。 我认为,不应该将条件组合在一起或为其创建另一个函数。

continue

答案 1 :(得分:1)

您可以通过否定第一个条件然后将其与第二个条件合并来合并两个相同的分支。

那个,以及两个小的util方法,使代码更美观:

command.execute()

答案 2 :(得分:1)

如果您检查 AddCommandUpdateCommand所没有的命令,则可以获得更简洁的代码:

for(Command command : commands) {
    if (!(command instanceof AddCommand || command instanceof UpdateCommand)) {
        command.execute(request);
    } else if(!isMaturityDateInPast() && !paymentDueDate().isAfter(LocalDate.now())) {
            command.execute(request);
    }
}

但这充其量只是好一点。嵌套if子句真的没有任何错误。实际上,实际上这是一个嵌套在else子句中的if子句,但是由于Java(与许多其他语言一样)允许使用else if语法糖,因此看起来更干净。

答案 3 :(得分:1)

您可以对代码进行更多模块化(分解为单独的方法)。这可能使其更具可读性/可维护性,并应使静态分析更容易。

此外,当您可能只需要执行一次检查(因为输入似乎没有变化)时,您似乎在对每个迭代执行一些检查。

它也可能有助于创建一些更易读和“解释”您正在做什么的布尔值。

boolean isMaturityDateInFuture = !isMaturityDateInPast();
boolean isPaymentDueDateInPast = !paymentDueDate().isAfter(LocalDate.now());

for (Command command : commands) {
    boolean isAddOrUpdate = command instanceof AddCommand || command instanceof UpdateCommand;

    if (!isAddOrUpdate || (isMaturityDateInFuture && isPaymentDueDateInPast)) {
        command.execute(request);
    }
}

答案 4 :(得分:0)

我将尝试将其拆分为多种方法,以使其更具可读性并降低方法的复杂性。示例:

FooWithoutFunc2