O que dizer ao seu chefe se eles querem que você use uma variável global

13

Atualmente, estou com 4 meses de estágio e, ao revisar meu código, meu chefe não gostou de ter mantido um objeto específico local para vários métodos em algumas classes separadas em uma assemblagem. Ele não gostou que eu fosse criado um novo objeto a cada vez e, em vez disso, me disse para criar um único objeto que pode ser acessado de qualquer lugar. Portanto, tive que criá-lo como um objeto estático dentro de uma classe estática e simplesmente referenciá-lo a partir daqui, quero usá-lo!

Como você lidaria com isso, como eu só tenho programado profissionalmente por 4 meses!

Darren Young
fonte
4
O seu chefe é uma pessoa técnica ou não técnica? Se ele é técnico, ele leu "Código Limpo", de Robert C. Martin?
George Stocker
5
Então, seu chefe contratou você para codificar e agora está dizendo como codificar?
perfil completo de Jeremy Heiler
8
Você disse em um comentário abaixo que "o objeto não possui nenhum estado, exceto muitas constantes". Nesse caso, uma classe estática parece ser uma boa solução para mim.
Justin Justin
5
"Yes Boss" vem à mente ...
2
"me disse para criar um único objeto que pode ser acessado de qualquer lugar. Portanto, tive que criá-lo como um objeto estático" Este raciocínio não é válido. Você fala como se ter um único objeto acessível a partir de um aplicativo inteiro implicasse que você tinha um Singleton - por que você não o cria na raiz de agregação e depois passa sua referência às classes dependentes?
devorado elysium

Respostas:

33

Se um objeto é suficiente, criar um objeto toda vez é um desperdício, e aqui seu chefe pode estar certo.

O problema é o acesso adequado a esse objeto. Um método de fábrica com visibilidade adequada que sempre retorna esse objeto estático é a primeira solução que vem à mente. Outros certamente existem.

9000
fonte
3
+1: por mais que eu não goste de nenhuma resposta "o GoF disse que sim", certo está certo.
Javier
1
Pensei nos Singletons, mas apenas o vi como um invólucro em torno de uma variável global, por isso não o acompanhei. Vou tentar agora, já que o objeto não possui nenhum estado, além de muitas constantes, então tudo bem. Obrigado.
Darren Young
9
Suspeitei que esse poderia ser o caso ("o objeto não possui nenhum estado ... muitas constantes"). Seu chefe está certo. Não há sentido em pressionar artificialmente o coletor de lixo por valores que nunca mudam.
Berin Loritsch 19/01
3
@ Darren-young: em uma nota lateral, não ter estado é interessante e permite algumas abordagens poderosas; dê uma olhada na chamada 'programação funcional' se você ainda não o fez.
9000
8

Não posso comentar seu caso específico, mas usar variáveis ​​globais às vezes é uma boa solução. A classe System do Java está cheia de variáveis ​​globais estáticas.

Mas, em geral, se você pensa que está certo e que seu chefe está errado, por que não pede que ele explique por que ele acha que uma variável global é uma solução melhor? Um simples "eu não gosto" é tão vago quanto "variáveis ​​globais são más". Você deve exigir mais do seu chefe!

Se ele não pode dar motivos para sua posição e você pode dar motivos para sua posição, ou vice-versa, é uma boa oportunidade de aprendizado. Se vocês dois podem justificar suas posições, provavelmente é uma questão de gosto - ou questão de experiência: seu chefe deve estar programando profissionalmente há mais de quatro meses, eu acho?

Joonas Pulakka
fonte
1
Veja, java.lang.Systemcontém exatamente três variáveis ​​globais e, para cada uma delas, existe um método para configurá-lo corretamente. Mas Systemestá cheio de métodos estáticos que retornam objetos globais, e não há exatamente nada de errado nisso, não se pode argumentar.
9000
2
Sim; Considero variáveis ​​globais praticamente iguais aos métodos estáticos que retornam objetos globais.
Joonas Pulakka
Então, Java faz isso. É uma questão totalmente diferente de saber se é uma boa ideia. O gerador de números aleatórios padrão de C mantém o estado global. Mas geralmente é reconhecido que isso é horrível e que o gerador de números aleatórios é, portanto, inutilizável em certas aplicações (veja Bentley et al., Engineering a function of sort function ). O Java, em particular, tem uma série de problemas de design (que foram parcialmente aprimorados em C #), por isso não tenho muito cuidado em usá-lo como argumento como este.
Konrad Rudolph
@ Konrald Rudolph: No final, é uma decisão de design. Toda decisão tem prós e contras. Por exemplo, manter o estado global Systemsimplifica, digamos, 99,9% dos casos de uso ao custo de causar problemas nos 0,1% restantes. Não existe uma resposta "certa" para saber se 0,1% vale ou não a complexidade extra.
Joonas Pulakka
5

Como alguém em sua posição, o máximo que você pode fazer é aprender. Se o objeto é essencialmente uma constante (ou seja, não pode mudar e não mantém o estado), seu chefe pode estar certo. Não há mal nenhum em ter um objeto constante estático. Afinal, quantas definições de PI existem?

Algumas pessoas defendem a mentalidade de "nenhum objeto global" ao ponto de ferver religioso. Isso ocorre por um de dois motivos: eles têm sido difíceis de rastrear bugs ou fragilidade do sistema devido ao uso excessivo de variáveis ​​/ objetos globais, ou ouviram dizer que é ruim e não conseguem pensar por si mesmos. Pessoalmente, eu pertenço ao grupo de pessoas que foram duramente atingidas pela fragilidade e difíceis de rastrear bugs - mas também aprendi um pouco de equilíbrio aqui.

Se eu estivesse no seu lugar, eu faria o que o chefe disser - afinal, é o alvo dele na linha. Então eu assistia e via os efeitos dessa escolha ao longo do tempo. Esta é uma ferramenta de aprendizado eficaz.

Berin Loritsch
fonte
É um estágio. Você deveria estar aprendendo. Cegamente, o que seu chefe diz não está aprendendo.
David Thornley
5
Nem vai cegamente contra seu chefe. Meu conselho, como foi escrito, era observar os efeitos da escolha do chefe. Nós (na stackexchange) não podemos julgar a situação porque estamos perdendo informações vitais. Este é um caso para fazer um pouco de método científico. O OP tem uma hipótese, o chefe a desafiou. Agora é hora de realizar o experimento.
Berin Loritsch 19/01
2

Dependendo da situação específica, uma variável global pode ser a melhor solução. Na programação incorporada, os globais não estão ocupando espaço na pilha e, por esse motivo, é uma boa escolha.

Globais ou não, achei uma boa prática colocar um prefixo nos globais. Isso fará com que outros programadores pesquisem seu código no Google sobre o impacto se eles mexerem com ele.

Max Kielland
fonte