56 votes

Faire valoir une bonne pratique ou non?

Est-ce une bonne pratique d'utiliser Assert pour les paramètres de fonction pour renforcer leur validité. Je parcourais le code source de Spring Framework et j'ai remarqué qu'ils utilisent beaucoup Assert.notNull . Voici un exemple

    public static ParsedSql parseSqlStatement(String sql) {
    Assert.notNull(sql, "SQL must not be null");}
 

En voici un autre:

 public NamedParameterJdbcTemplate(DataSource dataSource) {
            Assert.notNull(dataSource,
                    "The [dataSource] argument cannot be null.");
            this .classicJdbcTemplate = new JdbcTemplate(dataSource);
        }

        public NamedParameterJdbcTemplate(JdbcOperations classicJdbcTemplate) {
            Assert.notNull(classicJdbcTemplate,
                    "JdbcTemplate must not be null");
            this .classicJdbcTemplate = classicJdbcTemplate;
      }
 

Pour info, le Assert.notNull (pas l'instruction assert ) est défini dans une classe util comme suit:

 public abstract class Assert { 
   public static void notNull(Object   object, String   message) {
      if (object == null) {
          throw new IllegalArgumentException  (message);
      }
   }
}
 

61voto

polygenelubricants Points 136838

En principe, les affirmations ne sont pas différent de beaucoup d'autres moment de l'exécution de vérifications.

Par exemple, Java lié-vérifie tous les champs d'accès au moment de l'exécution. Cela rend les choses un peu plus lent? Oui. Est-il avantageux? Absolument! Dès que out-of-lié à la violation se produit, une exception est levée et le programmeur est averti de tout bug possible! Le comportement dans d'autres systèmes où l'accès à des tableaux ne sont pas liés vérifiés sont BEAUCOUP PLUS IMPRÉVISIBLES! (souvent avec des conséquences désastreuses!).

Assertions, si vous utilisez la bibliothèque ou de la langue de support, est semblable à l'esprit. Il y a des coûts de l'exécution, mais c'est absolument la peine. En fait, les affirmations sont encore plus précieux parce que c'est explicite, et il communique concepts de niveau plus élevé.

Utilisé correctement, le coût peut être réduit au minimum et la valeur, à la fois pour le client (qui va attraper des violations de contrat, et plutôt tôt que tard) et les développeurs (parce que le contrat est auto-application et l'auto-documentation), est agrandie.

Une autre façon de voir les choses est de penser des affirmations comme "actif " commentaires". Il n'y a pas arguant que les commentaires sont utiles, mais ils sont PASSIFS; calcul, ils ne font rien. Par la formulation de certains concepts comme des assertions au lieu de commentaires, ils deviennent ACTIFS. En fait ils doivent détenir au moment de l'exécution; les infractions seront pris.


Voir aussi: les avantages de la programmation avec les affirmations

28voto

Michael Myers Points 82361

Ces assertions sont bibliothèque fournie et ne sont pas le même que le haut- assert mot-clé.

Il y a une différence ici: asserts n'exécutez pas par défaut (ils doivent être activés avec l' -ea paramètre), tandis que les affirmations fournies par l' Assert classe ne peut pas être désactivé.

À mon avis (pour ce que ça vaut), c'est aussi une bonne méthode pour valider les paramètres. Si vous aviez utilisé intégrés dans les affirmations que la question titre l'indique, j'aurais fait valoir contre elle sur la base que les vérifications nécessaires ne doivent pas être amovible. Mais ce moyen est juste un raccourci pour:

public static ParsedSql parseSqlStatement(String sql) {
    if (sql == null)
        throw new IllegalArgumentException("SQL must not be null");
    ...
}

... qui est toujours de bonne pratique de le faire dans les méthodes publiques.

L'intégré dans le style de affirme est plus utile pour les situations où une condition doit toujours être vrai, ou pour des méthodes privées. Le guide de langue en introduisant des assertions a quelques bonnes lignes directrices qui sont, fondamentalement, ce que je viens de décrire.

18voto

Stephen C Points 255558

Oui c'est une bonne pratique.

Au Printemps les cas, il est particulièrement important parce que les contrôles sont de la validation des paramètres de propriété, etc qui sont généralement à venir à partir de XML câblage des fichiers. En d'autres termes, ils sont de la validation de la webapp de configuration. Et si jamais vous ne le sérieux de Printemps à base de développement, ceux des contrôles de validation va vous épargner des heures de débogage lorsque vous faites une stupide erreur de configuration.

Mais notez qu'il y a une GRANDE différence entre une bibliothèque de classe appelé Assert et la Java assert mot-clé qui est utilisée pour définir un Java affirmation. La dernière forme d'affirmations peut être désactivé au démarrage de l'application du temps, et ne doit PAS être utilisé pour l'argument des contrôles de validation que vous voulez toujours de se produire. Clairement, le Printemps, les concepteurs pense que ce serait une très mauvaise idée pour désactiver la webapp de configuration des contrôles d'intégrité ... et je suis d'accord.

Mise à JOUR

Dans Java 7 (et plus tard), l' java.util.Objects classe fournit un requireNonNull méthode pratique pour tester si un argument est - null et lever une exception. Vous l'utilisez comme ceci:

 SomeType t = ...
 SomeType tChecked = Objects.requireNonNull(t);

ou

 SomeType tChecked = Objects.requireNonNull(t, "t should be non-null");

Cependant, cette méthode soulève NullPointerException plutôt que d' IllegalArgumentException.

5voto

kiwicptn Points 334

D'après le guide de Sun sur les assertions, vous ne devez pas utiliser d'assertions pour vérifier les arguments dans les méthodes publiques.

La vérification des arguments fait généralement partie des spécifications publiées (ou du contrat) d'une méthode, et ces spécifications doivent être respectées, que les assertions soient activées ou désactivées.

1voto

cletus Points 276888

Oui c'est une bonne idée. Vous êtes en appliquant la passation des marchés de l'interface ou de la classe. Si il y a une violation de contrat que vous souhaitez détecter dès que possible. Le plus vous attendez le plus imprévisible, les résultats peuvent être et le plus difficile, il peut être à diagnostiquer.

Lorsque vous vérifient de manière explicite comme cela, vous devez également fournir un message d'information que lors de l'affichage dans un fichier journal peut donner un contenu utile pour les aider à trouver la cause racine ou même juste de réaliser que vous avez fait une fausse supposition au sujet de ce que le contrat est.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X