Recentemente, realizei uma refatoração de um projeto de tamanho médio em Java para voltar e adicionar testes de unidade. Quando percebi como era chato zombar de singletons e estáticos, finalmente "entendi" o que estava lendo sobre eles esse tempo todo. (Eu sou uma daquelas pessoas que precisa aprender com a experiência. Oh, bem.)
Então, agora que estou usando o Spring para criar os objetos e conectá-los, estou me livrando das static
palavras-chave esquerda e direita. (Se eu pudesse potencialmente zombar, não é realmente estático no mesmo sentido que Math.abs (), certo?) O problema é que eu tinha o hábito de usar static
para denotar que um método não confiava em qualquer estado do objeto. Por exemplo:
//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
public static Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
public Thingy newThingy(InputType input) {
new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
}
}
//called as...
thirdPartyFactoryInstance.newThingy(input);
Então, aqui é onde fica sensível. Gostei da maneira antiga, porque a letra maiúscula me dizia que, assim como Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) fazia a mesma coisa sempre da mesma maneira. Não há estado de objeto para alterar a maneira como o objeto faz o que estou pedindo. Aqui estão algumas respostas possíveis que estou considerando.
- Ninguém mais se sente assim, então há algo errado comigo. Talvez eu realmente não tenha internalizado a maneira OO de fazer as coisas! Talvez eu esteja escrevendo em Java, mas pensando em FORTRAN ou algo assim. (O que seria impressionante, pois nunca escrevi FORTRAN.)
- Talvez eu esteja usando a estática como uma espécie de proxy da imutabilidade para fins de raciocínio sobre código. Dito isto, que pistas devo ter no meu código para alguém aparecer para mantê-lo sabendo o que é stateful e o que não é?
- Talvez isso deva vir de graça se eu escolher boas metáforas de objetos? por exemplo
thingyWrapper
, não parece ter um estado independente do empacotado, oThingy
que pode ser mutável. Da mesma forma,thingyFactory
parece que deve ser imutável, mas pode ter estratégias diferentes que são escolhidas na criação.