¿Es una buena práctica evitar advertencias y avisos?

20

En general, he estado trabajando con avisos y avisos de PHP, ya que trabajo en muchos proyectos donde ya está en producción en vivo. Ahora, si enciendo las advertencias y avisos en estos sitios web de producción en vivo, se sobrecargarán con ellos.

En los proyectos en los que trabajo en casa, en el local, generalmente trato de eliminar TODAS las advertencias y avisos. A veces, no hay solución para no tener un aviso, así que solo tendría que lidiar con mirar el aviso hasta que decida desactivarlos por completo.

Al final, no sé si estoy perdiendo el tiempo tratando de deshacerme de todas las advertencias y avisos, o si realmente estoy haciendo esto por el bien común.

De ahí mi pregunta, ¿es una buena práctica evitar advertencias y avisos por completo, o realmente no importa?

Audite Marlow
fuente
66
"A veces, no hay solución para no recibir un aviso" Ha pasado un tiempo desde que usé PHP, pero no recuerdo haber encontrado un caso en el que pudieras evitar el aviso / advertencia o al menos suprimirlo localmente@ .
CodesInChaos
27
El argumento más convincente que he visto es "esos mensajes existen por una razón: condicionarnos a ignorar una avalancha de advertencias nos hace pasar por alto los problemas reales que podrían haberse evitado". En otras palabras, si no hay advertencias o avisos durante las operaciones normales , cualquier advertencia o aviso es un signo de posible problema; Si todo es solo ruido, comenzará a notar problemas solo después de SHTF (y probablemente después de que los clientes lo hagan).
Piskvor
12
Usar @ para suprimir avisos, aunque es común, generalmente se considera algo malo. Es peor que simplemente apagar todos los avisos porque ahora ha ocultado un problema potencial. En 15 años de programación php, todavía no he encontrado un caso en el que haya tenido que suprimir un aviso en el código que controlo.
Cerad
2
¿Simplemente está apagando la visualización de estos avisos o lo está haciendo error_reporting(0);? Siempre uso error_reporting(E_ALL);y la única diferencia entre el desarrollo y la producción está ini_set('display_errors', 'on');vs ini_set('display_errors', 'off');. Siempre intento corregir avisos y advertencias mientras el código aún está fresco en mi mente. Frecuenta los registros en mi sistema de producción para ver si hay advertencias y avisos adicionales que podría haber pasado por alto.
MonkeyZeus
1
Estoy muy de acuerdo con lo que dijo @Cerad @. Después de años y años de programación PHP, no he usado ese operador. Ni una sola vez. Nunca. No solo oculta posibles problemas, sino que también tiene un impacto en el rendimiento: detrás de escena, PHP apaga los informes de errores antes de llamar al código -> llama al código -> lo restablece a su valor original. Estos pasos son caros si tiene docenas o cientos @en su código.
Radu Murzea

Respuestas:

26

si enciendo las advertencias y avisos en estos sitios web de producción en vivo, se sobrecargarán con ellos.

Siempre debe tener las advertencias activadas al máximo nivel en desarrollo, pruebas y control de calidad, pero no en producción. En realidad, si se trata de una aplicación de alimentación para perros, es decir, una aplicación que usted usa, entonces también debe activarlas en producción.

Básicamente: actívelos en aquellos casos en que la persona que los ve esté en condiciones de hacer algo al respecto (el desarrollador en desarrollo y prueba puede solucionarlos él mismo, el probador en QA puede presentar un error, y si el desarrollador está también el usuario, entonces también puede arreglarlo en producción), pero no los encienda cuando la persona que ve no puede hacer nada al respecto (un usuario en producción, que ni siquiera sabe programar).

Idealmente, también querrás activar el tratamiento de las advertencias como errores, pero eso solo funciona si no hay ninguno para empezar ;-) ¡Pero ten esto en cuenta como un objetivo! Si es posible activar / desactivar esta función por archivo, actívela para todos los archivos nuevos, y actívela para todos los archivos sin advertencia, y nunca la apague nuevamente una vez activada.

Entonces, ¿qué hacer con la sobrecarga?

Usted hace una lista de todas las advertencias y avisos, y luego se adhiere a las siguientes reglas:

  1. Nunca, nunca, bajo ninguna circunstancia agregue una nueva advertencia a la lista. Cada nueva pieza de código, cada edición, cada cambio, cada parche, cada confirmación no debe introducir nuevas advertencias, solo puede corregirlas .
  2. Cada vez que toque un fragmento de código, repare todas y cada una de las advertencias en ese fragmento de código. (La regla Boyscout: siempre deje el campamento en mejores condiciones de lo que lo encontró). De esa manera, el código no importante puede estar lleno de advertencias, pero el código importante se volverá más limpio con el tiempo. El "fragmento de código" puede ser una función, una clase, un archivo. También puede relajar esta regla para decir que arregle al menos una advertencia. El punto es: arreglarlos a medida que los encuentre.

