我有一种方法可以减少圈复杂度。但我不确定如何去做。
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语句,但我只包含了一些。我怎样才能降低复杂性? 如果格式不正确,我很抱歉,因为我已经在手机上写了这个。
答案 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);
}
然而,询问您是否确实需要比较所有字段:如果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
参数为非空的测试!