Рубрики
Без рубрики

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

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

Автор оригинала: FreeCodeCamp Community Member.

Курт

Ошибки неизбежны.

Вполне нормально тратить больше времени отладки, чем вы тратите, написав актуальный код. Если вы учитесь программировать, и вы абсолютно ненавидите отладка своего собственного кода, остановись сейчас Отказ

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

Кроме того, вы можете просто изменить свое мышление и прекратить ненависть ошибок.

Вот некоторые из причин, по которым я люблю отладки …

  1. Это вызов Отказ Для меня ошибка – это головоломка для решения. Я люблю головоломки, так что это как приложение дает мне час, чтобы играть в судоку.
  2. Это делает меня лучшим программистом Отказ Код отладки – несомненно, один из лучших методов обучения.
  3. Иногда это заставляет меня смеяться Отказ Быть программистом, вам нужно иметь хорошее чувство юмора. Вы также должны быть в состоянии смеяться за свою себе глупую глупость или юмором ситуации.
  4. Это лучшее понимание, которое я могу попасть в мысли моих пользователей Отказ За пределами ваших начальных испытаний, Вы никогда не должны проверять свои собственные приложения – И не должен другой программист. Это потому, что вы никогда не нарушите ваше приложение, как будет ваши пользователи. Лучший тестер, который я когда-либо имел, был 5-летний сын моего босса, который проверил все наши приложения для iPad. Если он не сможет использовать приложение, наши пользователи тоже не смогут. Вопрос при отладке не заканчивается на «Как пользователь сделал это?» Но также расширяется до «Почему пользователь сделал это?»

Я нашел эту круговую диаграмму на PRONGRALLHUMOR Subreddit Это прекрасно подводит подводит мой средний день:

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

Если ваш график такой же, отлично. Может быть, мы можем обменять советы. Но если вы, вероятно, как большинство из нас, и проводите большинство из вас, удивляетесь, что, черт возьми, ваш пользователь сделал фиксированную переменную undefined или повернуть строка в Целое число.

Тогда этот пост может быть особенно полезен для вас.

Почему Шерлок Холмс был бы отличным программистом

Первый Шерлок Холмс книга был написан обратно в 1887 году, задолго до изобретена компьютеры. Все эти книги упакованы полными уроков, которые вы можете подать заявку на программирование.

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

Шерлок Холмс самый известный, используя его «Метод вычета» :

Если бы мне пришлось применить это мышление к функции, это было бы что-то вроде …

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

Как исправить ошибки, прежде чем они произойдут

Посмотрите на функцию ниже, которая ищет массив и возвращает значение, если найдено либо Как есть или как Результат функции обратного вызова:

function arraySearch(value, array, callback) {  callback = callback || false;  for (var i = 0; i < array.length; i++) {    if (array[i] == value) {      if (callback) {        return callback(value);      } else {        return value;      }    }  }}var result = arraySearch(4,[1,2,3,4],function(val){return val+val;});

На первый взгляд это кажется идеально в порядке.

Но давайте сделаем шаг назад и используйте профилактический подход и фокус вместо этого на Какая функция не должна делать Отказ

Есть четыре очка, которые мы хотим обратиться в этом упражнении

  1. Это не должно легко ломаться Отказ Если вообще возможно, мы хотим предотвратить его остановку на Ошибка . Отказ Вместо этого это должно Возвращение Отказ

2. Это никогда не должно вернуться undefined Отказ Мы хотим, чтобы это вернуть ложь вместо.

3. Это никогда не должно делать неявное или «свободное» совпадение Отказ

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

Начиная

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

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

function arraySearch(value, array, callback) {  if (value === undefined || array === undefined) {    return false;  }  callback = callback || false;  for (var i = 0; i < array.length; i++) {    if (array[i] == value) {      if (callback) {        return callback(value);      }      else {        return value;      }    }  }}

Отлично, это отсортировано. Проверяя ли аргументы undefined Мы гарантируем, что ценности переданы им.

Наш обратный вызов уже имеет по умолчанию ценность, так что позаботится о. Но что, если наше Массив не массив? Или в том же душе, что если наше Обратный вызов не является функцией?

Давайте позаботимся об этом следующем …

function arraySearch(value, array, callback) {  if (value === undefined || array === undefined || (array instanceof Array) === false) {    return false;  }  callback = callback || false;  if (callback !== false && typeof callback !== 'function') {    throw 'Callback to arraySearch is not a function';    return false;  }  for (var i = 0; i < array.length; i++) {    if (array[i] == value) {      if (callback) {        return callback(value);      }      else {        return value;      }    }  }}

Потрясающие. Теперь, проверив Тип Обратный вызов Мы уверены, что обратный вызов является действительным Функция и путем проверки того, что массив – это Instanceof Объект массива Мы также уверены, что массив является Массив Отказ

Итак, давайте перейдем на точку 2 – «Это никогда не должно возвращать undefined» Отказ

