我有以下代码,我需要重构它,以降低复杂性,增加模块化和封装性。我还需要减少ck度量值。
private void initialiseVehicle(String vehicleName) {
if(vehicleName.equals("Boat")) {
vehicle = new Boat("Apollo ");
}
else if(vehicleName.equals("Ship")) {
vehicle = new Ship("Cruizz");
}
else if(vehicleName.equals("Truck")) {
vehicle = new Truck("Ford F-650");
}
else if(vehicleName.equals("Motorcycle")) {
vehicle = new Motorcycle("Suzuki");
}
else if(vehicleName.equals("Bus")) {
vehicle = new Bus("Aero");
}
else if(vehicleName.equals("Car")) {
vehicle = new Car("BMW");
}
else if(vehicleName.equals("Bicycle")) {
vehicle = new Bicycle("A-bike");
}
else if(vehicleName.equals("Helicopter")) {
vehicle = new Helicopter("Eurocopter");
}
else if(vehicleName.equals("Airplane")) {
vehicle = new Airplane("BA");
}
else if(vehicleName.equals("Tram")) {
vehicle = new Tram("EdinburghTram");
}
else if(vehicleName.equals("Train")) {
vehicle = new Train("Virgin",4);
}
}
你如何重构这个代码?切换案例是否降低了复杂性?
使用反射:
Vehicle vehicle;
Map<String,String> m = new HashMap<>() {{
put("Boat", "Apollo");
put("Ship", "Cruizz");
// etc
}};
private void initializeVehicle(String name) throws Exception {
vehicle = (Vehicle) Class.forName(name)
.getConstructor(String.class)
.newInstance(m.get(name));
}
但我真的认为你的原始代码很简单。循环复杂性本身不应该是一个目标。
这段代码在CK中的得分可能很低,但它不像if/else链那么容易理解。
import java.util.*;
import java.lang.reflect.*;
import static java.lang.System.out;
class Vehicle {
String name;
public Vehicle(String aName) {
name = aName;
}
}
class Boat extends Vehicle {
public Boat(String s) {
super(s);
}
}
class Ship extends Vehicle {
public Ship(String s) {
super(s);
}
}
class Main {
Vehicle vehicle;
Map<String,String> m = new HashMap<>() {{
put("Boat", "Apollo");
put("Ship", "Cruizz");
// etc
}};
private void initializeVehicle(String name) throws Exception {
vehicle = (Vehicle) Class.forName(name).getConstructor(String.class).newInstance(m.get(name));
}
public static void main(String... args) throws Exception {
Main main = new Main();
main.initializeVehicle("Ship");
System.out.println(main.vehicle.name); // prints Cruizz as expected
}
}
以下代码是竞赛中问题陈述的解决方案。给出的时间限制为1s。该代码在5/7个测试用例中正常工作。对于其他情况,超过了时间限制。如何降低下面代码的时间复杂度? 编辑:问题陈述被定义为返回数字n的值或n/2、n/3、n/4之和,以最大值为准。例如,如果输入为24,则可以进一步减少或交换为12 8 6=26,12可以减少为6 4 3=13。8和6不应减少,因为这可能会降低值。最后的答案是13 8 6=27
问题内容: 我有一个接收对象并根据其检测到的对象类型执行某些操作的方法: 如何降低环复杂性?我四处搜寻,但找不到任何有用的资讯。 问题答案: 您不能为此使用面向对象的方法吗?创建具有该方法的接口,然后创建实现所需行为的子类?然后调用将执行适当的行为?
问题内容: 我正在研究将RequestDTO发送到Web服务的类。我需要先验证请求,然后再发送。 可以从3个不同的地方发送请求,每个“ requesttype”都有不同的验证规则,例如request1必须具有名称和电话号码,request2必须具有地址,等等) 我有一个DTO,其中包含很长的字段列表(名称,地址,城市,电话号码等),无论请求是哪种类型,DTO都发送相同的消息。 我创建了3种不同的验
我在重构这部分代码时遇到了问题。如何降低该代码的认知复杂性
如何降低给定代码段的复杂性?我在Sonarqube中得到了这个错误-->重构这个方法,将其认知复杂度从21降低到允许的15。