Это хорошая практика, чтобы избежать предупреждений и уведомлений?

20

Я обычно работаю с предупреждениями и уведомлениями PHP, так как я работаю над многими проектами, где он уже работает. Теперь, если я включу предупреждения и уведомления на этих живых веб-сайтах, они будут перегружены ими.

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

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

Отсюда мой вопрос: стоит ли вообще избегать предупреждений и уведомлений или это действительно не имеет значения?

Одит Марлоу
источник
6
«Иногда нет решения не иметь уведомления». Прошло много времени с тех пор, как я использовал PHP, но я не припоминаю, чтобы сталкивался со случаями, когда вы могли избежать уведомления / предупреждения или, по крайней мере, подавить его локально@ .
CodesInChaos
27
Самый убедительный аргумент, который я видел, состоит в том, что «эти сообщения существуют по определенной причине - обусловливая себя игнорированием потока предупреждений, мы упускаем из виду реальные проблемы, которые могли быть предотвращены». Другими словами, если нет никаких предупреждений или уведомлений во время нормальной работы, любое предупреждение или уведомление является признаком потенциальной проблемы; если все только шум, вы начнете замечать проблемы только после SHTF (и, вероятно, после того, как клиенты делают).
Писквор
12
Использование @ для подавления уведомлений, как правило, считается плохой вещью. Это хуже, чем просто отключить все уведомления, потому что теперь вы скрыли потенциальную проблему. За 15 лет программирования на php мне еще не приходилось сталкиваться с ситуацией, когда мне приходилось подавлять уведомление в коде, которым я управляю.
Cerad
2
Вы просто отключаете отображение этих уведомлений или делаете error_reporting(0);? Я всегда использую error_reporting(E_ALL);и единственная разница между разработкой и производством - ini_set('display_errors', 'on');против ini_set('display_errors', 'off');. Я всегда стараюсь исправлять уведомления и предупреждения, пока код еще свеж в моей памяти. Я часто посещаю журналы своей производственной системы, чтобы узнать, есть ли дополнительные предупреждения и уведомления, которые я мог пропустить.
MonkeyZeus
1
Я очень согласен с тем, что сказал @Cerad @. После многих лет программирования на PHP я не использовал этот оператор. Ни разу. Никогда. Он не только скрывает потенциальные проблемы, но также оказывает влияние на производительность: за кулисами PHP отключает отчеты об ошибках перед вызовом кода -> вызывает код -> возвращает его к исходному значению. Эти шаги дороги, если @в вашем коде десятки или сотни .
Раду Мурзеа

Ответы:

26

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

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

В основном: включите их в тех случаях, когда человек, который их видит, может что-то с ними сделать (разработчик и разработчик могут исправить их самостоятельно, тестировщик в QA может сообщить об ошибке, и если разработчик также пользователь, тогда он также может исправить это в работе), но не включайте их, когда человек, который видит, не может ничего с ними поделать (пользователь в работе, который даже не знает, как программировать).

В идеале вы также захотите включить обработку предупреждений как ошибок, но это работает, только если их нет с самого начала ;-) Но помните об этом как о цели! Если есть возможность включить / выключить это отдельно для каждого файла, включите его для всех новых файлов и включите для всех файлов без предупреждений, и никогда не выключайте его снова после включения.

Итак, что делать с перегрузкой?

Вы составляете список каждого предупреждения и уведомления, а затем придерживаетесь следующих правил:

  1. Никогда, никогда, ни при каких обстоятельствах не добавляйте новое предупреждение в список. Каждый новый фрагмент кода, каждое редактирование, каждое изменение, каждый патч, каждый коммит не должен вводить новые предупреждения, он может только их исправлять .
  2. Каждый раз, когда вы касаетесь фрагмента кода, исправляйте все предупреждения в этом фрагменте кода. (Правило Boyscout: всегда оставляйте место разбивки лагеря в лучшем состоянии, чем вы его нашли.) Таким образом, несущественный код может быть полон предупреждений, но важный код со временем станет чище. «Кусок кода» может быть функцией, классом, файлом. Вы также можете ослабить это правило, чтобы сказать, чтобы исправить хотя бы одно предупреждение. Дело в том, чтобы исправить их, как вы найдете их.

Примечание: оба из них требуют наличия некоторой базы данных журналов и механизма фильтрации журналов. Также обратите внимание, что «база данных журналов» и «механизм фильтрации журналов» могут быть просто текстовыми файлами и grep.

Это важный бит. Без базы данных вы не узнаете, когда добавите новое предупреждение, а без фильтрации у вас все еще будет проблема перегрузки.

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

  1. Не добавляйте новые проблемы.
  2. Исправьте старые проблемы, когда наткнетесь на них.

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

Конечно, ничто не мешает вам выделять время специально для того, чтобы ничего не делать, кроме как выслеживать и убивать предупреждения. Просто так часто, это не выгодно с экономической точки зрения, и это ваша работа, как инженера, помнить об этом. «Инженер - это тот, кто может строить за доллар, а любой дурак - за два».

Йорг Миттаг
источник
3
Еще один момент, почему нужно отключить предупреждения и ошибки, которые доходят до пользователя без фильтрации: как информативный, так и предупреждающий для разработчика, он может утечь конфиденциальную информацию (имена файлов, имена других задействованных серверов, структура используемых запросов sql, ... )
Хаген фон Айцен
Предупреждения в производстве должны идти в журналы, а не для пользователя! Ошибки должны идти в журналы, а не к пользователю. Веб-сайт, который не перехватывает ошибки, не регистрирует их и не отображает подходящую пользователю страницу ошибок, не готов к работе. PHP очень легко делает это неправильно, но вы все равно должны делать это правильно.
Хоббс
49

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

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

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

Александр Погребняк
источник
8
Я работаю в Java / eclipse, который, очевидно, отличается от php, но обычно я нахожу, что предупреждение возникает либо: 1) что-то компилируется, но я допустил очевидную ошибку, либо 2) что-то хорошо, но будет плохо в будущем
CorsiKa
1
@corsiKa Я был перевод комментария к PHP , но я понял , что только одно слово необходимо изменить.
wizzwizz4
3
Если, конечно, эти предупреждения от StyleCop касаются вашего порядка ваших usingзаявлений ...
Дэн Пантри
12

Это имеет значение. Предупреждение может не сломать ваши тесты или даже какое-то время появляться в дикой природе, но это может быть признаком надвигающейся ошибки. В настоящее время я разрабатываю в основном на C # / C ++ и имею определенную стратегию, чтобы избавиться от предупреждений и не допускать их в нашу базу кода. К счастью, это не ракетостроение =).

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

  1. Уменьшите уровень предупреждения достаточно далеко, чтобы вы не получили никаких предупреждений. Если вы находитесь на самом низком уровне предупреждений и по-прежнему получаете предупреждения - попробуйте их исправить. Если вы не можете их исправить, значит, все готово, но, надеюсь, вы сможете их исправить. Отлично.
  2. Так как у вас теперь нет предупреждений (скорее всего, на низком уровне предупреждений), переведите переключатель в режим ожидания и обработайте все предупреждения как ошибки.
  3. Попробуйте увеличить уровень предупреждения и исправить все новые предупреждения. Если вы не можете, уменьшите уровень предупреждения, но не отключайте его, рассматривая как ошибки.

Я обнаружил, что это не только работает с предупреждениями из моего кода, но и не допускает их .

PerryC
источник