Как вы пишете (простую) переменную "toggle"? - PullRequest
1 голос
/ 30 сентября 2008

Учитывая следующие идиомы:

1)

variable = value1
if condition
  variable = value2

2)

<code>variable = value2
if not condition
  variable = value1

3)

<code>if condition
  variable = value2
else
  variable = value1

4)

<code>if not condition
  variable = value1
else
  variable = value2

Что вы предпочитаете и почему?

Мы предполагаем, что наиболее распространенным путем выполнения является condition, являющийся ложным.

Я склонен учиться использовать 1), хотя я не совсем уверен, почему он мне нравится больше.

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

variable = condition ? value2 : value1
...
variable = value2 if condition else value1

Ответы [ 12 ]

10 голосов
/ 30 сентября 2008

Теоретически, я предпочитаю № 3, так как он избегает необходимости присваивать значение переменной дважды. Хотя в реальном мире я использую любую из четырех вышеперечисленных, которая была бы более удобочитаемой или более четко выразила бы мое намерение.

4 голосов
/ 30 сентября 2008

Я предпочитаю метод 3, потому что он более лаконичен и логичен. Он устанавливает значение только один раз, его можно перемещать в виде блока, и он не так подвержен ошибкам (что происходит, особенно в методе 1, если параметр указан как значение1 и проверен и, при необходимости, установлен как значение) разделены другими утверждениями)

3 голосов
/ 30 сентября 2008

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

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

1 голос
/ 30 сентября 2008

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

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

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

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

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

1 голос
/ 30 сентября 2008

Я склонен использовать # 1 много себя. if condition читается легче, чем if !condition, особенно если вы случайно пропустите '!', По крайней мере, на мой взгляд.

Большая часть кода, который я делаю, написана на C #, но я все еще стараюсь держаться подальше от троичного оператора, если только я не работаю (в основном) с локальными переменными. Строки имеют тенденцию ОЧЕНЬ быстро ОЧЕНЬ быстро работать в троичном операторе, если вы вызываете три слоя вглубь какой-либо структуры, что быстро снижает читабельность.

0 голосов
/ 30 сентября 2008

Это зависит. Мне нравятся троичные операторы, но иногда понятнее, если вы используете оператор if. Какой из четырех вариантов вы выберете, зависит от контекста, но я склоняюсь к тому, что делает код более понятным, и это зависит от ситуации.

0 голосов
/ 30 сентября 2008

Если переменная имеет естественное значение по умолчанию, я бы пошел с # 1. Если какое-либо значение равно (не) подходит для значения по умолчанию, то я бы пошел с # 2.

0 голосов
/ 30 сентября 2008

Зависит от того, в каком состоянии я тестирую.

Если это условие флага ошибки, тогда я буду использовать 1) установку флага ошибки, чтобы перехватить ошибку, а затем, если условие успешно, очистить флаг ошибки. Таким образом, нет вероятности пропустить условие ошибки.

Для всего остального я бы использовал 3)

Логика НЕ ​​только добавляет путаницы при чтении кода - ну, в моей голове, не могу говорить ни за кого другого: -)

0 голосов
/ 30 сентября 2008

Метод 1 или метод 3 для меня. Метод 1 может избежать дополнительного входа / выхода из области, но метод 3 избегает дополнительного назначения. Я бы предпочел избегать метода 2, так как стараюсь сохранить логику условий настолько простой, насколько это возможно (в этом случае! Является посторонним, поскольку его можно переписать как метод 1 без него), и та же причина применима для метода 4.

0 голосов
/ 30 сентября 2008

Я склонен использовать, если нет ... вернуть.

Но это если вы хотите вернуть переменную. Извлечение дисквалификаторов первым делом делает его более читабельным. Это действительно зависит от контекста утверждения, а также от языка. Оператор case может работать лучше и быть читаемым в большинстве случаев, но производительность снижается при использовании VB, поэтому ряд операторов if / else имеет больше смысла в этом конкретном случае.

...