Nota: ambos requieren que tenga algún tipo de base de datos de registro y mecanismo de filtrado de registro. Tenga en cuenta también que la "base de datos de registro" y el "mecanismo de filtrado de registro" podrían ser simplemente un archivo de texto y grep.

Esta es la parte importante. Sin la base de datos, no sabrá cuándo agrega una nueva advertencia, y sin el filtrado, todavía tiene el problema de sobrecarga.

Nota n. ° 2: esto no solo funciona para advertencias, también funciona para verificadores de estilo, métricas de complejidad, cobertura de código, herramientas de análisis estático, etc. Básicamente:

  1. No agregues nuevos problemas.
  2. Solucione viejos problemas a medida que los encuentre.

Esto le permite priorizar fácilmente: el código que se edita con frecuencia y, por lo tanto, debe ser fácil de leer y mantener, mejorará con el tiempo. El código que no se toca con frecuencia, no mejorará, pero está bien, porque nadie necesita verlo de todos modos. Y , al menos, no empeorará.

Por supuesto, nada le impide asignar tiempo específicamente para no hacer nada más que cazar y matar advertencias. Es solo que a menudo, esto no es económicamente viable, y es su trabajo como ingeniero tener eso en cuenta. "Un ingeniero es aquel que puede construir con un dólar, lo que cualquier tonto puede construir con dos".

Jörg W Mittag
fuente
3
Otro punto por el cual desactivar las advertencias y errores que llegan al usuario sin filtrar: por más informativo que sea una advertencia para el desarrollador, podría filtrar información confidencial (nombres de archivos, nombres de otros servidores involucrados, estructura de consultas sql utilizadas, ... )
Hagen von Eitzen
¡Las advertencias en producción deben ir a los registros, no al usuario! Los errores deben ir a los registros, no al usuario. Un sitio web que no atrapa errores, los registra y sirve una página de error adecuada para el usuario, en cambio, no está listo para la producción. PHP hace que sea muy fácil hacer esto mal, pero aún así debe hacerlo bien.
hobbs
49

Si las advertencias y avisos provienen de su código, definitivamente corríjalo. Según mi experiencia, en el 95% puede ser benigno, pero el 5% resalta un problema real que puede conducir a innumerables horas de persecución.

Si provienen del código de un tercero que debe usar por una razón u otra, generalmente no tiene mucha opción.

Es una pregunta diferente si su base de código heredada es realmente grande, entonces puede tratar el código heredado como un tercero, pero requiere que el nuevo código no tenga advertencias.

Alexander Pogrebnyak
fuente
8
Trabajo en Java / eclipse, que obviamente es diferente de php, pero generalmente encuentro que la advertencia surge por 1) algo que se compila pero cometí un error obvio o 2) algo que está bien ahora pero que será malo en el futuro
corsiKa
1
@corsiKa Yo estaba traduciendo su comentario a PHP, pero me di cuenta de que sólo una palabra necesita ser cambiado.
wizzwizz4
3
A menos, por supuesto, que estas advertencias sean de StyleCop sobre el pedido de sus usingdeclaraciones ...
Dan Pantry
12

Importa. Es posible que una advertencia no rompa sus pruebas o incluso aparezca en la naturaleza por un tiempo, pero podría ser un síntoma de un error inminente. Actualmente desarrollo principalmente en C # / C ++ y tengo una estrategia definida para deshacerme y mantener las advertencias fuera de nuestra base de código. Afortunadamente no es ciencia espacial =).

Si el idioma en el que trabaja tiene la capacidad de tratar las advertencias como errores y tiene niveles de advertencia variables, haría lo siguiente:

  1. Baje el nivel de advertencia lo suficiente como para no recibir ninguna advertencia. Si está en el nivel de advertencia más bajo y aún recibe advertencias, intente solucionarlas. Si no puede solucionarlos, entonces ya está listo, pero con suerte podrá solucionarlos. Excelente.
  2. Dado que ahora no tiene advertencias (muy probablemente en un nivel de advertencia bajo), active el interruptor y trate todas las advertencias como errores.
  3. Intente subir el nivel de advertencia y corregir todas las advertencias nuevas. Si no puede, baje el nivel de advertencia, pero no desactive las advertencias como errores.

Me parece que esto no solo funciona con advertencias de mi código, sino que las mantiene alejadas .

PerryC
fuente