Являются ли несколько условных операторов в этой ситуации хорошей идеей? - PullRequest
17 голосов
/ 17 декабря 2009

Я только что видел этот блок кода в статье Wikipedia об условных операторах:

Vehicle new_vehicle = arg == 'B' ? bus      :
                      arg == 'A' ? airplane :
                      arg == 'T' ? train    :
                      arg == 'C' ? car      :
                      arg == 'H' ? horse    :
                      feet;

Я немного изменил код, но идея та же. Считаете ли вы это использование условного оператора приемлемым? Это намного более кратко, чем конструкция if - else, и использование переключателя определенно откроет целый новый набор возможностей для ошибок (кто-нибудь провалится?). Кроме того, if - else s и switch не могут использоваться в качестве R-значений, поэтому вам придется сначала создать переменную, инициализировать ее, а затем назначить при необходимости.

Мне, например, очень нравится это, но мне интересно, что думают другие.

Но форматирование необходимо.

РЕДАКТИРОВАТЬ: Мне все еще нравится это. Но я понимаю тех, кто говорит, что «для этого было сделано заявление». ОК, может быть и так. Но что, если условия являются вызовами функций, которые возвращают bool? Или миллион других вещей, которые вы не можете включить.

Вы действительно любите смену, пытаясь убедить меня, что огромная цепочка if - else лучше? Да, программисты, которые не знают, как использовать условный оператор, не поймут этого. Они должны научиться им пользоваться. Это не тайно.

Ответы [ 21 ]

33 голосов
/ 17 декабря 2009

Я использовал этот тип конструкции много раз. Пока он хорошо отформатирован (то есть не все в одной строке, что делает его нечитаемым), я не вижу проблем с ним.

31 голосов
/ 17 декабря 2009

Я бы использовал переключатель, потому что это то, для чего он был разработан. Да, есть риск появления ошибок, но этот вложенный условный блок имеет гораздо больший риск быть неправильно понятым другими программистами.

14 голосов
/ 17 декабря 2009

Это отличный пример использования условного оператора. Я использую его таким образом все время в C ++, Java и Perl.

12 голосов
/ 17 декабря 2009

Мало того, что в этом нет ничего плохого, он сообщает цель операции самым кратким и понятным способом.

Замена на if else или конструкция переключателя требует, чтобы фрагмент

"new_vehicle =  "

повторяется в каждом случае, что требует, чтобы читатель прочитал каждый повторяющийся экземпляр, чтобы убедиться, что он фактически одинаков в каждом случае.

11 голосов
/ 17 декабря 2009

Есть много пробелов вокруг констант символов, что делает его немного трудным для чтения. Я бы заключил в скобки сравнения: (и, возможно, переместил бы последнее значение в строке.)

Vehicle new_vehicle = (arg == 'B') ? bus      :
                      (arg == 'A') ? airplane :
                      (arg == 'T') ? train    :
                      (arg == 'C') ? car      :
                      (arg == 'H') ? horse    :
                                     feet;

Теперь выглядит отлично.

11 голосов
/ 17 декабря 2009

Мне это нравится. Это похоже на лестницу if-else-if, только более краткую.

8 голосов
/ 17 декабря 2009

Версия условного оператора проста и понятна для любого, кто знает C или C ++, что происходит. Его другое достоинство заключается в том, что оно немедленно возвращает значение, что означает, что его можно поместить в инициализацию (как в этом примере).

Оператор switch был бы более неуклюжим. Это потребовало бы, чтобы переменная была объявлена ​​и затем инициализирована, обычно плохая идея, если этого можно избежать. Потребовалось бы больше печатать, и было бы больше мест для ошибок, чтобы закрасться. Это было бы не так ясно, так как необходимо было бы рассмотреть каждый случай, чтобы увидеть, что он говорит что-то вроде new_vehicle = foo; break;.

Если вы собираетесь сделать это, посмотрите только здесь, тогда хорошо иметь условную версию, так как она сразу показывает, что происходит. Если это произойдет более одного раза, рассмотрите возможность включения его в функцию, чтобы можно было обновить только одно место, если что-то изменится (например, «R» для перевозки или «L» для вертолета).

5 голосов
/ 17 декабря 2009
Vehicle new_vehicle = getVehicleByType(arg);

Vehicle getVehicleByType(char arg){
  if (arg == 'B') return bus;
  if (arg == 'A') return airplane;
  if (arg == 'C') return car;
  if (arg == 'T') return train;
  if (arg == 'H') return horse;
  return feet;
}

Мне нравится это лучше. Вложенное условие умно, но я думаю, что это почти так же кратко и менее вероятно, чтобы запутать будущего читателя Извините, если синтаксис отключен, я не делаю много C в настоящее время.

РЕДАКТИРОВАТЬ: Исправлено пропуски типа возврата, отмеченные в комментариях. ТНХ!

РЕДАКТИРОВАТЬ: Кстати, я не в ужасе от вашей версии. Я не воскликнул WTF или OMG, когда я увидел это. Я просто предпочитаю мой немного больше:)

5 голосов
/ 17 декабря 2009

Переключатель более понятен и, возможно, намного эффективнее. Если бы я видел такой код в обзоре кода, я бы волновался. Кроме того, это «условный оператор» - это экземпляр (хотя в настоящее время единственный в C и C ++) троичного оператора.

5 голосов
/ 17 декабря 2009

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

...