Est-ce une bonne pratique d'éviter les avertissements et les avis?

20

J'ai généralement travaillé avec les avertissements et les avis PHP, car je travaille sur de nombreux projets où il est déjà en production en direct. Maintenant, si j'active les avertissements et les avis sur ces sites de production en direct, ils en seront surchargés.

Les projets sur lesquels je travaille à la maison, sur le local, j'essaie généralement de contourner TOUS les avertissements et notifications. Parfois, il n'y a pas de solution pour ne pas avoir d'avis, alors je devrais simplement m'occuper de consulter l'avis jusqu'à ce que je décide de les désactiver complètement.

En fin de compte, je ne sais pas si je perds mon temps à essayer de me débarrasser de tous les avertissements et avis, ou si je fais cela pour le plus grand bien.

D'où ma question, est-ce une bonne pratique d'éviter complètement les avertissements et les avis, ou est-ce vraiment sans importance?

Audite Marlow
la source
6
"Parfois, il n'y a pas de solution pour ne pas avoir d'avis" Cela fait un moment que je n'ai pas utilisé PHP, mais je ne me souviens pas avoir rencontré un cas où vous pourriez éviter l'avis / avertissement ou au moins le supprimer localement avec@ .
CodesInChaos
27
L'argument le plus convaincant que j'ai vu est "ces messages existent pour une raison - nous conditionner à ignorer un flot d'avertissements nous fait ignorer les problèmes réels qui auraient pu être évités". En d'autres termes, s'il n'y a aucun avertissement ou avis pendant les opérations normales , tout avertissement ou avis est un signe de problème potentiel; si tout n'est que du bruit, vous ne remarquerez des problèmes qu'après SHTF (et probablement après que les clients le fassent).
Piskvor
12
L'utilisation de @ pour supprimer les notifications, bien que courante, est généralement considérée comme une mauvaise chose. C'est pire que de simplement désactiver tous les avis car vous avez maintenant caché un problème potentiel. En 15 ans de programmation php, je n'ai pas encore rencontré de cas où j'ai dû supprimer un avis dans le code que je contrôle.
Cerad
2
Désactivez-vous simplement l'affichage de ces avis ou faites-vous error_reporting(0);? Je l' utilise toujours error_reporting(E_ALL);et la seule différence entre le développement et la production ini_set('display_errors', 'on');vs ini_set('display_errors', 'off');. Je vise toujours à corriger les notifications et les avertissements alors que le code est encore frais dans ma tête. Je fréquente les journaux de mon système de production pour voir s'il y a des avertissements et des avis supplémentaires que j'ai peut-être manqués.
MonkeyZeus
1
Je suis tout à fait d'accord avec ce que @Cerad a dit @. Après des années et des années de programmation PHP, je n'ai pas utilisé cet opérateur. Pas une fois. Jamais. Non seulement cela cache des problèmes potentiels, mais cela a également un impact sur les performances: en arrière-plan, PHP désactive le rapport d'erreurs avant d'appeler le code -> appelle le code -> le ramène à sa valeur d'origine. Ces étapes sont coûteuses si vous en avez des dizaines ou des centaines @dans votre code.
Radu Murzea

Réponses:

26

si j'active les avertissements et les avis sur ces sites de production en direct, ils en seront surchargés.

Les avertissements doivent toujours être activés au niveau le plus complet dans le développement, les tests et l'assurance qualité, mais pas en production. En fait, s'il s'agit d'une application de dogfooding, c'est-à-dire une application que vous utilisez vous-même, vous devez également les activer en production.

Fondamentalement: faites-les allumer dans les cas où la personne qui les voit est en mesure de faire quelque chose à leur sujet (le développeur en développement et en test peut les corriger lui-même, le testeur en QA peut déposer un bogue, et si le développeur est également l'utilisateur, il peut également le réparer en production), mais ne les allumez pas lorsque la personne qui voit ne peut rien faire à leur sujet (un utilisateur en production, qui ne sait même pas comment programmer).

Idéalement, vous voudrez également activer le traitement des avertissements comme des erreurs, mais cela ne fonctionne que s'il n'y en a pas au départ ;-) Mais gardez cela à l'esprit comme objectif! S'il est possible d'activer ou de désactiver cette fonction par fichier, activez-la pour tous les nouveaux fichiers, activez-la pour tous les fichiers sans avertissement et ne la désactivez plus une fois activée.

Alors, que faire de la surcharge?

