Главная | Все статьи | Код

Совершенный код: дефолты в свитчах

Время чтения статьи ~3 минуты 171
Совершенный код: дефолты в свитчах главное изображение

Свитч — очень простая конструкция, которую изучают программисты в самом начале своего пути. Она ни у кого не вызывает вопросов, но с ней связана одна интересная деталь, которую очень часто упускают из виду и, в итоге, используют свитч неправильно. Это дефолтное поведение.

Бесплатные курсы по программированию в Хекслете
  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки
Выбрать курс

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

switch (order.state) {
  case 'delivered':
    // код
    break; 
  case 'paid':
    // код
    break;
  // Ниже все остальные кейсы
}

По логике приложения, в этом коде задействованы все возможные состояния, и на каждое из них есть свое поведение. При такой постановке switch не содержит дефолтного поведения.

Однако линтер с нами не согласится. Практически во всех языках он начнет ругаться на то, что дефолт не определен. С этого момента есть два пути.

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

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

Подписывайтесь на канал Кирилла Мокевнина в Telegram — чтобы узнать больше о программировании и профессиональном пути разработчика

Главный вопрос, который нужно задать себе в этом месте: «А в каком случае мы туда действительно попадем?» Таких вариантов несколько: программист ошибся в имени состояния либо добавилось новое состояние, на которое еще нет обработчика. Считаем ли мы такое поведение нормальным? В подавляющем большинстве случаев – нет. Это так называемая ошибка программирования. Если программист ошибся, значит программа работает неверно, и лучшим решением в данной ситуации будет максимально быстрое оповещение о проблеме. Это позволит локализовать проблему и отреагировать сразу, как только она появилась. В противном же случае программа может продолжать вести себя «почти» корректно. Иногда корректно, а иногда нет, и узнаем мы об этом, скорее всего, не сразу и, в худшем случае, от клиентов, когда уже возникнут более серьезные проблемы. То же самое касается добавления нового состояния. Наверняка оно потребует своей собственной обработки.

Перепишем switch с учетом вышесказанного:

switch (order.state) {
  case 'delivered':
    // код
    break; 
  case 'paid':
    // код
    break;
  // оставшиеся кейсы
  default:
    throw new Error('Unknown state!');
}

Уже значительно лучше, но все еще недостаточно. Любой код, который связан с ошибками, должен помогать отладке. Код выше этого не делает. Да, мы увидим ошибку сразу, но как мы узнаем, а что там было? Куда смотреть? Какое состояние неверное? Исследования потребуют дополнительного времени. Гораздо лучше помочь себе сразу:

switch (order.state) {
  case 'delivered':
    // код
    break; 
  case 'paid':
    // код
    break;
  // оставшиеся кейсы
  default:
    throw new Error(`Unknown order state: '${order.state}'!`);
}

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

Дополнительные материалы:

Бесплатные курсы по программированию в Хекслете
  • Освойте азы современных языков программирования
  • Изучите работу с Git и командной строкой
  • Выберите себе профессию или улучшите навыки
Выбрать курс

Аватар пользователя Kirill Mokevnin
Kirill Mokevnin 27 февраля 2020
171
Похожие статьи
Рекомендуемые программы
профессия
Осваивайте разработку веб-страниц, оживляйте дизайн макетов, публикуйте сайты и приложения. Отслеживайте ошибки в интерфейсе и устраняйте их
10 месяцев
с нуля
Старт 5 декабря
профессия
Обучитесь разработке бэкенда сайтов и веб-приложений — серверной части, которая отвечает за логику и базы данных
10 месяцев
с нуля
Старт 5 декабря
профессия
Выполняйте ручное тестирование веб-приложений, находите ошибки в продукте. Узнайте все о тест-дизайне.
4 месяца
с нуля
Старт 5 декабря
профессия
Научитесь разработке веб-приложений, сайтов и программного обеспечения на языке Java, программируйте и используйте структуры данных
10 месяцев
с нуля
Старт 5 декабря
профессия
новый
Собирайте, анализируйте и интерпретируйте данные, улучшайте бизнес-процессы и продукт компании. Обучитесь работе с библиотеками Python
9 месяцев
с нуля
Старт 5 декабря
профессия
Занимайтесь созданием сайтов, веб-приложений, сервисов и их интеграцией с внутренними бизнес-системами на бекенд-языке PHP
10 месяцев
с нуля
Старт 5 декабря
профессия
Создание веб-приложений со скоростью света
5 месяцев
c опытом
Старт 5 декабря
профессия
Обучитесь разработке визуальной части сайта — фронтенда, а также реализации серверной — бэкенда. Освойте HTML, CSS, JavaScript
16 месяцев
с нуля
Старт 5 декабря
профессия
Разработка бэкенд-компонентов для веб-приложений
10 месяцев
с нуля
Старт 5 декабря
профессия
новый
Организовывайте процесс автоматизации тестирования на проекте, обучитесь языку программирования JavaScript, начните управлять процессом тестирования
8 месяцев
c опытом
Старт 5 декабря