А если без «если»?

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

В примерах будет использован джаваскрипт.

Пример 1. Возврат булевого значения.

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

if (a === b) {
  return true;
}
return false;
return a === b;

Пример 2. Оператор «или».

if (a) {
  return a;
}
return defaultValue;
return a || defaultValue;

В данной ситуации следует быть очень осторожным, чётко понимая, с какими значениями происходит работа. Например, мы ожидаем в поле строку, и хотим проверить, не является ли она пустой, и есть ли в этом поле вообще значение. В данной ситуации всё ок. Но мы можем случайно не зайти в ветку, если нам придёт булево false или 0. Поэтому лучше (в т. ч. для производительности) явно прописывать условие. Скажем, проверяем наличие значения в объекте, тогда пишем if (a !== undefined) { }.

Если вы пишете на тайпскрипте (версии 3.7 и выше), то можно использовать nullish coalescing:

if (res.count !== undefined && res.count !== null) {
  return res.count;
}
return defaultCount;
return res.count ?? defaultCount;

Пример 3. Тернарный оператор.

Порой лучше написать явный if, нежели хуже читаемый тернарник (и уж точно никогда не стоит вкладывать один тернарный в другой), но иногда он может быть вполне обоснованным. Допустим, мы создаём переменную, и в зависимости от условия в неё записываем значение, которое не будет меняться. Так избежим использования let и начального создания переменной со значением undefined.

let x;
if (someCondition) {
  x = 'a';
} else {
  x = 'b';
}
const x = someCondition ? 'a' : 'b';

Пример 4. Словарь.

Например, необходимо обработать значение переменной, которое может иметь множество вариантов. Вместо того, чтобы городить батарею из else if можно построить батарею из case, а можно использовать объект (или Map), ключами которого будут возможные значения.

if (str === 'a') {
  // do smth;
} else if (str === 'b') {
  // do smth;
} else if (str === 'c') {
  // do smth;
} else if (str === 'd') {
  // do smth;
} else if (str === 'e') {
  // do smth;
}
const map = {
  a: // do smth,
  b: // do smth,
  c: // do smth,
  d: // do smth,
  e: // do smth,
};
map(str);

Если необходимо обработать ветку else можно использовать оператор || (см. Пример 2, не забывая про уместность).

...
} else if (str === 'e') {
  // do smth;
} else {
  // do smth else;
}
...
  e: // do smth,
};
map(str) || // do smth else;

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

Пример 5. Встроенные методы языка.

5.1. padStart

Есть у нас некое число, отражающее порядковый номер месяца или дня в месяце. Для вывода даты мы хотим добавлять ноль в некоторых случаях (lead zero).

if (num.toString().length === 1) {
  result = `0${num}`;
} else {
  result = `${num}`;
}
result = num.toString().padStart(2, '0');

5.2. Math.max()

Использовать в качестве периода значение, не меньше определённого.

const minPeriod = 30;
if (res.period < minPeriod) {
  period = minPeriod;
} else {
  period = res.period;
}
const minPeriod = 30;
period = Math.max(res.period, minPeriod);

5.?. Ну вы поняли

Меньше императивности, больше декларативности.

{{ message }}

{{ 'Comments are closed.' | trans }}