Хорошо для начала нашего Функция не имеет Обратное значение по умолчанию Ибо когда нет совпадения. Не менее важным, это тот факт, что у нас нет возможности узнать, что вернется функция обратного вызова.

Мы можем исправить это, сделав функцию вернуть переменную Так что нам нужно только проверить, есть ли оно undefined или null однажды.

function arraySearch(value, array, callback) {  if (value === undefined || array === undefined || (array instanceof Array) === false) {    return false;  }  callback = callback || false;  var result = null;  if (callback !== false && typeof callback !== 'function') {    throw 'Callback to arraySearch is not a function';    return false;  }  for (var i = 0; i < array.length; i++) {    if (array[i] == value) {      if (callback) {        result = callback(value);      }      else {        result = value;      }    }  }  return result || false;}

Отсортировано. Установка значения Результат либо Матч или к результату Функция обратного вызова Позволяет нам вернуть либо Результат или ложь, если Результат быть undefined или null Отказ

Точка 3. Ань неявный или свободный Матч можно описать как относительно равны I.e. false или ‘4’ и т. Д.

Мы хотим избежать этого. Что делать, если мы ищем ложь в массиве, содержащем ноль?

Мы можем исправить это, изменив линию ниже:

  if (array[i] == value) {//must change to  if (array[i] === value) {

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

Теперь для последнего пункта.

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

Анонимные функции Может быть боль для отладки, поэтому давайте попробуем отладку немного менее болезненной:

function arraySearch(value, array, callback) {  if (value === undefined || array === undefined || (array instanceof Array) === false) {    return false;  }  callback = callback || false;  var result = null;  if (callback !== false && typeof callback !== 'function') {    throw 'Callback to arraySearch is not a function';    return false;  }  for (var i = 0; i < array.length; i++) {    if (array[i] === value) {      if (callback) {        try{          result = callback(value);        }catch(e){          throw 'Callback function in arraySearch threw the error : '+e.message;        }      }      else {        result = value;      }    }  }  return result || false;}

Там у нас это есть.

Чтобы решить проблему, мы используем простой попробуйте/поймать заявление, а потом Перебросить Ошибка . с Пользовательское сообщение. Теперь, если функция обратного вызова не удается, мы сразу узнаем, что это был Функция обратного вызова что не удалось, а не наше Arraysearch функция.

Резюме

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

Основы моих советов по профилактическому программированию могут быть подведены в 6 баллов …

  1. Убедитесь, что ваши входные значения существуют и установите значения по умолчанию, где это необходимо.
  2. Всегда Убедитесь, что ваш вход такой же тип, как и вы ищете Отказ Никогда не думайте, что Массив будет Массив или что Целое число будет Целое число Отказ
  3. Всегда делайте явное совпадение При сравнении значений ( === ).
  4. Написать функции, которые возвращают предсказуемые значения I.e. Return ложь Когда не удалось или ложь или вернуть ожидаемый результат, когда правда Отказ
  5. Попробуйте написать чистые функции Отказ Чистая функция – это функция, которая всегда возвращает ожидаемое значение и не модифицирует исходные переменные, переданные ему любым способом.
  6. Бросить Пользовательские ошибки, где это необходимо, особенно при выполнении обратных вызовов и анонимных функций Отказ Вы не помните именно то, что ваш код делает в 8 месяце времени, так что сделайте себе одолжение и бросить четкое сообщение об ошибке, пока вы все еще знаете, что делает ваш код.

Я оставлю вас с отличными цитатами из Шерлока Холмса

Мораль: не делайте предположения перед сбором данных

Мораль: не позволяйте своим эмоциям переопределить логику

Мораль: сосредоточиться на основных характеристиках и использование

И еще несколько, которые вы можете взять свой собственный урок от

Это все, что у меня есть для этого поста. Если вам понравилось читать его и хотелось бы прочитать другой технический пост. Посмотрите:

Как написать jQuery, как библиотека в 71 строки кода – узнайте о DOM JavaScript Frameworks – это ярость. Скорее всего, любой JavaScript, связанные с новостями, вы открыты, будут засорены … Medium.com.

В качестве альтернативы, если код повредил свой мозг и заставил вас устал вот некоторые нетехнические посты, которые я написал …

5 вещей, которые нужно помнить, когда вы учитесь программировать Обучение программе является сложной. Помимо выбора языка или создания среды развития, которую вы … Medile.com Переключение кода наличными – как заработать деньги в качестве веб-разработчика и жить, чтобы рассказать историю. Так что вы только что научились кодировать. Вы хотите, и все, кто не умеет код думать, что ты гений, слово выходит и все … Medile.com Как я стал программистом. И когда я начал звонить в один Я хотел начать вести ведение программирования в течение нескольких месяцев и вроде так много других, прежде чем я, я поставил … Medile.com Делать его кодом дождя – матричный стиль Введение в HTML 5 холст анимации Medium.com.