Вопрос

Так что я не гонюсь за ремонтопригодностью или элегантностью..ищу способ сократить общее количество токенов в методе просто для развлечения.Этот метод состоит из длинной вложенной конструкции if-else, и я обнаружил, что (я думаю) способ сделать это с наименьшим количеством токенов — это тернарный оператор.По сути, я перевожу это:

String method(param) {

    if (param == null)
        return error0;

    else if (param.equals(foo1))
        if (condition)
            return bar1;
        else
            return error1;

    else if (param.equals(foo2))
        if (condition)
            return bar2;
        else
            return error1;

    ...


    else
        return error;

}

к этому:

String method(param) {

    return 

        param == null ?
            error0 :

        param.equals(foo1) ?
            condition ?
                bar1 :
                error1 :

        param.equals(foo2) ?
            condition ?
                bar2 :
                error2 :

        ...

        error

    }

Однако есть несколько случаев, когда помимо возврата значения мне также нужно изменить поле или вызвать метод;например.,

    else if (param.equals(foo3))
        if (condition) {
            field = value;
            return bar3;
        }
        else
            return error3;

Какой был бы самый дешевый способ сделать это с точки зрения токена?То, что я делаю сейчас, уродливо, но не тратит слишком много токенов (здесь поле представляет собой строку):

        param.equals(foo3) && (field = value) instanceOf String ?
            condition ?
                bar2 :
                error2 :

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

Редактировать:Каждое слово и знак препинания считаются за один токен.Так, например, «instanceOf String» — это два токена, а «!= null» — три.Основные вещи, которые я вижу для возможного улучшения, - это «&&» и круглые скобки.Есть ли способ поместить «поле = значение» где-нибудь помимо условного, и если нет, существует ли конструкция, которая делает «поле = значение» логическим без необходимости использования круглых скобок?

Это было полезно?

Решение

(field = value) instanceof String

Предполагая, что он уже удовлетворяет ваши потребности (и, следовательно, включает возврат false, когда value является null), тогда более короткой альтернативой было бы

(field = value) != null

Или если вы действительно упустили это из виду и хотите сделать null возвращаться true также, затем используйте

(field = value) == value

Это можно сделать намного короче, если использовать однобуквенные имена переменных.

Дальше других путей я не вижу и согласен с большинством из нас, что это все несколько противно ;)

Другие советы

если параметр равен нулю, верните 0
Затем выполните оператор case/switch/select для параметра.Это чистый .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top