Nota: El código de muestra está escrito en C #, pero eso no debería importar. Puse c # como etiqueta porque no puedo encontrar una más adecuada. Esto se trata de la estructura del código.
Estoy leyendo Clean Code e intento convertirme en un mejor programador.
A menudo me encuentro luchando por seguir el Principio de Responsabilidad Única (las clases y las funciones deberían hacer solo una cosa), especialmente en las funciones. Quizás 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 sea un Fluffy. Quiero una clase para recuperar pelusas. Sin embargo, las pelusas pueden cambiar según alguna lógica. Dependiendo de alguna lógica, esta clase devolverá los datos del caché u obtendrá lo último de la base de datos. Podríamos decir que maneja pelusas, y eso es una cosa. Para simplificarlo, supongamos que los datos cargados son válidos durante una hora y luego deben volver a cargarse.
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 algunas pelusas, nosotros se las proporcionamos. Ir a recuperarlos de la base de datos si es necesario, pero eso podría considerarse parte de obtener las esponjosas (por supuesto, eso es algo subjetivo).
NeedsReload()
Parece correcto también. Comprueba si necesitamos recargar las pelusas. UpdateNextLoad está bien. Actualiza el tiempo para la próxima recarga. Eso es definitivamente una sola cosa.
Sin embargo, siento que LoadFluffies()
no se puede describir 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 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 tal vez mi clase no está haciendo solo una cosa?
DateTime.UtcNow
para evitar cambios de horario de verano o incluso un cambio en la zona horaria actual.