Nota: El ejemplo de código está escrito en c #, pero eso no debería importar. He puesto c # como etiqueta porque no puedo encontrar una más apropiada. Esto es sobre la estructura del código.
Estoy leyendo Clean Code y trato de convertirme en un mejor programador.
A menudo me encuentro luchando para seguir el Principio de Responsabilidad Única (las clases y funciones deben hacer solo una cosa), especialmente en funciones. Tal vez mi problema es que "una cosa" no está bien definida, pero aún así ...
Un ejemplo: tengo una lista de Fluffies en una base de datos. No nos importa lo que es un mullido. Quiero una clase para recuperar fluffies. Sin embargo, los fluffies pueden cambiar de acuerdo con alguna lógica. Dependiendo de alguna lógica, esta clase devolverá los datos del caché u obtendrá los últimos datos de la base de datos. Podríamos decir que gestiona fluffies, y eso es una cosa. Para hacerlo simple, digamos que los datos cargados son válidos durante una hora y luego se deben volver a cargar.
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 parece bien. El usuario solicita unos fluffies, nosotros los proporcionamos. Ir a recuperarlos de la base de datos si es necesario, pero eso podría considerarse una parte de obtener los fluffies (por supuesto, eso es algo subjetivo).
NeedsReload()
parece correcto, también. Comprueba si necesitamos recargar los fluffies.
UpdateNextLoad está bien. Actualiza el tiempo para la próxima recarga. eso es definitivamente una sola cosa.
Sin embargo, siento que LoadFluffies()
do no puede ser descrito como una sola cosa. Está obteniendo los datos de la base de datos y está programando la próxima recarga. Es difícil argumentar que calcular el tiempo para la próxima recarga es parte de obtener los datos. Sin embargo, no puedo encontrar una mejor manera de hacerlo (cambiar el nombre de la función a LoadFluffiesAndScheduleNextLoad
puede ser mejor, pero solo hace que el problema sea más obvio).
¿Existe una solución elegante para escribir realmente esta clase de acuerdo con el SRP? ¿Estoy siendo demasiado pedante?
¿O quizás mi clase en realidad no está haciendo una sola cosa?