Je développais une classe simple, appelée Simulator
, qui applique une liste de Simulation
à une entrée donnée. Pour chaque entrée, les simulations peuvent produire une sortie ou non, en fonction de certaines conditions que l'entrée doit remplir pour chaque simulation. Le résultat produit par le Simulator
est une liste de sortie.Clavier d'informations et style de codage de programmation fonctionnelle
Voici le code.
class Simulator {
final List<Simulation> simulations;
// Some initialization code...
List<Ouput> execute(Input input) {
return simulations
.stream()
.filter(s -> s.processable(input))
.map(s -> s.prepareOutput(input))
.collect(Collectors.toList());
}
}
Comme vous pouvez le voir, d'abord, je vérifie si une entrée est traitable par un Simulation
, filtrage des simulations pour lesquelles il n'est pas, et l'application de ces simulations à l'entrée. D'un point de vue orienté objet, j'expose des classes internes de Simulation
. L'opération de vérification effectuée par la méthode processable
doit être masquée dans la méthode prepareOutput
.
Cependant, ayant processable
visible à Simulator
, je peux appliquer une approche plus fonctionnelle, ce qui est très pratique.
Quelle approche est la meilleure? Y a-t-il d'autres solutions qui me manquent?
Si vous pensez que vous exposer des internes, alors pourquoi le faites-vous alors? Quelques autres questions à se poser: Que se passe-t-il si j'appelle l'une de vos simulations avec 'someSimulation.prepareOutput (null)'? Est-ce que c'est même possible? Ou que se passe-t-il si j'appelle 'prepareOutput' avec un paramètre d'entrée qui n'est pas traitable par une simulation donnée? Ai-je besoin de savoir ou de vérifier sa capacité de traitement de l'extérieur? Est-ce qu'il retourne «null» ou lance-t-il une exception? Est-ce que 'Optional 'est une option? – Roland