29880

Zeph -> ben des solutions qui marchent, je viens d'en proposer 4 (var globale, var statique, singleton, et paramètre un peu partour).
C'est donc un avis que je demandais, et Flanker et toi venez d'être parfaitement clair à ce sujet. smile

J'ai juste un blocage psychologique très fort avec une variable qui va être passé à 50 fonctions en paramètre, donc 30 fois inutilement : question perf, c'est l'horreur grin

M'enfin, c'est oujours un peu le cas avec la programmation structurée. Merci beaucoup pour votre avis top

29881

Folco (./29880) :
J'ai juste un blocage psychologique très fort avec une variable qui va être passé à 50 fonctions en paramètre, donc 30 fois inutilement : question perf, c'est l'horreur grin
Honnêtement je doute que l'impact au niveau perfs soit sensible, surtout sur une machine récente smile

Je trouve beaucoup plus gênant le fait que ça rende le code plus verbeux, donc moins lisible. Quand il s'agit de valeurs constantes et uniques (comme le handle de la fenêtre principale), perso je préfère utiliser une variable globale (ou un getter dans un singleton).
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29882

Zerosquare (./29881) :
que ça rende le code plus verbeux, donc moins lisible
Je ne suis vraiment pas d'accord avec ton implication. Il y a beaucoup de cas où rendre le code plus verbeux peut améliorer la lisibilité, et je fais entrer la question de Folco dans ceux-ci. Sinon tu pourrais aussi inliner toutes les constantes, variables et fonctions utilisées une seule fois, faire disparaître tous les types dans les langages qui le supportent (cf. discussion sur l'inférence il n'y a pas longtemps), ou je ne sais quelle autre réduction de code qui te ferait gagner quelques caractères mais à mon avis perdre beaucoup en lisibilité.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

29883

Oui je me suis peut-être mal exprimé smile

Inliner une constante nommée rend le code plus compact mais moins compréhensible, on est d'accord.

Mais ajouter un paramètre constant à plein d'appels de fonction, de mon point de vue :
- ça n'apporte aucune information utile
- ça introduit de la duplication, avec le risque de se planter (et de ne pas le voir, parce qu'on est habitué à ne plus regarder le paramètre constant)
- ça masque le fait que l'argument est constant, donc ça rend la revue du code de la fonction plus complexe pour rien
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29884

Justement, je trouve que :

- Ça apporte comme information que cette fonction dépend de cette variable. On le voit apparaître de façon explicite dans sa signature, sans avoir besoin de lire le code pour se rendre compte qu'il contient une référence statique vers un singleton ou une variable globale. Ça veut dire par exemple que si je veux tester unitairement cette fonction je ne peux pas oublier de fournir un mock pour cette variable.
- C'est une bonne duplication je trouve : si on se rend compte que cette variable est passée en paramètre à 75 fonctions, peut-être que ça traduit un autre souci dans le code et je préfère m'en rendre compte tôt. Ça rejoint un peu le point précédent et je pense qu'il va être difficile de faire des généralités ici, mais je pense que dans la majorité des cas ça traduit un couplage trop fort entre un type et tout le reste du code, là où un sous-ensemble de ce type pourrait être suffisant. Si par facilité on peut accéder à une instance globale depuis n'importe où, c'est très difficile de repérer cette erreur (et de ne pas faire grossir cette instance en lui ajoutant des fonctionnalités petit à petit jusqu'à ce que ça devienne un monstre impossible à remplacer ni tester facilement).
- Comme Folco fait du C++ il peut utiliser "const", ou "val", ou ne pas mettre "mut", ou je ne sais quelle variante dans tout plein de langages qui possèdent justement la bonne fonctionnalité pour ce genre de cas ^^
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

29885

Ok, vos arguments se tiennent tous les deux, bien sûr, vous en êtes pas à votre coup d'essai et on sent les expériences qui dictent vos propos ^^

Alors, voyons mon cas. j'utilise la SDL pour faire un jeu. Cette lib utilise un SDL_Renderer pour faire tout ce qui est dessin dans la fenêtre principale. Tous les objets qui dessinent/se font dessiner doivent avoir un pointeur vers ce SDL_Renderer*.

Aucun objet, image, sprite, texte, whatever, ne se dessine en-dehors de ce SDL_Renderer, constant du début à la fin de l'exécution du programme. Tout le monde a donc besoin de ce SDL_Renderer* dans mon programme.

Je code en C++, j'ai choisi le singleton, qui est pour moi la variable globale C/asm en équivalent C++ élégant.
Squelette de la classe : http://www.mirari.fr/VrWf

