J'ai récemment entrepris une refactorisation d'un projet de taille moyenne en Java pour revenir en arrière et ajouter des tests unitaires. Quand j'ai réalisé à quel point c'était pénible de se moquer des singletons et de la statique, j'ai finalement «compris» ce que j'avais lu à leur sujet tout ce temps. (Je fais partie de ces personnes qui ont besoin d'apprendre de leur expérience. Oh bien.)
Donc, maintenant que j'utilise Spring pour créer les objets et les câbler, je me débarrasse des static
mots clés à gauche et à droite. (Si je pouvais potentiellement m'en moquer, ce n'est pas vraiment statique dans le même sens que Math.abs (), n'est-ce pas?) Le fait est que j'avais pris l'habitude d'utiliser static
pour indiquer qu'une méthode ne reposait pas sur n'importe quel état d'objet. Par exemple:
//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);
Alors, c'est là que ça devient délicat. J'ai aimé l'ancienne façon parce que la lettre majuscule m'a dit que, tout comme Math.sin (x), ThirdPartyLibraryWrapper.newThingy (x) faisait la même chose de la même manière à chaque fois. Il n'y a aucun état d'objet pour changer la façon dont l'objet fait ce que je lui demande de faire. Voici quelques réponses possibles que j'envisage.
- Personne d'autre ne ressent cela, alors il y a quelque chose qui ne va pas chez moi. Peut-être que je n'ai pas vraiment intériorisé la façon OO de faire les choses! Peut-être que j'écris en Java mais que je pense en FORTRAN ou quelque chose comme ça. (Ce qui serait impressionnant puisque je n'ai jamais écrit FORTRAN.)
- J'utilise peut-être la statique comme une sorte de proxy pour l'immuabilité à des fins de raisonnement sur le code. Cela étant dit, quels indices devrais- je avoir dans mon code pour que quelqu'un vienne le maintenir afin de savoir ce qui est et ce qui ne l'est pas?
- Peut-être que cela devrait venir gratuitement si je choisis de bonnes métaphores d'objet? eg
thingyWrapper
ne sonne pas comme s'il avait un état indépendant de l'enveloppéThingy
qui peut lui-même être mutable. De même, unthingyFactory
son comme il devrait être immuable mais pourrait avoir différentes stratégies qui sont choisies parmi à la création.