web-dev-qa-db-fra.com

Devez-vous affirmer not null avec l'instruction assert dans le code de production?

J'ai vu this question mais j'ai encore quelques questions sur l'utilisation du mot-clé assert. Je débattais avec quelques autres codeurs sur l'utilisation de assert. Pour ce cas d'utilisation, il y avait une méthode qui peut retourner null si certaines conditions préalables sont remplies. Le code que j'ai écrit appelle la méthode, puis affirme qu'elle ne renvoie pas null et continue d'utiliser l'objet retourné.

Exemple:

class CustomObject {
    private Object object;

    @Nullable
    public Object getObject() {
        return (object == null) ? generateObject() : object;
    }
}

Maintenant, imaginez que je l'utilise comme ceci:

public void useObject(CustomObject customObject) {
    object = customObject.getObject();
    assert object != null;
    // Do stuff using object, which would throw a NPE if object is null.
}

On m'a dit que je devrais supprimer les assert, qu'ils ne devraient jamais être utilisés dans le code de production, uniquement être utilisés dans les tests. Est-ce vrai?

32
Big_Bad_E

Utilisez des assertions généreusement chaque fois que cela aide à attraper programmation erreurs, c'est-à-dire bogues.

N'utilisez pas assert pour attraper quelque chose qui pourrait logiquement se produire, c'est-à-dire une entrée mal formatée. N'utilisez assert que lorsque l'erreur est irrécupérable.

Ne mettez aucune logique de production dans le code qui s'exécute lorsque l'assertion est vérifiée. Si votre logiciel est bien écrit, c'est trivialement vrai, mais si ce n'est pas le cas, vous pourriez avoir des effets secondaires subtils et un comportement général différent avec les assertions activées et désactivées.

Si votre entreprise a un "code de test" et un "code de production" faisant la même chose mais avec des bases de code différentes (ou des étapes d'édition différentes), sortez de là et ne revenez jamais. Essayer de corriger ce niveau d'incompétence est probablement une perte de temps. Si votre entreprise ne place aucune déclaration d'assert en dehors du code des tests, veuillez leur dire que les assertions sont désactivées dans la version de production et que si ce n'est pas le cas, la correction de cette erreur est désormais votre première priorité.

La valeur des assertions est précisément à utiliser dans la logique métier et pas seulement dans la suite de tests. Cela facilite la production de nombreux tests de haut niveau qui n'ont pas à tester explicitement beaucoup de choses pour parcourir de gros morceaux de votre code et déclencher toutes ces assertions. Dans quelques-uns de mes projets, les tests typiques n'ont même pas vraiment affirmé quoi que ce soit, ils ont simplement ordonné qu'un calcul se fasse sur la base d'une entrée spécifique et cela a provoqué la vérification de centaines d'assertions et la découverte de problèmes, même dans de minuscules morceaux de logique.

3
Kafein

Vous pouvez utiliser assert à tout moment. Le débat vient est de savoir quand utiliser. Par exemple dans le guide :

  • N'utilisez pas d'assertions pour la vérification des arguments dans les méthodes publiques.
  • N'utilisez pas d'assertions pour effectuer les travaux requis par votre application pour un fonctionnement correct.
2
Gatusko