Превосходные вложенные тройственные выражения (программное обеспечение) (раздел 14)

JavaScript функциональное программирование

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

Это четырнадцатый выпуск из серии статей «Написание программного обеспечения» о том, как с нуля изучить методы функционального программирования и композиционного программного обеспечения в JavaScript ES6+, см. Википедию.

|

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

Опыт иногда бывает глуп.

На самом деле, правда в том, чтоТернарные выражения обычно проще, чем операторы if.. Есть две причины, почему люди не верят в это:

  1. Они более знакомы с операторами if. Предвзятость знакомства может заставить нас поверить в то, что не соответствует действительности, даже если мы предоставляем доказательства истины.
  2. Люди пытаются использовать троичные выражения, такие как операторы if. Такой код не будет работать, потому что тернарное выражениеВыражение, вместоутверждение.

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

Тернарное выражение — это условное выражение, которое вычисляется. Он состоит из условного суждения, предложения истинного значения (значение, возвращаемое, когда условие истинно) и ложного предложения (значение, возвращаемое, когда условие ложно).

Они выглядят так:

(conditional)
  ? truthyClause
  : falsyClause

Выражение против Заявления

一些编程语言(包括 Smalltalk、Haskell 以及大多数函数式编程语言)都没有 if 语句。 заменяется,ifвыражение.

Выражение if — это условное выражение, которое оценивается. Он состоит из условного суждения, предложения истинного значения (значение, возвращаемое, когда условие истинно) и ложного предложения (значение, возвращаемое, когда условие ложно).

Это определение кажется вам знакомым? Большинство функциональных языков программирования используютТернарное выражениеПредставлятьifключевые слова. Почему это?

Выражение — это блок кода, результатом которого является одно значение.

Оператор не обязательно является оцениваемым сегментом кода. В JavaScript оператор if не будетоценивать.为了让 JavaScript 中的 if 语句有用,就Должен вызывать побочный эффект или возвращать значение в блоке кода, заключенном в оператор if..

В функциональном программировании мы стараемся избегать изменчивости и других побочных эффектов. Из-за JavaScriptifНекоторые поклонники функционального программирования, в том числе и я, присущи изменчивости и побочным эффектам, вместо этого используют тернарные выражения.

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

Знакомство приносит предвзятости

Наиболее распространенная жалоба, которую я слышу о троичных выражениях, заключается в том, что их «трудно читать». Развенчаем слухи несколькими примерами кода:

const withIf = ({
  conditionA, conditionB
}) => {
  if (conditionA) {
    if (conditionB) {
      return valueA;
    }
    return valueB;
  }
  return valueC;
};

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

Давайте посмотрим, как та же логика реализуется с тернарными выражениями:

const withTernary = ({
  conditionA, conditionB
}) => (
  (!conditionA)
    ? valueC
    : (conditionB)
    ? valueA
    : valueB
);

Вот некоторые моменты, которыми стоит поделиться и обсудить:

Дейзи-цепочка против вложенности

Аннотация:Метод цепи ромашки (цепочка ромашка), что изначально означает, что несколько устройств подключаются последовательно или в одно кольцо.

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

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

Мы должны называть это «цепными тройными выражениями» вместо «вложенных тройных выражений».

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

// 译者补充这种情况
const withTernary = ({
  conditionA, conditionB
}) => (
  conditionA
    ? conditionB
    ? valueA
    : valueB
    : valueC
)

Переместите последнее предложение в начало цепочки и измените логику первого условного предложения, чтобы упростить синтаксический анализ троичных выражений. Теперь никакой путаницы!

Стоит отметить, что мы можем использовать тот же трюк, чтобы упростить оператор if:

const withIf = ({
  conditionA, conditionB
}) => {
  if (!conditionA) return valueC;
  if (conditionB) {
    return valueA;
  }
  return valueB;
};

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

Грамматическая путаница

ifВерсия кода содержит много шума:ifключевое слово против?,использоватьreturnЧтобы заставить операторы возвращать значение, добавьте дополнительные точки с запятой, дополнительные круглые скобки и т. д. В отличие от примеров из этой статьи, большинство операторов if также изменили внешнее состояние, что не только увеличивает объем кода, но и повышает его сложность.

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

рабочая память

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

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

соотношение сигнал шум

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

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

Площадь поверхности скрывающегося жука

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

Меньше кода = меньше места для сокрытия ошибок = меньше ошибок.

Побочные эффекты и общее изменяемое состояние

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

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

Это действительно мое любимое преимущество тернарных выражений:

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

В заключение

Поскольку все тернарные выражения легко присваиваются сверху вниз с помощью прямой линии, неправильно называть их «вложенными тернарными выражениями». Вместо этого мы называем это «связанными троичными выражениями».

Сцепленные тернарные выражения имеют несколько преимуществ перед операторами if:

  • Всегда легко читать и писать сверху вниз по прямой линии. Пока вы можете следовать прямой линии, вы можете читать троичные выражения в виде цепочки.
  • Тернарные выражения уменьшают синтаксический беспорядок. Меньше кода = меньше места для сокрытия ошибок = меньше ошибок.
  • Тернарные выражения не требуют временных переменных, что снижает нагрузку на оперативную память.
  • Тернарные выражения имеют лучшее отношение сигнал/шум.
  • если утверждения поощряют побочные эффекты и изменчивость. Тернарные выражения поощряют чистый код.
  • Чистый код разделяет наши выражения и функции, тем самым обучая нас быть лучшими разработчиками.

Узнайте больше на EricElliottJS.com

Видеоуроки и функциональное программирование готовы для участников сайта EricElliottJS.com. Если ты не из их числа,Войти Сейчас.


Eric Elliottда«Написание приложений JavaScript»(О'Рейли) и«Изучайте Javascript с Эриком Эллиоттом»Автор двух книг. Он внес свой вклад во многие компании и организации, такие какAdobe Systems,Zumba Fitness,The Wall Street Journal,ESPNа такжеBBCи т. д., а также ведущих художников во многих учреждениях, включая, помимо прочего,Usher,Frank Oceanтак же какMetallica.

Он проводит большую часть своего времени в районе залива Сан-Франциско с самой красивой женщиной в мире.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,товар,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.