Le titre ne décrit probablement pas très bien mon problème, je serais reconnaissant si quelqu'un pouvait le modifier pour quelque chose de plus approprié. Quoi qu'il en soit:
J'ai un composant censé retourner le prix d'un produit en fonction de son id
. Il implémente une interface comme celle-ci:
interface IProductPriceFetcher
{
double GetPrice(int id);
}
Maintenant, le prix peut être récupéré à partir de 3 sources différentes:
- service web
- directement à partir du code source du site web (scrapping)
- en dernier recours (si le service web et le site web ne sont pas accessibles), le prix le plus récent de la base de données locale est renvoyé
Pour jouer avec cette problématique des 3 sources différentes, j'ai implémenté une classe comme ceci:
class MainFetcher : IProductPriceFetcher
{
public double GetPrice(int id)
{
var priceFetcher = this.factory.GetWebServiceFetcher()
?? this.factory.GetWebsiteFetcher()
?? this.factory.GetLocalDatabaseFetcher();
return priceFetcher.GetPrice(id);
}
}
Chaque méthode de la fabrique retourne bien sûr un IProductPriceFetcher
, avec la note que les deux premières peuvent échouer et retourner null
; j'ai supposé que GetLocalDatabaseFetcher
renverrait toujours un objet significatif cependant.
Mes "interrogations générales..."
En cas de succès de l'appel au service web/site web, je souhaite que le prix récupéré soit inséré dans la base de données locale, comme cas de secours futur. Maintenant ma question est: quelle partie du code ci-dessus devrait être responsable de cela? Devrait-il s'agir de l'un des fetchers web concrets qui retourne le prix? Ou le fetcher "agrégateur" (MainFetcher
), car il a aussi la connaissance de la source du prix? Devrais-je déclencher un événement? Injecter une autre interface avec des appels à la base de données? Changer le design pour être mieux?
Pourquoi est-ce même devenu un problème pour moi? Eh bien, j'ai essayé de garder le code propre (ne vous inquiétez pas, c'est juste un projet personnel pour mon temps libre - exactement pour résoudre des problèmes comme celui-ci) probablement en gardant à l'esprit le SRP/SoC. Maintenant, il semble que j'ai du mal à passer d'un tel état d'esprit - je veux dire, comment quelque chose qui récupère des pages web pourrait-il également insérer des données dans une base de données? Oh, viens on!