Question

C’est une programmation générale, mais si cela fait une différence, j’utilise objectif-c. Supposons qu'une méthode retourne une valeur et effectue également certaines actions, mais vous ne vous souciez pas de la valeur renvoyée, mais uniquement de son contenu. Souhaitez-vous simplement appeler la méthode comme si elle était nulle? Ou placez le résultat dans une variable puis supprimez-le ou oubliez-le? Indiquez votre opinion, ce que vous feriez si vous aviez cette situation.

Était-ce utile?

La solution

Un exemple courant est printf, qui renvoie un int ... mais vous voyez rarement ceci:

int val = printf("Hello World");

Autres conseils

Ouais, appelez la méthode comme si elle était vide. Vous le faites probablement tout le temps sans vous en rendre compte. L'opérateur d'affectation '=' renvoie une valeur, mais elle est très rarement utilisée.

Cela dépend de l'environnement (la langue, les outils, la norme de codage, ...).

Par exemple, en C, il est parfaitement possible d’appeler une fonction sans utiliser sa valeur. Avec certaines fonctions comme printf, qui renvoie un int, cela se fait tout le temps.

Parfois, le fait de ne pas utiliser de valeur provoque un avertissement indésirable. Assigner la valeur à une variable et ne pas l'utiliser ensuite provoquera un autre avertissement concernant une variable inutilisée. Dans ce cas, la solution consiste à annuler le résultat en préfixant l'appel avec (void), par exemple

.
(void) my_function_returning_a_value_i_want_to_ignore().

En fait, il y a deux problèmes distincts:

  1. Devriez-vous vous soucier de la valeur renvoyée?
  2. Si vous l'assignez à une variable que vous n'allez pas utiliser?

La réponse à la question 2 est un "NON" retentissant. - à moins, bien sûr, que vous travailliez avec une langue où ce serait illégal (je pense au début du Turbo Pascal). Il est absolument inutile de définir une variable uniquement pour la jeter.

La première partie n’est pas si facile. Généralement, une raison est renvoyée - pour les idempotent , le résultat est le seul but de la fonction; pour non-idempotent, il représente généralement une sorte de code de retour indiquant si l'opération s'est déroulée normalement. Il existe bien entendu des exceptions, telles que la chaînage de méthodes .

Si cela est courant dans .Net (par exemple), il y a probablement un problème avec la rupture de code CQS .

Lorsque j'appelle une fonction qui renvoie une valeur que j'ignore, c'est généralement parce que je le fais dans un test pour vérifier le comportement. Voici un exemple en C #:

    [Fact]
    public void StatService_should_call_StatValueRepository_for_GetPercentageValues()
    {
        var statValueRepository = new Mock<IStatValueRepository>();

        new StatService(null, statValueRepository.Object).GetValuesOf<PercentageStatValue>();

        statValueRepository.Verify(x => x.GetStatValues());
    }

Je ne me soucie pas vraiment du type de retour, je veux juste vérifier qu'une méthode a été appelée sur un faux objet.

En C, c’est très courant, mais il ya des endroits où il est acceptable de le faire et d’autres où ce n’est vraiment pas le cas. Les versions ultérieures de GCC ont un attribut de fonction afin que vous puissiez recevoir un avertissement lorsqu'une fonction est utilisée sans vérifier la valeur de retour:

  

L'attribut warn_unused_result provoque l'émission d'un avertissement si un appelant de la fonction avec cet attribut n'utilise pas sa valeur de retour. Ceci est utile pour les fonctions où ne pas vérifier le résultat est soit un problème de sécurité, soit toujours un bogue, tel que realloc.

     int fn () __attribute__ ((warn_unused_result));
     int foo ()
     {
       if (fn () < 0) return -1;
       fn ();
       return 0;
     }
     

entraîne un avertissement sur la ligne 5.

La dernière fois que j'ai utilisé cela, il n'y avait aucun moyen de désactiver l'avertissement généré, ce qui pose des problèmes lors de la compilation de code tiers que vous ne souhaitez pas modifier. De plus, il n’existe bien sûr aucun moyen de vérifier si l’utilisateur fait réellement quelque chose de sensé avec la valeur renvoyée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top