C# - Variável estática : Code Smell


Hoje veremos por que o uso em excesso de variáveis estáticas pode ser considerado um code smell.

O termo Code Smell (Um código que cheira, fede) é uma palavra técnica usada para descrever a qualidade do código - como um programador escreve este código, sendo também utilizada para descrever o código que você não gosta. Nesse sentido, é sinônimo de feio, sujo, repetido, etc.


 
Um código que cheira é um código ruim mas que nem por isso deixa de funcionar e por isso mesmo ele é difícil de entender e de manter. Abaixo temos alguns motivos que fazem com que um código seja definido como um código que fede:

- Código duplicado
- Métodos muito grandes
- Classes com muitas variáveis ​​de instância
- Classes com muito código

Variável Estática

Uma variável static representa um estado global, portanto, é globalmente acessível. Além disso, ela não é anexada a nenhuma instância de objeto particular sendo acessada com o nome classe e não modifica o estado do objeto. Porém, ela tem várias desvantagens e o uso excessivo deste recurso dá origem a um código que cheira ou code smell.

Desvantagens do uso de variáveis estáticas ou static:

1- São menos aderentes ao paradigma da Orientação a objetos;
2- A vida útil do objeto é muito longa
3- Difícil escrever testes de unidade
4- Dificulta a reutilização de código
5- Não são Thread-Safety
6- São difíceis de serializar

Vejamos agora cada termo com mais detalhes.

1- Menos Orientação a objetos

A variável estática não respeita o encapsulamento porque o objeto não permanece no controle completo de seu estado. Ele mantém uma variável como Global que é conhecida por todos. A variável estática privada também mantém o estado em um nível global, mas restringe o nível de acesso externo.

Ela não segue conceitos como Inversão de Controle, Acoplamento Fraco, Injeção de Dependência, etc.

Portanto, a variável estática é menos aderente aos paradigmas da orientação a objetos.

2- A vida útil do objeto é muito longa

A variáveis estáticas permanecem na memória por muito tempo e sua coleta de lixo é muito difícil.

O uso excessivo de variáveis estáticas pode resultar em estouro de memória. As variáveis estáticas sempre permanecem na memória, estejam ou não sendo usadas.

Os desenvolvedores não têm controle sobre a destruição ou criação de variáveis estáticas.

3- Dificulta a reusabilidade do código

As variáveis estáticas não podem ser substituídas e não podem ser usadas para implementar uma interface.

4- Difícil de escrever testes de unidade

É muito difícil escrever um teste de unidade para as variáveis estáticas. Elas não podem ser mocadas facilmente. A variável estática mantém o estado em todas as instâncias, tornando mais difícil escrever testes de unidade para ela.

Obs: O verbo mocar que significa enganar, atraiçoar ou ainda esconder (popular), mas na área de software mocar objetos ou Mock Objects significa objetos que imitam objetos reais para realização de testes de software.

É muito difícil isolar as mudanças de uma variável estática para um único teste.

5- Variáveis estáticas não são thread-safe.

As variáveis de instância não requerem sincronização de thread, a menos que sejam compartilhadas entre threads.

Mas, as variáveis estáticas são sempre compartilhadas por todos os threads no processo, e, portanto, o acesso à variável estática não é seguro para threads.

6- São difíceis de serializar

É muito difícil serializar variáveis estáticas. Os serializadores serializam instâncias e variáveis estáticas não pertencem a nenhuma instância, portanto, não podem ser serializadas.

Conclusão

Diante do que foi exposto uma boa prática é evitar usar variáveis estáticas visto que elas se comportam como uma variável global.

Em cenários específicos onde o seu uso for extremamente necessário a sua utilização pode até ser considerada mas não podemos abusar do uso desse recurso.

E estamos conversados...

Aquele que crê no Filho (Jesus) tem a vida eterna; mas aquele que não crê no Filho não verá a vida, mas a ira de Deus sobre ele permanece.
João 3:36

Referências:


José Carlos Macoratti