Remarque: l' exemple de code est écrit en c #, mais cela n'a pas d'importance. J'ai mis c # comme balise parce que je ne peux pas en trouver de plus approprié. Il s'agit de la structure du code.
Je lis Clean Code et j'essaie de devenir un meilleur programmeur.
J'ai souvent du mal à suivre le principe de responsabilité unique (les classes et les fonctions ne devraient faire qu'une seule chose), spécialement dans les fonctions. Peut-être que mon problème est qu'une "chose" n'est pas bien définie, mais quand même ...
Un exemple: j'ai une liste de Fluffies dans une base de données. Peu nous importe ce qu'est un Fluffy. Je veux qu'un cours récupère les peluches. Cependant, les peluches peuvent changer selon une logique. Selon une logique, cette classe retournera les données du cache ou obtiendra la dernière de la base de données. On pourrait dire qu'il gère les peluches, et c'est une chose. Pour faire simple, disons que les données chargées sont bonnes pendant une heure, puis elles doivent être rechargées.
class FluffiesManager
{
private Fluffies m_Cache;
private DateTime m_NextReload = DateTime.MinValue;
// ...
public Fluffies GetFluffies()
{
if (NeedsReload())
LoadFluffies();
return m_Cache;
}
private NeedsReload()
{
return (m_NextReload < DateTime.Now);
}
private void LoadFluffies()
{
GetFluffiesFromDb();
UpdateNextLoad();
}
private void UpdateNextLoad()
{
m_NextReload = DatTime.Now + TimeSpan.FromHours(1);
}
// ...
}
GetFluffies()
me semble bien. L'utilisateur demande des peluches, nous les lui fournissons. Aller les récupérer de la base de données si nécessaire, mais cela pourrait être considéré comme une partie de l'obtention des peluches (bien sûr, c'est quelque peu subjectif).
NeedsReload()
semble bien aussi. Vérifie si nous devons recharger les peluches. UpdateNextLoad est très bien. Met à jour l'heure du prochain rechargement. c'est certainement une seule chose.
Cependant, je pense que LoadFluffies()
ce qui ne peut pas être décrit comme une seule chose. Il récupère les données de la base de données et planifie le prochain rechargement. Il est difficile de prétendre que le calcul du temps pour le prochain rechargement fait partie de l'obtention des données. Cependant, je ne peux pas trouver une meilleure façon de le faire (renommer la fonction en LoadFluffiesAndScheduleNextLoad
peut être meilleur, mais cela rend le problème plus évident).
Existe-t-il une solution élégante pour vraiment écrire cette classe selon le SRP? Suis-je trop pédant?
Ou peut-être que ma classe ne fait pas vraiment une seule chose?
DateTime.UtcNow
afin d'éviter les changements d'heure d'été, ou même un changement dans le fuseau horaire actuel.