Nota: O exemplo de código é escrito em c #, mas isso não deve importar. Coloquei c # como uma tag porque não consigo encontrar uma mais apropriada. Isso é sobre a estrutura do código.
Estou lendo o Código Limpo e tentando me tornar um programador melhor.
Muitas vezes me vejo lutando para seguir o Princípio da Responsabilidade Única (classes e funções devem fazer apenas uma coisa), especialmente em funções. Talvez o meu problema seja que "uma coisa" não esteja bem definida, mas ainda assim ...
Um exemplo: eu tenho uma lista de Fluffies em um banco de dados. Não nos importamos com o que é fofo. Eu quero uma aula para recuperar fluffies. No entanto, os fluffies podem mudar de acordo com alguma lógica. Dependendo de alguma lógica, essa classe retornará os dados do cache ou obterá as informações mais recentes do banco de dados. Poderíamos dizer que gerencia fluffies, e isso é uma coisa. Para simplificar, digamos que os dados carregados sejam válidos por uma hora e depois sejam recarregados.
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()
parece-me bem. O usuário pede alguns fluffies, nós os fornecemos. Indo recuperá-los do banco de dados, se necessário, mas isso pode ser considerado parte da obtenção dos fluffies (é claro, isso é um pouco subjetivo).
NeedsReload()
parece certo também. Verifica se precisamos recarregar os fluffies. UpdateNextLoad está bom. Atualiza o horário da próxima recarga. essa é definitivamente uma coisa.
No entanto, sinto que o que LoadFluffies()
fazer não pode ser descrito como uma única coisa. Ele está obtendo os dados do banco de dados e agendando a próxima recarga. É difícil argumentar que calcular o tempo para a próxima recarga faz parte da obtenção dos dados. No entanto, não consigo encontrar uma maneira melhor de fazê-lo (renomear a função LoadFluffiesAndScheduleNextLoad
pode ser melhor, mas isso apenas torna o problema mais óbvio).
Existe uma solução elegante para realmente escrever esta classe de acordo com o SRP? Estou sendo muito pedante?
Ou talvez minha turma não esteja realmente fazendo apenas uma coisa?
DateTime.UtcNow
para evitar trocas de horário de verão ou mesmo uma alteração no fuso horário atual.