降低包含大量if语句的if语句的复杂性

时间:2015-02-25 19:08:14

标签: java

我有一种方法可以减少圈复杂度。但我不确定如何去做。

public boolean isEqual(Car car) {
    if (this.id != car.id) return false;
    if (this.reg != car.reg) return false;
    if (this.vin != car.vin) return false;
    if (this.make != car.make) return false;
    if (this.model != car.model) return false;

    return true;
}

在方法中有更多if语句,但我只包含了一些。我怎样才能降低复杂性? 如果格式不正确,我很抱歉,因为我已经在手机上写了这个。

4 个答案:

答案 0 :(得分:1)

真的没有办法让它更清洁。正如Maroun在评论中质疑的那样,并没有那么复杂。但是,你可以摆脱" if"语句,这样阅读起来会容易一些:

public boolean isEqual(Car car) {
    return this.Id == car.id &&
           this.reg == car.reg &&
           this.vin == car.vin &&
           this.make == car.make &&
           this.model == car.model;
}

您可以在此处继续添加任意数量的内容。这有点像你的"如果"陈述,第二,它发现"假"结果,它将停止检查任何其他人,并返回错误的结果。

答案 1 :(得分:1)

您可以使用第三方库,例如Apache Commons lang,它具有以下实用程序方法:

public boolean isEqual(Car car) {
       return new EqualsBuilder().reflectionEquals(this, car);
    }

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html

然而,询问您是否确实需要比较所有字段:如果CarA和CarB具有相同的ID(或vin或注册),则它们肯定只能相等。

public boolean isEqual(Car car) {
       //return this.reg= other.reg;?
       //return this.vin= other.vin;?
       return this.id = other.id;
}

答案 2 :(得分:0)

你可以这样做:

 public boolean isEqual(Car car) {
 return 
    !(this.id != car.id
    || this.reg != car.reg
    || this.vin != car.vin
    || this.make != car.make
    || this.model != car.model);
 }

答案 3 :(得分:0)

有些人会这样写,有点清楚(@krillgar也这样说)

public boolean isEqual(Car car) {
   return (this.id == car.id) &&
          (this.reg == car.reg) &&
   ...
}

然而,即使这看起来太长,你也应该把它分成更小的测试,用于"相同"。

public boolean isEqual(Car car) {
   return this.sameMakeAndModel(car) &&
          this.sameRegistrationInfo(car) &&
   ...
}


boolean sameMakeAndModel(Car car) {
   return (this.make == car.make) &&
          (this.model == car.model) &&
          ...    check engine size, colors?
}

boolean sameRegistrationInfo(Car car) {
   return (this.vin == car.vin) &&
          (this.reg == car.reg) &&
          ...    
}

这些子测试是公开的,受保护的还是私人的是TBD。

P.S。出于偏执,添加一个car参数为非空的测试!