Concrètement, dans ce cas-là, serait-il mieux de passer cette variable à la moitié des fonctions du code ? Ou alors, si je dois passer cette variable un peu partout, n'est-ce pas symptomatique d'un code bordélique (la réponse peut être "oui", ça me gêne pas grin)

Parce que question lecture, "tapage" de code et efficacité machine, je trouve ça overkill de me ballader cette variable un à tous les niveaux du jeu, même là où ça n'a rien à faire (gamestates etc...)

29886

Passer un pointeur à chaque fonction augmente la taille de la pile de 4 octets par ajout (si on oublie un instant les possibles optimisations du compilo, dans le cas où tu ne fais que forward le pointeur par exemple), je suis pas certain que ce soit un gros problème, mais imo dans ce genre de cas avoir un singleton fait plus de sense.

Je suis en train de faire un renderer 3D pour les asset de Wow (ça se voit sur mes précédents posts ici, non? grin), et de mon côté j'ai tout simplement choisi de stocker GxContext (l'équivalent de ton SDL_Renderer*) dans toutes les classes qui décrivent de la géométrie ou des sources de lumière.

Ça n'empêche pas GxContext d'être unique: son cycle de vie est contrôlé par le programme. Si j'ai besoin de plusieurs surfaces de rendu, je définis de nouvelles textures pour le depth stencil, etc, et je dessine dedans.

Du coup à mon sens, avoir un singleton ici est la chose la plus logique à faire; et dans la foulée, je forcerai sa création au démarrage du programme. Je réalise que ce n'est pas ce que j'ai fait, mais mon programme ne sert pas qu'à visualiser de la géométrie, c'est aussi un outil pour le datamining, et le rendu 3D n'est qu'un bonus grin

Petite note: DirectX n'apprécie pas qu'on envoie des commandes depuis plusieurs threads (à juste titre); je ne connais pas le positionnement d'OpenGL et/ou de la SDL à ce sujet mais quand tu commenceras à devoir toucher au threading, garde ça en mémoire wink

(Je ne sais même pas si c'est autorisé d'avoir plusieurs pipelines de rendu, quelle que soit l'API utilisée; j'ai toujours recyclé un unique pipeline ...)

Fork?

29887

Zerosquare a souhaité poursuivre une discussion dérivée dans un nouveau sujet. La discussion initiale a eu lieu dans le sujet topics/61689-jeu-videz-votre-presse-papier/997#post-29886 tandis que la discussion dérivée continue dans le sujet topics/187284-variables-globales-singleton-ou-parametres où les messages en rapport ont été copiés.
avatar
Ben, bouh, quoi :D

29888

29889

29890

avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29891

29892

29893

m_Table->setRangeSelected(QTableWidgetSelectionRange(lineidx, 0, lineidx, m_Table->columnCount() - 1), true);
avatar
HURRRR !

29894

avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

29895

é
avatar
HURRRR !

29896

avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

29897

Ooooh !
Brunni a été invité sur ce sujet.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29898

-p SampleParticlesIntegration -a Particles/Fountain_Nodegraph_TurbBurst.pkfx
avatar
HURRRR !

29899

29900

29901

n
avatar
HURRRR !

29902

*:\Users\**********.*****\workspace\*****OBSW\
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

29903

29904

Toi aussi, t'as des problèmes de fuites d'eau ? tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

29905

29906

v0.0.1:
[0] CASC Loaded in 12909 ms
[1] CASC Loaded in 12316 ms
[2] CASC Loaded in 12334 ms
[3] CASC Loaded in 12019 ms
[4] CASC Loaded in 12300 ms
[5] CASC Loaded in 12470 ms
[6] CASC Loaded in 12853 ms
[7] CASC Loaded in 12324 ms
[8] CASC Loaded in 11753 ms
[9] CASC Loaded in 12550 ms
Average load speed: 12382.8 ms

v1.0.0:

[0] CASC Loaded in 8433 ms
[1] CASC Loaded in 7811 ms
[2] CASC Loaded in 7731 ms
[3] CASC Loaded in 7427 ms
[4] CASC Loaded in 7598 ms
[5] CASC Loaded in 7890 ms
[6] CASC Loaded in 7737 ms
[7] CASC Loaded in 7926 ms
[8] CASC Loaded in 7320 ms
[9] CASC Loaded in 7347 ms
Average load speed: 7722 ms

29907

Stephanie Corneliussen

29908

29909




29910

bool inlineConstants = true,
avatar
HURRRR !