Есть ли способ изменить эти заявления if? - PullRequest
2 голосов
/ 15 марта 2020

просто интересно, есть ли способ реорганизовать приведенный ниже код? Я новичок в Java и пытаюсь получить код DRY - нижеприведенное мною написано, но мне кажется, что нужно проверить много условий

void printDirection() {
  if (yDirection > 0) {
    if (xDirection < 0) {
      println("Travelling South-West");
    } else {
      println("Travelling South-East");
    }
  } else if (yDirection < 0) {
    if (xDirection <0) {
      println("Travelling North-West");
    } else {
      println("Travelling North-East");
    }
  }
}

Заранее благодарен за любую помощь!

Ответы [ 3 ]

7 голосов
/ 15 марта 2020

Вы можете оценить условия север / юг и восток / запад по отдельности и приклеить направления в ваше сообщение.

System.out.printf("Travelling %s-%s%n", (yDirection < 0 ? "North" : "South"),
                  (xDirection < 0 ? "West" : "East"));

Я предполагаю из кода в вашем вопросе, что вас беспокоит только эти четыре взаимодополняющих направления (не на север, а на восток, на стационарные и т. д. c.).

1 голос
/ 15 марта 2020

Если вы действительно хотите сделать это DRY, это можно сделать с помощью оператора? но это не легко читать и не рекомендуется. Он используется в соревновании по программированию, цель которого - максимально быстро набрать go.

По схеме: (Условие? WhatHappenIfConditionIsTrue: WhatHappenIfConditionIsFalse); Вы можете использовать его в присваивании:

int i = (a>0)?a:0;

, в этом случае, если a> 0, тогда i = a, иначе a = 0

В вашем случае я бы сделал это так

void printDirection()
{
    System.out.println("Travelling " + (yDirection > 0?"South":"North") + "-" + (xDirection>0?"East":"West"));
}
0 голосов
/ 15 марта 2020

Некоторые предложения: 1. Из-за комбинации x, y; Есть пять штатов; вы можете использовать enum type для определения этих состояний; 2. Если вы хотите уменьшить if ... else состояний в вашем коде, пожалуйста, обратитесь к Status Machine Design Pattern ; но я думаю, что в вашем случае статус так прост, не нужно делать его слишком сложным

public class Status {

    public enum Direction {
        SOUTH_WEST((x, y) -> y > 0 && x < 0, "Travelling South-West")
        , SOUTH_EAST((x, y) -> y >0 && x > 0, "Travelling South-East")
        , NORTH_EAST((x, y) -> x > 0 && y < 0, "Travelling North-East")
        , NORTH_WEST((x,y) -> x < 0 && y < 0, "Travelling North-West"), CENTER((x,y) -> x == 0 && y == 0, "");

        BiPredicate<Integer, Integer> bp;
        String desc;

        public BiPredicate<Integer, Integer> getBp() {
            return bp;
        }
        public void setBp(BiPredicate<Integer, Integer> bp) {
            this.bp = bp;

        }

        public String getDesc() {
            return desc;
        }
        public void setDesc(String desc) {
            this.desc = desc;
        }
        private Direction(BiPredicate<Integer, Integer> bp, String desc) {
            this.bp = bp;
            this.desc = desc;
        }
        public static Direction getDirection(int x, int y) {
            for (Direction direction : Direction.values()) {
                if(direction.getBp().test(x, y)) {
                    return direction;
                }
            }
            return null;
        }
    }

    public static void main(String[] args) {
        Direction d =  Direction.getDirection(3, 4);
        System.out.println(d.getDesc());
        /*      if(d == Direction.SOUTH_WEST){
                    System.out.println("do some thing");
                } else if(d == Direction.SOUTH_EAST){
                    System.out.println("do some thing");
                } else if(d == Direction.NORTH_EAST){
                    System.out.println("do some thing");
                } else if(d == Direction.NORTH_WEST){
                    System.out.println("do some thing");
                }*/
    }
}
...