1
votes

Style de codage: Meilleur moyen de programmer les appels de fonction en fonction d'un indicateur

Ceci est une question C simple. J'ai conçu mon code comme ceci:

main()
{
   ...
   if (flag)
   {
      do_my_func1();
   }
   ...
}

void do_my_func1()
{
   ..do the processing for this function
}

Où do_my_func1 () a fait ceci:

void do_my_func1()
{
   if (flag)
   {
      ..do the processing for this function
   }
}

Mon patron a dit que cela devrait être fait comme ceci :

main()
{
   ...
   do_my_func1();
   ...
}

Alors, quelle est la meilleure pratique pour faire un appel de fonction comme celui-ci - je pensais que ma méthode était la meilleure, surtout si vous appelez de nombreuses fonctions dépendant de nombreux indicateurs ?


2 commentaires

Le patron a toujours raison: P


En règle générale, une fonction doit faire un travail et bien le faire. En règle générale, les indicateurs qui amènent une fonction à faire l'une des deux choses sont problématiques. En règle générale, les variables globales sont également mal vues. Mais il y a des exceptions à toutes ces règles, donc je ne ferais jamais une règle globale comme "ne jamais avoir d'indicateur d'option" ou "ne jamais utiliser de variables globales".


3 Réponses :


0
votes

Sauf si vous avez une très bonne raison, vous devriez certainement choisir l'option que votre patron vous a donnée. Une alternative est la suivante:

void do_my_func1(int flag)
{
   if (flag)
   {
      ..do the processing for this function
   }
}

Ce qui est le mieux dépend de la situation et ne peut pas être déterminé dans un exemple général comme celui-ci.

Évitez les globaux lorsque vous le pouvez. Il y a des cas où ils sont bons, mais être paresseux n'en fait pas partie. ;)

S'il y a beaucoup d'indicateurs, mettez-les dans un tableau ou une structure.


0 commentaires

0
votes

Une fonction comme votre do_my_func1 () devrait toujours s'en tenir à des choses simples et les vérifications pour l'appeler devraient être faites à l'avance, donc if (flag) doit toujours être dans la fonction parent.

Une bonne pratique est également d'ajouter static devant les fonctions appelées dans le même fichier, cela allège l'exécutable compilé


0 commentaires

0
votes

Dans ce cas, le patron a raison. Dans votre code, il y aura toujours un appel de fonction. Ce qui est inutile si le drapeau n'est pas défini. La vérification de la condition prend beaucoup moins de temps que l'appel d'une fonction. L'appel d'une fonction nécessite beaucoup de traitement. ( lien ) Il est beaucoup plus facile d'évaluer une condition. Dans le compilateur moderne, la prédiction de branche est plus précise et permet de gagner beaucoup de temps en éliminant un appel de fonction. Vous pouvez faire une petite démo pour vérifier ceci: `

main()
{
   int n=INTMAX;
   int m=INTMAX;
   struct timeval start, stop;
   double msecs = 0;

   gettimeofday(&start, NULL);
   for(;n>0;n--){
       for(;m>0;m--){  
           if (flag)
           {
              do_my_func1();
           }
           ...
        }
    }
   gettimeofday(&stop, NULL);
   msecs = (double)(stop.tv_usec - start.tv_usec) / 1000.0f + (double)(stop.tv_sec - start.tv_sec)*1000.0f ;
   printf("time taken %f\n",msecs);
}

void do_my_func1()
{
   ..do the processing for this function
}`

v / s votre version et enregistrez l'heure.


0 commentaires