Vous faites une liste de tous les avertissements et notifications, puis vous respectez les règles suivantes:

  1. Jamais, jamais, en aucun cas, n'ajoutez un nouvel avertissement à la liste. Chaque nouveau morceau de code, chaque modification, chaque modification, chaque patch, chaque commit ne doit pas introduire de nouveaux avertissements, il ne peut que les corriger .
  2. Chaque fois que vous touchez un morceau de code, corrigez tous les avertissements de ce morceau de code. (La règle du Boyscout: laissez toujours le camping en meilleur état que vous ne l'avez trouvé.) De cette façon, le code non important peut rester plein d'avertissements, mais le code important deviendra plus propre avec le temps. "Morceau de code" peut être une fonction, une classe, un fichier. Vous pouvez également assouplir cette règle pour dire de corriger au moins un avertissement. L'important est de les réparer au fur et à mesure que vous les trouvez.

Remarque: les deux nécessitent la mise en place d'une sorte de base de données de journaux et d'un mécanisme de filtrage des journaux. Notez également que la "base de données des journaux" et le "mécanisme de filtrage des journaux" pourraient simplement être un fichier texte et grep.

C'est le bit important. Sans la base de données, vous ne saurez pas quand vous ajoutez un nouvel avertissement, et sans le filtrage, vous avez toujours le problème de surcharge.

Remarque n ° 2: cela ne fonctionne pas uniquement pour les avertissements, il fonctionne également pour les vérificateurs de style, les mesures de complexité, la couverture de code, les outils d'analyse statique, etc. Fondamentalement:

  1. N'ajoutez pas de nouveaux problèmes.
  2. Résolvez les anciens problèmes lorsque vous les rencontrez.

Cela vous permet de prioriser facilement: le code qui est édité souvent et doit donc être facile à lire et à entretenir, s'améliorera avec le temps. Un code qui n'est pas souvent touché ne s'améliorera pas, mais ça va, car personne n'a besoin de le regarder de toute façon. Et , au moins, cela ne va pas empirer.

Bien sûr, rien ne vous empêche d'allouer du temps spécifiquement pour ne faire que traquer et tuer les avertissements. C'est juste que souvent, ce n'est pas économiquement viable, et c'est votre travail en tant qu'ingénieur de garder cela à l'esprit. "Un ingénieur est celui qui peut construire avec un dollar, ce que n'importe quel imbécile peut construire avec deux."

Jörg W Mittag
la source
3
Un autre point pourquoi désactiver les avertissements et les erreurs qui atteignent l'utilisateur non filtré: aussi informatif qu'un avertissement soit destiné au développeur, il peut divulguer des informations sensibles (noms de fichiers, noms d'autres serveurs impliqués, structure des requêtes SQL utilisées, ... )
Hagen von Eitzen
Les avertissements en cours de production doivent être envoyés aux journaux, pas à l'utilisateur! Les erreurs doivent aller dans les journaux, pas dans l'utilisateur. Un site Web qui n'intercepte pas les erreurs, ne les enregistre pas et ne diffuse pas une page d'erreur adaptée à l'utilisateur n'est pas prêt pour la production. PHP rend très facile de faire cela mal, mais vous devez toujours le faire correctement.
hobbs
49

Si des avertissements et des notifications proviennent de votre code, résolvez-le définitivement. D'après mon expérience, dans 95% des cas, cela peut être bénin, mais les 5% mettent en évidence un vrai problème qui peut conduire à d'innombrables heures passées à courir.

S'ils proviennent du code tiers que vous devez utiliser pour une raison ou une autre, vous n'avez généralement pas beaucoup de choix.

C'est une question différente si votre base de code héritée est vraiment grande, vous pouvez alors traiter le code hérité comme tiers, mais exiger que le nouveau code soit sans avertissement.

Alexander Pogrebnyak
la source
8
Je travaille en Java / Eclipse, ce qui est différent de PHP évidemment, mais je trouve généralement que l'avertissement est déclenché par 1) quelque chose qui compile mais j'ai fait une erreur évidente ou 2) quelque chose qui va bien maintenant mais qui sera mauvais sur la route
corsiKa
1
@corsiKa Je me traduis votre commentaire à PHP , mais je me suis aperçu que seul un mot devait être changé.
wizzwizz4
3
À moins, bien sûr, que ces avertissements proviennent de StyleCop concernant votre ordre de vos usingrelevés ...
Dan Pantry
12

Cela compte. Un avertissement pourrait ne pas casser vos tests ou même apparaître dans la nature pendant un certain temps - mais cela pourrait être le symptôme d'un bug imminent. Je développe actuellement principalement en C # / C ++ et j'ai une stratégie définie pour se débarrasser et garder les avertissements hors de notre base de code. Heureusement, ce n'est pas sorcier =).

Si la langue dans laquelle vous travaillez a la capacité de traiter les avertissements comme des erreurs et a des niveaux d'avertissement variables, je ferais ce qui suit:

  1. Baissez le niveau d'avertissement juste assez loin pour ne recevoir aucun avertissement. Si vous êtes au niveau d'avertissement le plus bas et que vous recevez toujours des avertissements, essayez de les corriger. Si vous ne pouvez pas les réparer, alors vous avez terminé pour le moment, mais j'espère que vous pourrez les corriger. Génial.
  2. Étant donné que vous n'avez plus aucun avertissement (à un niveau d'alerte faible très probablement), actionnez le commutateur et traitez tous les avertissements comme des erreurs.
  3. Essayez d'augmenter le niveau d'avertissement et de corriger tous les nouveaux avertissements. Si vous ne le pouvez pas, baissez le niveau d'avertissement, mais ne désactivez pas les avertissements comme des erreurs.

Je trouve que cela ne fonctionne pas seulement avec des avertissements sur mon code - il les empêche de rentrer .

PerryC
la source