代码美学:减少if多层嵌套的方法

代码美学:减少if多层嵌套的方法

// 微波炉加热案例
class MicrowaveOven {
        private String state = State.DoorClosed;
        public void open() {
            if (state.equals(State.Heating)) {
                System.out.println("加热中,不能开门");
            } else if (state.equals(State.DoorClosed)) {
                this.state = State.DoorOpen;
            } else if (state.equals(State.DoorOpen)) {
                System.out.println("门已开");
            }
        }
        public void close() {
            if (state.equals(State.Heating)) {
                System.out.println("加热中,门已关");
            } else if (state.equals(State.DoorClosed)) {
                System.out.println("门已关");
            } else if (state.equals(State.DoorOpen)) {
                this.state = State.DoorClosed;
            }
        }
        public void heating() {
            if (state.equals(State.Heating)) {
                System.out.println("加热中");
            } else if (state.equals(State.DoorClosed)) {
                this.state = State.Heating;
            } else if (state.equals(State.DoorOpen)) {
                System.out.println("开门状态,禁止加热");
            }
        }
    }

1、使用卫语句(提前返回)

/**
         * 1、使用卫语句优化
         */
        public void open() {
            if (state.equals(State.Heating)) {
                System.out.println("加热中,不能开门");
                return;
            }
            if (state.equals(State.DoorClosed)) {
                this.state = State.DoorOpen;
                return;
            }
            if (state.equals(State.DoorOpen)) {
                System.out.println("门已开");
                return;
            }
            
        }

2、使用设计模式解决,面向对象

不同动作中存在对不同状态的if校验,可以使用状态模式优化,优化如下:

/**
         * 2、使用状态模式解决
         */
        abstract class MicrowaveState {
            public MicrowaveOvenForState microwaveOvenForState;
            public MicrowaveState() {
            }
            public MicrowaveState(MicrowaveOvenForState microwaveOvenForState) {
                this.microwaveOvenForState = microwaveOvenForState;
            }
            public abstract void open();
            public abstract void close();
            public abstract void heating();
        }
        class OpenState extends MicrowaveState {
            public OpenState(MicrowaveOvenForState microwaveOvenForState) {
                super(microwaveOvenForState);
            }

            @Override
            public void open() {
                System.out.println("门已开");
            }

            @Override
            public void close() {
                this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.closeState;
            }

            @Override
            public void heating() {
                System.out.println("开门状态,禁止加热");
            }
        }
        class CloseState extends MicrowaveState {
            public CloseState(MicrowaveOvenForState microwaveOvenForState) {
                super(microwaveOvenForState);
            }

            @Override
            public void open() {
                this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.openState;
            }

            @Override
            public void close() {
                System.out.println("门已关");
            }

            @Override
            public void heating() {
                this.microwaveOvenForState.microwaveState = this.microwaveOvenForState.heatingState;
            }
        }
        class HeatingState extends MicrowaveState {
            public HeatingState(MicrowaveOvenForState microwaveOvenForState) {
                super(microwaveOvenForState);
            }

            @Override
            public void open() {
                System.out.println("加热中,不能开门");
            }

            @Override
            public void close() {
                System.out.println("加热中,门已关");
            }

            @Override
            public void heating() {
                System.out.println("加热中");
            }
        }
        class MicrowaveOvenForState {
            private MicrowaveState openState = new OpenState(this);
            private MicrowaveState closeState = new CloseState(this);
            private MicrowaveState heatingState = new HeatingState(this);

            private MicrowaveState microwaveState = this.openState;

            public void open() {
                this.microwaveState.open();
            }
            public void close() {
                this.microwaveState.close();
            }
            public void heating() {
                this.microwaveState.heating();
            }


        }

3、链式编程

        public void lian() {
            Position[] positions = new Position[6];
            positions[0] = new Position(1, "Soft engineer", 3000, "广州");
            positions[1] = new Position(2, "Soft engineer", 99000, "北京");
            positions[2] = new Position(3, "Soft engineer", 2000, "上海");
            positions[3] = new Position(4, "Web Developer", 5000, "上海");
            positions[4] = new Position(5, "Soft engineer", 55000, "承德");
            positions[5] = new Position(6, "Soft engineer", 3200, "上海");
            List<Integer> result = Arrays.stream(positions).filter(o -> o.name.contains("Soft"))
                    .filter(o->"北京, 上海, 广州".contains(o.jobLocation))
                    .sorted((o1, o2) -> o2.salary - o1.salary)
                    .map(o -> o.id)
                    .limit(3)
                    .collect(Collectors.toList());
            result.forEach(o -> System.out.println(o + ", "));
        }

4、Optional空值判断转链式

 String city = Optional.ofNullable(positions[0]).map(o -> o.jobLocation).orElse("");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值