2010-03-15 4 views
0

Pour garder les choses simplifiées permet de dire que j'ai une interface RandomProvider InterfaceQuel est le moyen/modèle approprié pour collecter des informations à partir des classes?

public interface RandomProvider 
{ 
    double nextRandom(); 
} 

Et dire que j'ai 3 différentes implémentations de cette interface, ARandom, Brandom, CRandom. Je veux recueillir des statistiques sur les mises en œuvre:

  • combien de fois nextRandom() est appelé
  • somme des nombres aléatoires générés (il peut paraître stupide, mais cela est juste un exemple).

À la fin, ces statistiques seront enregistrées dans DB. Ce sont des classes fortement utilisées à partir de plusieurs threads, il n'est donc pas possible d'écrire les valeurs chaque fois qu'une requête arrive.

La première idée qui me vient à l'esprit est, je fais un singleton qui contient ces données, les implémentations appellent le singleton et augmentent les statistiques nécessaires. Une autre classe lit le singleton et écrit les résultats dans DB et décrémente les statistiques. Mais j'ai lu tant d'articles sur la façon dont les données et les singletons sont mutables à l'échelle mondiale, alors j'ai peur d'aller dans cette direction.

D'autres idées?

Répondre

2

Oui, le singleton peut être une mauvaise idée, mais cela dépend de leur utilisation. Si vous utilisez un singleton juste pour faire fonctionner votre code (en lui permettant de toucher d'autres classes comme un objet central global) alors c'est mauvais. En fin de compte, vous cherchez simplement un moyen de consigner des informations (un enregistreur) et dans ce cas, il n'est pas mauvais d'utiliser un singleton pour consigner ces données ou même pour les enregistrer dans certains fichiers texte/journal.

2

Vous pouvez utiliser AOP pour enregistrer tous les appels de cette méthode particulière. Vérifiez AspectJ. Fondamentalement, vous allez intercepter tous les appels en utilisant un conseil autour et collecter des statistiques et faire vos opérations personnalisées (en additionnant le nombre aléatoire dans ce cas). Ensuite, stockez ceci dans un db.

Questions connexes