Как назначить переменную с результатом блока if..else? - PullRequest
33 голосов
/ 28 мая 2010

Я поспорил с коллегой о том, как лучше назначить переменную в блоке if..else. Его оригинальный код был:

@products = if params[:category]
  Category.find(params[:category]).products
else
  Product.all
end

Я переписал это так:

if params[:category]
  @products = Category.find(params[:category]).products
else
  @products = Product.all
end

Это также можно переписать однострочно с использованием оператора ternery (? :), но давайте представим, что назначение продукта длиннее 100 символов и не может поместиться в одну строку.

Что из двух вам понятнее? Первое решение занимает немного меньше места, но я подумал, что объявление переменной и присвоение ей трех строк после может быть более подвержено ошибкам. Мне также нравится видеть, что мои if и else выровнены, так что моему мозгу легче их анализировать!

Ответы [ 15 ]

1 голос
/ 28 мая 2010

Я тоже не Ruby, но сигнальные колокола мгновенно звонят в область действия второй команды, будет ли эта переменная доступна даже после окончания блока if?

1 голос
/ 28 мая 2010

Первый, если используется троичный, второй, если нет.

Первый почти невозможно прочитать.

0 голосов
/ 12 апреля 2015

Мне не нравится, когда вы используете скобки в первом блоке. Да, я пользователь LISP, но я считаю, что могу сказать, что первые могут выглядеть запутанно в середине другого кода, возможно, вокруг других if блоков.

Как насчет ...

@products = (if (params[:category])
        ((Category.find params[:category]).
            products)
    else
        (Product all)
    end
)

(^ Язык в щеке, чтобы обострить проблемы с @ badp's answer )

0 голосов
/ 28 мая 2010

Если кто-то просматривает код, я бы сказал, что второй блок кода (ваш) определенно является тем, который мне легче всего понять.

Код вашего собеседника в порядке, но отступ, как указывал Б.П., в этом смысле имеет огромное значение.

0 голосов
/ 28 мая 2010

Мне кажется, что второй будет более читабельным для обычного программиста. Я не рубиновый парень, поэтому я не осознавал, что if / else возвращает значение .... Итак, возьмите меня в качестве примера (и да, это моя точка зрения: D), второй выглядит как хороший выбор.

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