четверг, 7 января 2016 г.

Глава 8. Защитное программирование

Защитное программирование - это способ обезопасить себя от неверных входных данных и ошибок программистов.
Для того чтобы защитить программу от неправильных входных данных нужно:

  • Проверять все данные из внешних источников
  • Проверять все входные параметры метода
  • Решить, как обрабатывать неверные входные данные
Защитное программирование как правило увеличивает объём и сложность программы, так что использовать его нужно с умом.
Для поиска программистских ошибок используются утверждения(assertions). Они помогают выявить случаи неправильного использования кода другими программистами. Утверждения должны проверять условия, которые всегда соблюдаются при правильном использовании метода, например:

  • Значение входного параметра попадает в ожидаемый интервал
  • Файл или поток открыт, когда метод начинает выполняться
  • Указатель файла или потока находится в начале, когда метод начинает выполняться
  • Файл открыт только для чтения, только для записи или для чтения и записи
  • Значение входной переменной не меняется в методе
  • Указатель нулевой
  • Результаты работы сложного, хорошо оптимизированного метода совпадают с результатами метода более простого, но медленного метода
Утверждения также полезно использовать для документирования и проверки предусловий и постусловий.
Если требуется большая надёжность, то следует кроме утверждений также обрабатывать возможные ошибки.
Когда мы обнаруживаем ошибку нашим обработчиком ошибок у нас есть несколько вариантов, как поступить с неверным значением:

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

  • Для оповещения других частей программы об ошибках, которые нельзя игнорировать
  • Во время исключительных ситуаций, которые никогда не должны происходить
  • Не нужно использовать по мелочам
  • Нужно генерировать на правильном уровне абстракции
  • Они должны содержать как можно больше информации о причине ошибки
  • Нужно избегать пустых блоков catch
  • Перед использованием библиотеки нужно узнать, какие исключения она генерирует
  • Использование исключений нужно стандартизировать во всём проекте
Другой способ защиты от неверных данных - использование баррикады.
Все данные приходящие от внешних источников сначала верифицируются специальными классами, а уже затем чистые данные отправляются во внутренние слои программы. Это позволяет избежать излишних проверок во внутренних классах.
Ещё был раздел про отладку, но он не особо актуален в современных языках.
После разработки, в промышленной версии нужно

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

Комментариев нет:

Отправить комментарий