Que dire à votre patron s'il veut que vous utilisiez une variable globale

13

Je suis actuellement en stage depuis 4 mois, et lors de la révision de mon code, mon patron n'a pas aimé que j'avais gardé un objet spécifique local pour un certain nombre de méthodes à travers quelques classes distinctes au sein d'un même assemblage. Il n'aimait pas que l'on me crée un nouvel objet à chaque fois, et à la place, il m'a dit de créer un seul objet accessible de n'importe où. J'ai donc dû le créer en tant qu'objet statique au sein d'une classe statique, et simplement le référencer à partir d'ici, je veux l'utiliser!

Comment traiteriez-vous cela, car je ne programme que professionnellement depuis 4 mois!

Darren Young
la source
4
Votre patron est-il un technicien ou un non-technicien? S'il est technique, a-t-il lu "Clean Code" de Robert C. Martin?
George Stocker,
5
Donc, votre patron vous a engagé pour coder et vous dit maintenant comment coder?
Jeremy Heiler
8
Vous avez dit dans un commentaire ci-dessous que "l'objet n'a pas d'état, à part beaucoup de constantes". Dans ce cas, une classe statique me semble être une bonne solution.
Justin
5
"Yes Boss" me vient à l'esprit ...
2
"m'a dit de créer un seul objet accessible de n'importe où. J'ai donc dû le créer comme un objet statique" Ce n'est pas un raisonnement valable. Vous parlez comme si avoir un seul objet accessible à partir d'une application entière impliquait que vous aviez un Singleton - pourquoi ne pas simplement le créer dans la racine d'agrégation puis transmettre sa référence aux classes dépendantes?
dévoré elysium

Réponses:

33

Si un objet suffit, créer un objet à chaque fois est un gaspillage, et ici votre patron a peut-être raison.

Le problème est un accès approprié à cet objet. Une méthode de type usine avec une bonne visibilité qui renvoie toujours cet objet statique est la première solution qui vient à l'esprit. D'autres existent certainement.

9000
la source
3
+1: autant que je n'aime pas une réponse du "GoF l'a dit", c'est vrai c'est vrai.
Javier
1
J'ai pensé aux Singletons, mais je l'ai juste vu comme un wrapper autour d'une variable globale, donc je ne l'ai pas suivie. Je vais essayer ceci maintenant, car l'objet n'a pas d'état, à part beaucoup de constantes donc ça devrait aller. Merci.
Darren Young
9
Je soupçonnais que cela pourrait être le cas ("l'objet n'a pas d'état ... beaucoup de constantes"). Votre patron a raison. Cela n'a aucun sens de mettre une pression artificielle sur le ramasse-miettes pour des valeurs qui ne changent jamais.
Berin Loritsch
3
@ darren-young: en passant, ne pas avoir d'état est intéressant et permet des approches puissantes; jetez un oeil à la soi-disant «programmation fonctionnelle» si vous ne l'avez pas encore fait.
9000
8

Je ne peux pas commenter votre cas spécifique, mais l'utilisation de variables globales est parfois une bonne solution. La classe System de Java regorge de variables globales statiques.

Mais en général, si vous pensez que vous avez raison et que votre patron a tort, alors pourquoi ne demandez-vous pas à votre patron d'expliquer pourquoi il pense qu'une variable globale est une meilleure solution? Un simple "je ne l'aime pas" est aussi vague que "les variables globales sont mauvaises". Vous devez exiger plus de votre patron!

S'il ne peut pas donner de raisons à sa position et que vous pouvez donner des raisons à votre position, ou vice versa, alors c'est une bonne opportunité d'apprentissage. Si vous pouvez tous deux justifier vos positions, alors c'est probablement une question de goût - ou une question d'expérience: votre patron doit avoir programmé professionnellement plus de 4 mois, je pense?

Joonas Pulakka
la source
1
Voir, java.lang.Systemcontient exactement trois variables globales, et pour chacune d'entre elles, il existe une méthode pour la définir correctement. Mais Systemest plein de méthodes statiques qui retournent des objets globaux, et il n'y a rien de mal à cela, je ne peux pas argumenter.
9000
2
Oui; Je considère les variables globales à peu près comme les méthodes statiques qui retournent des objets globaux.
Joonas Pulakka
C'est ce que fait Java. Il est une autre question tout à fait de savoir si c'est une bonne idée. Le générateur de nombres aléatoires standard de C conserve l'état global. Mais il est généralement reconnu que c'est horrible et que le générateur de nombres aléatoires est donc inutilisable dans certaines applications (voir par exemple Bentley et al., Engineering a sort function ). Java en particulier a une foule de problèmes de conception (qui ont été en partie améliorée en C #) afin I't être très méfiant de l' utiliser comme un argument comme celui - ci.
Konrad Rudolph
@Konrald Rudolph: En fin de compte, c'est une décision de conception. Chaque décision a ses avantages et ses inconvénients. Par exemple, conserver l'état global Systemsimplifie, disons, 99,9% des cas d'utilisation au prix de causer des problèmes dans les 0,1% restants. Il n'y a pas de "bonne" réponse pour savoir si 0,1% vaut la complexité supplémentaire.
Joonas Pulakka
5

En tant que personne à votre poste, le mieux que vous puissiez faire est d'apprendre. Si l'objet est essentiellement une constante (c'est-à-dire qu'il ne peut pas changer et qu'il ne maintient pas son état), alors votre patron a peut-être raison. Il n'y a aucun mal à avoir un objet constant statique. Après tout, combien de définitions de PI existe-t-il?

Certaines personnes défendent l'état d'esprit «pas d'objets globaux» au point de devenir un fervent religieux. C'est pour l'une des deux raisons: ils ont été difficiles à suivre pour détecter les bogues ou la fragilité du système en raison de la surutilisation des variables / objets globaux, ou ils ont entendu dire que c'était mauvais et ils ne pouvaient pas penser par eux-mêmes. Personnellement, je fais partie du groupe de personnes qui ont été durement touchées par la fragilité et les bogues difficiles à suivre - mais j'ai également appris un certain équilibre ici.

Si j'étais à votre place, j'irais de l'avant et ferais ce que dit le patron - c'est son cul sur la ligne après tout. Ensuite, je regarderais et verrais les effets de ce choix au fil du temps. Il s'agit d'un outil d'apprentissage efficace.

Berin Loritsch
la source
C'est un stage. Tu es censé apprendre. Faire aveuglément ce que dit votre patron n'apprend pas.
David Thornley
5
Ne va pas aveuglément contre votre patron. Mon conseil, tel qu'il était écrit, était d'observer les effets du choix du patron. Nous (sur stackexchange) ne pouvons pas porter un jugement de valeur sur la situation car nous manquons d'informations vitales. C'est un cas pour faire un peu de méthode scientifique. L'OP a une hypothèse, le patron l'a contestée. Il est maintenant temps de réaliser l'expérience.
Berin Loritsch
2

Selon la situation spécifique, une variable globale peut être la meilleure solution. Dans la programmation intégrée, les globaux n'occupent pas d'espace de pile et c'est pour cette raison un bon choix.

Globales ou pas, je trouve que c'est une bonne pratique de mettre un préfixe sur les globaux. Cela rendra les autres programmeurs googler votre code conscients de l'impact en cas de désordre.

Max Kielland
la source