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:
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);
  }
}
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 ...)

J'espère que vous pourrez me mettre sur la piste d'une meilleure manière d'architecturer ce code. Merci d'avance !