重构java方法以减少圈复杂度

时间:2015-02-16 19:49:24

标签: java refactoring

    ArrayList cars = vehicles.getExtras();

    Iterator it = cars.iterator();
    while(it.hasNext()){
        Extra cExtra = (Extra)it.next();

            if (cExtra.getExtraId()==INSURANCE)
                insurance = cExtra.getExtra();

            if (cExtra.getExtraId()==ROAD_ASSISTANCE_CODE)
                roadAssCode = cExtra.getExtra();

            if (cExtra.getExtraId()==TYPE)
                replacementCarServiceType = cExtra.getExtra();

            if (cExtra.getExtraId()==CATEGORY)
                replacementCarCategory = cExtra.getExtra();

            if (cExtra.getExtraId()==ASSISTANCE){
                roadAssistanceCode = cExtra.getExtra();
            }

我有更多这些'if'类型,我没有包括在内。 我怎么能重构这个,所以可以减少圈复杂度。

1 个答案:

答案 0 :(得分:2)

Polymorphism is usually the key to reducing CC。如果你有一组类似的东西,它们做类似但不同的东西,那么也许这些东西可以从一个公共基类继承,但是覆盖某个方法来提供不同的行为。

有时你可能会听到人们宣称你可以使用多态来删除所有ifs,但是这两个极端之间通常存在很好的平衡。您通常希望首先努力满足SOLID principles并且将会降低CC。

本书重构:改进现有代码的设计是一本非常好的读物。显然重构模式也是如此,但我还没读过。

以下是一个如何重构代码以获得1的圈复杂度的示例(我不知道您的代码是如何设置的,但我想我重新创建了它的想法):< / p>

import java.util.ArrayList;
import java.util.List;

public class ExtraTest {
    public static void main(String[] whatsUp) {
        MyData myData = new MyData();

        List<Extra> myExtras = new ArrayList<>();
        myExtras.add(new ExtraInsurance("ReallyBadInsurance"));
        myExtras.add(new ExtraCarCategory(CarCategory.really_big_truck));

        System.out.println("Data before: " + myData);

        myExtras.forEach(extra -> extra.applyExtra(myData));

        System.out.println("Data after: " + myData);
    }

    public static enum CarCategory {not_a_truck, truck, big_truck, really_big_truck}

    public static class MyData {
        String insurance = "none";
        CarCategory carCategory = CarCategory.not_a_truck;

        @Override
        public String toString() {
            return insurance + " : " + carCategory.toString();
        }
    }

    public abstract static class Extra<T> {
        protected final T extraAttributeToProvide;

        public Extra(T extraAttributeToProvide) {
            this.extraAttributeToProvide = extraAttributeToProvide;
        }

        public abstract void applyExtra(MyData myData);
    }

    public static class ExtraInsurance extends Extra<String> {
        public ExtraInsurance(String extraAttributeToProvide) {
            super(extraAttributeToProvide);
        }

        public void applyExtra(MyData myData) {
            myData.insurance = extraAttributeToProvide;
        }
    }

    public static class ExtraCarCategory extends Extra<CarCategory> {

        public ExtraCarCategory(CarCategory extraAttributeToProvide) {
            super(extraAttributeToProvide);
        }

        public void applyExtra(MyData myData) {
            myData.carCategory = extraAttributeToProvide;
        }
    }

}

输出:

  

之前的数据:无:not_a_truck

     

之后的数据:ReallyBadInsurance:   really_big_truck

相关问题