IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[c#] methodes statique Avantages/inconvénients


Sujet :

C#

  1. #21
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Sinon, un code clair n'engendre-t-il pas un code rapide à executer?
    Malheureusement non.

    Tu prends un cas extrême Il n'est pas évident de bien placer le curseur entre du code très lisible mais pas optimal et du code incompréhensible mais plus rapide d'1%.

    Mais l'optimisation est l'étape finale d'un développement. Si on constate un goulot d'étranglement dans un workflow, on peut justifier l'utilisation de méthodes "non canoniques", mais optimiser prématurément sans commenter, et ceux qui liront le code plus tard pour le maintenir (c'est à dire soi-même la majorité du temps d'ailleurs) vont se gratter la tête en disant "mais qu'est-ce que j'ai bien pu vouloir dire ?"

    Linq en est un parfait exemple : il simplifie la compréhension du code, au prix d'une légère perte de perf, si je me trompe pas. Mais le code étant plus lisible, on gagne du temps de maintenance qui peut être utilisé pour améliorer l'infrastructure du soft par exemple.

    J'en ai vu du code, qui faisait des optimisations (qui gratte 1% de perf une fois sur mille) aux petits oignons sur les collections, ça l'a pas empêché d'être bourré de fonctions en complexité quadratique alors qu'elle pourrait être linéaire par exemple.
    ಠ_ಠ

  2. #22
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Personellement je définis souvent des membres statiques à l'intérieur d'objets instanciables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Personne
    {
    public string nom
    ...
    public int age
     
    public static List<Personne> Liste;
     
    public static LoadAll()
    {
        //désérialize une liste depuis un fichier
        //et l'attribue à Liste
    }
     
    public static List<Personne> Find(parametre)
    {
        //... fais une recherche et renvoie une list de résultats
    }

    Du coup j'ai le manager et les objets dans la meme classe. Sympa pour les trucs "vite faits" pas trop complexes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personne.LoadAll();
    Personne.List.Add(new Personne(machin))
    List<Personne> resultats = Personne.Find(trucbidule)
    etc..


    }
    XOR Onlava, Onlava

  3. #23
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Onlava Voir le message
    Du coup j'ai le manager et les objets dans la meme classe. Sympa pour les trucs "vite faits" pas trop complexes
    Interessant, quel est le degré de complexité à partir duquel cela n'est plus valable à ton avis?
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #24
    Membre régulier Avatar de Onlava
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 92
    Points : 112
    Points
    112
    Par défaut
    Je dirais que c'est pratique que si le manager doit gérer un seul type d'objets indépendament du reste de l'application, et que les méthodes se limitent a des choses simples (load/save/process/search)
    Par exemple pour une classe de configs.
    XOR Onlava, Onlava

  5. #25
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Onlava Voir le message
    Je dirais que c'est pratique que si le manager doit gérer un seul type d'objets indépendament du reste de l'application, et que les méthodes se limitent a des choses simples (load/save/process/search)
    Par exemple pour une classe de configs.
    Est-ce que tu peux développer un peu plus?
    Je conçois que c'est pratique, as-tu des exemples du cas contraire?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #26
    Membre actif Avatar de bartoumi
    Profil pro
    Inscrit en
    Février 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 178
    Points : 205
    Points
    205
    Par défaut
    Bonjour
    Apparement j'ai lancé un debat sur un sujet tres complexe !!
    Ce que je cherche moi exactement

    C'est l'impact sur :
    1- La gestion de memoire.
    2- Les performances(en generale).

    et aussi est ce qu'il y'a des regle(recommandéou bonnes pratique) du choix entre methode Statique ou non.

    Merci
    I C#

  7. #27
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par bartoumi Voir le message
    C'est l'impact sur :
    1- La gestion de memoire.
    2- Les performances(en generale).
    Il n'est pas évident d'être catégorique sur les avantages d'une méthode statique, mais en gros :

    • Une méthode statique est souvent une bonne candidate à l'inlining.
    • Une méthode statique n'existe qu'une seule fois en mémoire, mais elle existe dès le début et existe pendant toute le vie du programme.


    Donc, à priori, une méthode statique favorise les performances, ne serait-ce que parce que son chemin d'appel est connu et ne peut pas varier.
    Niveau mémoire, c'est difficile à dire...

    Les outils d'analyse comme FxCop suggère de passer une méthode d'instance en méthode statique dès lors qu'elle n'utilise pas de membres d'instance dans son traitement.
    Après à toi de voir si cela se justifie ou si ton design peut être amélioré.
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  8. #28
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Une méthode statique n'existe qu'une seule fois en mémoire
    Citation Envoyé par Keihilin Voir le message
    Donc, à priori, une méthode statique favorise les performances, ne serait-ce que parce que son chemin d'appel est connu et ne peut pas varier.
    Certes... mais c'est vrai aussi pour une méthode d'instance : le code d'une classe est présent une seule fois en mémoire, il n'est pas dupliqué pour chaque nouvelle instance. La seule différence est qu'une méthode d'instance reçoit implicitement this en paramètre, contrairement à une méthode statique.

    Donc le fait qu'une méthode soit statique ne change rien aux performances à mon avis...

    Citation Envoyé par bartoumi Voir le message
    et aussi est ce qu'il y'a des regle(recommandéou bonnes pratique) du choix entre methode Statique ou non.
    Pour moi, ça dépend essentiellement si la méthode est liée ou non à une instance particulière d'objet. Typiquement, une méthode qui renverrait des informations globales à l'application serait statique, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static string GetConfigurationPath()
    {
        ...
    }

  9. #29
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    La discussion http://www.developpez.net/forums/sho...d.php?t=248877 aborde aussi plus ou moins la question. Pouvez-vous jeter un oeil?

    Merci d'avance.
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #30
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    La discussion http://www.developpez.net/forums/sho...d.php?t=248877 aborde aussi plus ou moins la question. Pouvez-vous jeter un oeil?

    Merci d'avance.
    Je ne vois pas vraiment le rapport... cette discussion ne parle pas de méthodes statiques d'après ce que j'ai vu

  11. #31
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Ben si un peu.
    Le question du post actuel étant: "methodes statique Avantages/ inconvénients", on peu facilement dériver sur des questions d'architectures.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #32
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Certes... mais c'est vrai aussi pour une méthode d'instance : le code d'une classe est présent une seule fois en mémoire, il n'est pas dupliqué pour chaque nouvelle instance.
    Je ne voulais pas dire que le code d'une classe est forcément dupliqué, mais par le jeu des mécanismes d'héritage, il peut l'être.
    Sans rentrer dans les détails trop techniques (que je ne maîtrise pas forcément à 100% de toute manière), la pile d'appel d'une méthode d'instance est forcément plus complexe que celle d'une méthode statique (d'où l'utilité du mot-clé "sealed" pour indiquer au compilateur qu'il n'a pas besoin de se soucier d'éventuels enfants).
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  13. #33
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Je ne voulais pas dire que le code d'une classe est forcément dupliqué, mais par le jeu des mécanismes d'héritage, il peut l'être.
    Si la méthode est virtuelle uniquement. Faudrait vérifier si Convert.ToString(4) et 4.ToString() ont des perfs différentes. J'ose espérer que non
    ಠ_ಠ

  14. #34
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Si la méthode est virtuelle uniquement.
    Je ne crois pas. N'oublions pas que même si une méthode n'est pas virtuelle, elle peut être redéfinie...

    Citation Envoyé par Guulh Voir le message
    Faudrait vérifier si Convert.ToString(4) et 4.ToString() ont des perfs différentes. J'ose espérer que non
    Sur une opération aussi simple, il n'y a aucune différence...j'ai testé
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  15. #35
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Je ne crois pas. N'oublions pas que même si une méthode n'est pas virtuelle, elle peut être redéfinie...
    Euh, comment ? Tu penses au mot clé new ? Si c'est le cas, je ne pense pas qu'il intervienne dans notre problématique, par ce que le compilo sait statiquement s'il faut appeler la version de base ou la version "newée". ce qui n'est pas le cas bien sûr pour les méthodes virtuelles.
    ಠ_ಠ

  16. #36
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Euh, comment ? Tu penses au mot clé new ? Si c'est le cas, je ne pense pas qu'il intervienne dans notre problématique, par ce que le compilo sait statiquement s'il faut appeler la version de base ou la version "newée".
    Oui, je pensais bien à "new".

    Possible que tu ais raison, je ne suis pas très sûr de la façon dont cela est géré par le compilateur...

    Il faudrait que je vérifie par curiosité, mais plonger dans du MSIL un lundi matin, c'est au dessus de mes forces
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    meme en faisant un masquage (aka new) et en sealant l'objet, l'appel reste virtuel (alors qu'on pourrait le resoudre à la compilation). En IL, on peut appeler les methodes soit statiquement (opcode call) soit en laissant le runtime resoudre le type (qui est fait à partir du this passé en caché en premier argument). La norme dit bien qu'on peut appeller des methodes d'instances de maniere statiques :

    It is valid to call a virtual method using call (rather than callvirt); this indicates that the method is to be resolved using the class specified by method rather than as specified dynamically from the object being invoked. This is used, for example, to compile calls to “methods on super” (i.e., the statically known parent class).
    Mais malgré la possibilité il semblerait que csc n'emette quasiment jamais de call statique (meme en release) et prefere deleguer la resolution du type au runtime. meme sur un pattern de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sealed class Truc : Base
        {
            public new string ToString()
            {
                return iM++.ToString();
            }
        }
    On pourrait imaginer un call statique, vu que le jeton ToString est ajouté explicitement par la classe, et que cette derniere est finale, mais non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     //...
        L_0000: newobj instance void ConsoleApplication1.Truc::.ctor()
        L_0005: stloc.0 
        L_0006: ldloc.0 
        L_0007: callvirt instance string ConsoleApplication1.Truc::ToString()
        L_000c: pop 
     
        //...
    Ceci dit il y a un avantage au new , si on le remplace par un simple override, l'IL emit devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        L_0000: newobj instance void ConsoleApplication1.Truc::.ctor()
        L_0005: stloc.0 
        L_0006: ldloc.0 
        L_0007: callvirt instance string [mscorlib]System.Object::ToString()
        L_000c: pop
    ou la le runtime doit à la fois resoudre le type (la variable locale 0 est ici de type truc), et chercher la methode candidate.

    Bref, j'ai l'impression que la plupart du temps, le compilo C# prefere laisser le boulot au runtime, et ne lie statiquement que les methodes statiques (qui par definition sont statiques (sic)). Concernant les impacts en termes de perfs de la resolution des candidats ni la norme, ni les quelques livres parlant de la CLR (Essentials .Net : The CLR; Expert .Net 2.0 IL Assembler) n'en parle, ce qui à mon avis doit etre negligeable (du moins en milieu managé, ou des differences de cet ordre sont noyé dans la masse).

  18. #38
    Membre actif Avatar de bartoumi
    Profil pro
    Inscrit en
    Février 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 178
    Points : 205
    Points
    205
    Par défaut
    Désolé
    Mais personne ne m'a répondu a ma question ?

    Impact sur les performance ?
    Gestion de mémoire?
    Y'a t'il des règles de choix?

    Si quelqu'un a une référence de documentions , j'aimerai bien qu'il me fasse part.

    Seul certitude : En statique on fait pas de l'objet on fait du procédural

    Parce qu'il faudra clore un moment ou un autre sujet.
    I C#

  19. #39
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par bartoumi Voir le message
    Désolé
    Mais personne ne m'a répondu a ma question ?
    Euh...

    Citation Envoyé par SirJulio Voir le message
    Concernant les impacts en termes de perfs de la resolution des candidats ni la norme, ni les quelques livres parlant de la CLR (Essentials .Net : The CLR; Expert .Net 2.0 IL Assembler) n'en parle, ce qui à mon avis doit etre negligeable (du moins en milieu managé, ou des differences de cet ordre sont noyé dans la masse).
    Citation Envoyé par bartoumi Voir le message
    Seul certitude : En statique on fait pas de l'objet on fait du procédural
    Non, le concept de "static" a aussi du sens en objet. Toute fonction n'a pas besoin des membres d'une instance particulière.

    Citation Envoyé par bartoumi Voir le message
    Gestion de mémoire?
    Hors sujet : une méthode est un bout de code, présent une seule fois en mémoire (hors inline).
    ಠ_ಠ

  20. #40
    Membre actif Avatar de bartoumi
    Profil pro
    Inscrit en
    Février 2005
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 178
    Points : 205
    Points
    205
    Par défaut
    Merci

    Par personne n'a répondu à ma question. je veux dire avec de vrai arguments technique pas ce que les personne pense

    Par la gestion de mémoire. je veux dire tout les objets qu'on serait amener à créer a l'intérieur de la méthode (statique ou non)

    Et je confirme faire du statique ce n'est pas de l'objet.(conseil : merci de bien réviser les concept objet)
    I C#

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Avantages / inconvénients de BSD face à linux
    Par Community Management dans le forum Distributions
    Réponses: 129
    Dernier message: 17/01/2011, 18h51
  2. Methodes statiques
    Par romeo9423 dans le forum C++
    Réponses: 3
    Dernier message: 01/02/2006, 11h30
  3. [Singleton] difference singleton classe avec methodes statiques
    Par matN59 dans le forum Design Patterns
    Réponses: 6
    Dernier message: 15/01/2006, 11h04
  4. Réponses: 5
    Dernier message: 27/07/2004, 15h57
  5. Oracle -> Postgres (avantages/ inconvénients)
    Par milka dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 12/03/2004, 11h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo