Bonjour,
Une petite question de conception et d'implémentation sur laquelle je bloque actuellement, et qui je l'espère vous semblera facile à régler.
J'ai une une couche d'accès aux données.
Celle ci est faite par l'implémentation d'une interface contenant, entre autres, deux méthodes:
- getByUniqueId : uniqueId l'identifiant interne.
- getById: id étant l'identifiant externe
Ces deux méthodes permettent donc l'accès aux données. Ensuite disons que deux implémentations sont réalisées:
- cache: on récupère l'objet du cache, si l'objet n'est pas dans le cache, on appelle l'interface suivante, et l'objet récupéré est mis en cache puis retourné
- sql: on réalise la requête SQL et on retourne l'objet.
Pour rendre le code plus simple, l'implémentation SQL fait le raccourcis suivant: getById récupère l'id correspondant au uniqueId puis appelle la méthode getByUniqueId, ce qui est assez simple et propre.
Problème: en faisant de la sorte, on ne fait plus intervenir l'implémentation cache qui accélère l'accès aux données.
Je pense que ma problématique est aussi liée à un mauvais choix architectural du code. Sachant que la signature ne doit pas être changée (donc getById, getByUniqueId doivent être remplis) comment améliorer la situation pour:
- permettre de continuer à chainer ces interfaces
- sans pour autant réaliser des ponts entre les méthodes
Une solution que j'ai trouvé, qui résoud le problème mais ne corrige pas le côté conceptuel:
On voit qu'il est possible de faire en sorte de revenir à la couche la plus haute d'accès aux données, et de repartir en profondeur (avec toutes les implémentations qui s'en suivent, cache, verouillage, etc ...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class SQLAccessLayer implements AccessLayer { private AccessLayer nextLayer; SQLAccessLayer() { nextLayer = this; } public Object getById(String id) { long uniqueId = _getUniqueIdFromId(id); // Avant correction: getByUniqueId(uniqueId) return nextLayer.getByUniqueId(uniqueId); } public Object getByUniqueId(long uniqueId) { return _getMyObject(uniqueId); } }
J'espère que vous pourrez me mettre sur la piste d'une meilleure manière d'architecturer ce code. Merci d'avance !
Partager