Question

J'aime utiliser des fonctions statiques en C++ pour les catégoriser, comme le fait C#.

Console::WriteLine("hello")

Est-ce bon ou mauvais?Si les fonctions sont souvent utilisées, je suppose que cela n'a pas d'importance, mais sinon, exercent-elles une pression sur la mémoire ?

Qu'en est-il de static const?

Était-ce utile?

La solution

mais est-ce bon ou mauvais

Le premier adjectif qui nous vient à l’esprit est « inutile ».C++ a des fonctions et des espaces de noms gratuits, alors pourquoi auriez-vous besoin d'en faire des fonctions statiques dans une classe ?

L'utilisation de méthodes statiques dans les classes non instanciables en C# et Java est une solution de contournement car ces langages n'ont pas de fonctions gratuites (c'est-à-dire des fonctions qui résident directement dans l'espace de noms, plutôt que dans le cadre d'une classe).C++ n'a pas ce défaut.Utilisez simplement un espace de noms.

Autres conseils

Je suis tout à fait favorable à l'utilisation de statique les fonctions.Ceux-ci ont tout simplement du sens lorsqu'ils sont organisés en modules (static class en C#).

Cependant, le moment ces fonctions ont besoin d'une sorte de données externes (non const au moment de la compilation), alors cette fonction doit être transformée en méthode d'instance et encapsulée avec ses données dans une classe.

En un mot:fonctions statiques ok, données statiques mauvaises.

Ceux qui disent que les fonctions statiques peuvent être remplacées par des espaces de noms se trompent, voici un exemple simple :

class X
{
   public:
   static void f1 ()
   {
      ...
      f2 ();
   }

   private:
     static void f2 () {}
};

Comme vous pouvez le voir, fonction statique publique f1 appelle une autre fonction statique mais privée f2.

Il ne s’agit pas simplement d’un ensemble de fonctions, mais d’un ensemble intelligent doté de ses propres méthodes encapsulées.Les espaces de noms ne nous donneraient pas cette fonctionnalité.

De nombreuses personnes utilisent le modèle « singleton », simplement parce que c'est une pratique courante, mais dans de nombreux cas, vous avez besoin d'une classe avec plusieurs méthodes statiques et un seul membre de données statique.Dans ce cas, il n’est pas du tout nécessaire d’avoir un singleton.Appelant également la méthode instance() est plus lent que le simple accès direct aux fonctions/membres statiques.

Utilisez des espaces de noms pour créer une collection de fonctions :

namespace Console {
    void WriteLine(...) // ...
}

Quant à la mémoire, les fonctions utilisent la même quantité en dehors d'une fonction, en tant que fonction membre statique ou dans un espace de noms.C'est-à-dire:pas de mémoire autre que le code lui-même.

Une des raisons spécifiques pour lesquelles les données statiques sont mauvaises est que C++ ne donne aucune garantie quant à l'ordre d'initialisation des objets statiques dans les différentes unités de traduction.En pratique, cela peut poser des problèmes lorsqu'un objet dépend d'un autre dans une unité de traduction différente.Scott Meyers en parle dans le point 26 de son livre More Effective C++.

D'accord avec Frank ici, il n'y a pas de problème avec les fonctions statiques (globales) (bien sûr à condition qu'elles soient organisées).Les problèmes ne commencent à vraiment se manifester que lorsque les gens pensent "oh, je vais juste élargir un peu la portée de ce morceau de données".Pente glissante :)

Pour mettre les choses vraiment en perspective.. Programmation fonctionnelle ;)

Le problème avec les fonctions statiques est qu’elles peuvent conduire à une conception qui rompt l’encapsulation.Par exemple, si vous vous retrouvez à écrire quelque chose comme :

public class TotalManager
{
    public double getTotal(Hamburger burger)
    {
        return burger.getPrice() + burget.getTax();
    }
}

... alors vous devrez peut-être repenser votre conception.Les fonctions statiques nécessitent souvent l'utilisation de setters et de getters qui encombrent l'API d'une classe et rendent les choses plus compliquées en général.Dans mon exemple, il serait peut-être préférable de supprimer les getters de Hamburger et de simplement déplacer la classe getTotal() dans Hamburger lui-même.

J'ai tendance à créer des classes composées de fonctions statiques, mais certains disent que la "bonne façon" de procéder est généralement d'utiliser des espaces de noms à la place.(J'ai développé mes habitudes avant que C++ n'ait des espaces de noms.)

BTW, si vous avez une classe composée uniquement de données et de fonctions statiques, vous devez déclarer le constructeur comme étant privé, afin que personne n'essaye de l'instancier.(C'est l'une des raisons pour lesquelles certains préconisent d'utiliser des espaces de noms plutôt que des classes.)

Pour l'organisation, utilisez les espaces de noms comme déjà indiqué.

Pour les données globales, j'aime utiliser le singleton modèle car il aide à résoudre le problème de l’ordre d’initialisation inconnu des objets statiques.En d’autres termes, si vous utilisez l’objet comme singleton, il est garanti qu’il sera initialisé lors de son utilisation.

Assurez-vous également que vos fonctions statiques sont sans état afin qu'elles soient thread-safe.

Je n'utilise généralement la statique qu'en conjonction avec le système ami.

Par exemple, j'ai une classe qui utilise de nombreuses fonctions d'assistance internes (intégrées) pour calculer des éléments, y compris des opérations sur des données privées.

Bien entendu, cela augmente le nombre de fonctions de l’interface de classe.Pour m'en débarrasser, je déclare une classe d'assistance dans le fichier .cpp des classes d'origine (et donc invisible pour le monde extérieur), j'en fais un ami de la classe d'origine, puis je déplace les anciennes fonctions d'assistance dans un membre statique (en ligne). fonctions de la classe d'assistance, en passant l'ancienne classe par référence en plus des anciens paramètres.

Cela permet de conserver une interface mince et ne nécessite pas une grande liste de fonctions d'amis gratuites.L'inlining fonctionne également bien, donc je ne suis pas complètement contre l'électricité statique.(Je l'évite autant que je peux, mais l'utiliser comme ça, j'aime le faire.)

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