【问题标题】:Reducing coupling from switch statement减少 switch 语句的耦合
【发布时间】:2021-05-15 13:20:04
【问题描述】:
private void initialiseVehicle(String vehicleName) {
    
    if (vehicleName == null) {
    } else {
        switch (vehicleName) {
        case "Boat":
            vehicle = new Boat("Apollo ");
            break;
        case "Ship":
            vehicle = new Ship("Cruizz");
            break;
        case "Truck":
            vehicle = new Truck("Ford F-650");
            break;
        case "Motorcycle":
            vehicle = new Motorcycle("Suzuki");
            break;
        case "Bus":
            vehicle = new Bus("Aero");
            break;
        case "Car":
            vehicle = new Car("BMW");
            break;
        case "Bicycle":
            vehicle = new Bicycle("A-bike");
            break;
        case "Helicopter":
            vehicle = new Helicopter("Eurocopter");
            break;
        case "Airplane":
            vehicle = new Airplane("BA");
            break;
        case "Tram":
            vehicle = new Tram("EdinburghTram");
            break;
        case "Train":
            vehicle = new Train("Virgin",4);
            break;
        }
    }

    
}

我已将其从 if-else 语句编辑为 switch,但我试图通过这样做来减少 CBO 指标,并想知道是否有任何方法可以减少这里的耦合,如果需要我可以提供更多信息.

【问题讨论】:

    标签: java refactoring loose-coupling


    【解决方案1】:

    switch 表达式(没有那么不同):

    vehicle = switch (name) {
        case "Boat" -> new Boat("Apollo ");
        case "Ship"-> new Ship("Cruizz");
        case "Truck"-> new Truck("Ford F-650");
        ...
    }
    

    从名字到SupplierMap

    final Map<String, Supplier<Vehicle>> supplierMap;
    ...
    supplierMap.put("Boat", () -> new Boat("Apollo "));
    supplierMap.put("Ship", () -> new Ship("Cruizz"));
    supplierMap.put("Truck", () -> new Truck("Ford F-650"));
    ...
    vehicle = supplierMap.get(name).get();
    

    从名称到模板Map(只是一个想法):

    final Map<String, Vehicle> supplierMap;
    ...
    supplierMap.put("Boat", new Boat("Apollo "));
    supplierMap.put("Ship", new Ship("Cruizz"));
    supplierMap.put("Truck", new Truck("Ford F-650"));
    ...
    vehicle = supplierMap.get(name).clone();
    

    将车辆提供类注册为服务,例如使用ServiceLoader 框架


    只是一些想法
    (最终会有更好的方法来填充地图)每个对象都将自己注册到地图中

    【讨论】:

    • 这不能回答问题
    • @Karl 只是一些想法
    【解决方案2】:

    不确定减少对象之间的耦合到底是什么意思,但您的问题在行为上似乎是创造性的,因此使用一种名为工厂设计模式的创造性设计模式对我来说似乎是一个明智的选择。

    根据您的情况,您可以创建一个名为'Vehicle' 的接口。然后为每个 switch case 创建类,例如Boat, Ship, Truck 等等。这些具体的类将实现interface Vehicle。接口可以有未实现的方法,如move(),具体类将在其中为航行、巡航、划桨、飞行等方法提供自定义实现。

    这样它们将耦合最少并且彼此独立。

    要了解有关工厂设计模式的更多信息,请查看以下内容: https://refactoring.guru/design-patterns/factory-method

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2013-02-05
      • 1970-01-01
      相关资源
      最近更新 更多