当前位置: 首页 > 知识库问答 >
问题:

如何重构以降低代码的复杂性?

淳于慎之
2023-03-14

我有以下代码,我需要重构它,以降低复杂性,增加模块化和封装性。我还需要减少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);
        }       
    }

你如何重构这个代码?切换案例是否降低了复杂性?

共有1个答案

廖臻
2023-03-14

使用反射:

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。