Как можно избежать операторов if else и переписать их в меньший и более чистый код? - PullRequest
0 голосов
/ 14 января 2019

Я должен вставить аргумент в виде yyyy "" mm "" dd, используя "/", "." Или "-" в качестве разделителей. Программа определяет, какой разделитель использовался, остальные функции не имеют значения. Однако существует слишком много утверждений if else, которые, я уверен, могут быть переписаны или заменены более чистым кодом. Есть предложения?

static String[] weekDays = new String[] {
        "Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur"
};

enum weekDays {SUN,MON,TUES,WEDNES,THURS,FRI,SATUR};

static void setCalendarDate(final Calendar cal, final String date, final String seperator) {
    final String[] splitDate = date.split(seperator);
    cal.set(parseInt(splitDate[0]), parseInt(splitDate[1]) - 1, parseInt(splitDate[2]));
}

public static void main(final String[] args) {

    final Calendar cal = Calendar.getInstance();
    if (args.length != 0) {
        if (args[0].contains("-")) {
            setCalendarDate(cal, args[0], "-");
        } else if (args[0].contains("/")) {
            setCalendarDate(cal, args[0], "/");
        } else if (args[0].contains(".")) {
            setCalendarDate(cal, args[0],".");
        }
    }
    final int weekDay = cal.get(Calendar.DAY_OF_WEEK);
    System.out.printf("%sday\n", weekDays[weekDay - 1]);
}

}

1 Ответ

0 голосов
/ 14 января 2019

Лично я бы сохранил массив допустимых разделителей следующим образом:

static final String[] validSeparators = new String[] {"-","/","."};

Вы можете переместить проверку разделителя на сам метод setCalendarDate, проверяя, содержит ли строка какой-либо из соответствующих символов. Затем я бы реорганизовал метод, чтобы вызвать исключение для недопустимых разделителей, и удалил аргумент разделителя.

static void setCalendarDate(final Calendar cal, final String date) throws ParseException{
    String separator = null;
    for(String s : validSeparators) {
        if(date.contains(s)) {
            separator = s;
            break;
        }
    }
    if(separator == null) {
        throw new ParseException("No valid separator found", 0);
    }

    final String[] splitDate = date.split(separator);
    cal.set(Integer.parseInt(splitDate[0]), Integer.parseInt(splitDate[1]) - 1, Integer.parseInt(splitDate[2]));
}

Другой вариант - проверить определенный символ строки даты:

static void setCalendarDate(final Calendar cal, final String date) throws ParseException{       
    String separator = String.valueOf(date.charAt(4));
    if(Arrays.asList(validSeparators).contains(separator)) {
        final String[] splitDate = date.split(separator);
        cal.set(Integer.parseInt(splitDate[0]), Integer.parseInt(splitDate[1]) - 1, Integer.parseInt(splitDate[2]));
    } else {
        throw new ParseException("Valid separator not found", 0);
    }
}

Если вам нужна дополнительная безопасность, вы также можете проверить 7-й символ и сравнить их до разделения.

Наконец, ваш главный файл теперь будет выглядеть так:

final Calendar cal = Calendar.getInstance();
if (args.length != 0) {

    try {
        setCalendarDate(cal, args[0]);
    } catch (ParseException ex) {
        ex.printStackTrace();
    }
}
final int weekDay = cal.get(Calendar.DAY_OF_WEEK);
System.out.printf("%sday\n", weekDays[weekDay - 1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...