Подход, при котором мы возвращаем либо false, либо данные, подразумевает, что у нас есть два состояния. Но это не всегда так.
Например, если мы возвращаем ошибку файловой системы, то обычно хотим знать, что за ошибка произошла. Например, в файловых системах в UNIXO количество ошибок превышает 100:
Самостоятельно пытаться догадаться, что произошло, — не лучшая идея. Так мы не сможем далеко продвинуться при работе с программой.
В этом случае появляется вопрос, как действовать — как возвращать результат. Один из самых простых вариантов — это коды возврата.
Возврат ошибки связан с тем, что мы возвращаем не просто false или undefined. Мы возвращаем некоторое число. Оно говорит о том, какая ошибка произошла. Это работает так:
Мы вызываем команду, например, удаление директории, и получаем результат. Дальше проверяем, является ли результат частью списка ошибок. То есть мы перечисляем возможные варианты.
В итоге мы узнаем, входит ли результат в список ошибок. Если всё хорошо, то мы продолжаем работать и используем тот же результат.
Проблема в том, что результат иногда может совпадать — быть числовым. Тогда нам нужно выбрать лист ошибок, чтобы нормальное значение не попадало в него.
В итоге нам постоянно придется делать такие проверки — проверять большое количество возможных возвратов. Такой процесс нужно упрощать.
В Си принят следующий подход возврата результата:
Здесь мы открываем файл на чтение. Дальше идет проверка. Если указатель равен нулю, то после этого пишем, что произошла ошибка. При этом сама ошибка записывается в глобальную переменную, которая называется Erno. И там, например, цифра 2, которая означает, что все плохо.
Здесь мы убеждаемся, что у нас нет адекватного результата. Но по сути идет глобальное изменение среды. А глобальные переменные — это вообще не вариант, особенно в современных языках уже продвинутых.
Рассмотрим более продвинутый способ. Этот тот же способ, что и в СИ, но улучшенный. Он называется Golang Style.
Golang — это современный язык, который избавляет только от глобальных переменных.
Смотрим пример:
Мы делаем чтение файла.
В Go возвращается два значения:
dat
— данныеerr
— ошибкаОшибка возвращается всегда. А есть там она или нет — нужно проверять.
Дальше мы проверяем, что если ошибка не равна Нилу, то значит ошибки собственно нет и все хорошо. Если равна Нилу, то мы как-то это обрабатываем.
Это фактически такой же подход как в CИ. Только здесь нет глобальной переменной, которая там постоянно меняется. Каждая функция возвращает свой результат выполнения. Так мы двигаемся вниз по вызовам и можем строить программу.
В JavaScript можно использовать такой же подход. Это рабочая схема, которая основана на Destructuring. У нее есть определенные недостатки, которые мы разберем в следующем уроке.
Этот способ основан на Destructuring.
Рассмотрим пример:
Мы делаем какое-то, например, чтение, после этого слева описываем данные и ошибку. То есть, например, данные приходят в массиве слева, ошибка справа, то есть у нас такой массивчик возвращается. И если ошибка равна 0, то делаем все что хотим, если нет, то обрабатываем ошибку.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт