Java 减少包含大量if语句的if语句的复杂性
我有一个方法,我需要减少圈复杂度。但我不知道该怎么做Java 减少包含大量if语句的if语句的复杂性,java,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.mode
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语句,但我只包含了一些。如何降低复杂性?
抱歉,如果格式不正确,因为我在手机上写了这篇文章 您可以执行以下操作:
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);
}
真的没有办法让它变得那么干净。正如马龙在评论中所质疑的那样,其实并没有那么复杂。但是,您可以去掉“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;
}
您可以继续在那里添加所需的数量。这有点像你的“如果”语句,当它第二次发现一个“假”结果时,它将停止检查任何其他结果,只返回假结果。有些人会这样写,更清楚一点(@krillgar也建议这样做) 然而,如果这看起来太长,你应该把它分成更小的“相同性”测试 这些子测试是公开的、受保护的还是私有的,待定
p、 出于偏执,添加一个测试,
car
参数非空 您可以使用第三方库,如Apache Commons lang,它具有以下实用方法:
public boolean isEqual(Car car) {
return new EqualsBuilder().reflectionEquals(this, car);
}
但是,询问您是否真的需要比较所有字段:只有在具有相同id(或vin或注册)的情况下,CarA和CarB才能肯定相等
什么意义上的复杂性?@maroun-maroun。就它可以采取的不同路径而言,您是否在使用Java8?这种方法的“危险”是在不同的方法中重复检查属性。诚然,在这种情况下,额外的布尔比较并没有什么大不了的,但如果OP在更复杂的情况下继续这种模式,可能会导致大量开销。reflectionEquals比doing慢一些。不过,在测量相等性的每个字段上追加(lhs,rhs)
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) &&
...
}
public boolean isEqual(Car car) {
return new EqualsBuilder().reflectionEquals(this, car);
}
public boolean isEqual(Car car) {
//return this.reg= other.reg;?
//return this.vin= other.vin;?
return this.id = other.id;
}