Примечание. Пример кода написан на c #, но это не должно иметь значения. Я поставил c # в качестве тега, потому что не могу найти более подходящий. Это о структуре кода.
Я читаю Чистый код и пытаюсь стать лучшим программистом.
Я часто сталкиваюсь с трудностями следования принципу единой ответственности (классы и функции должны выполнять только одно), особенно в функциях. Может быть, моя проблема в том, что «одна вещь» не очень четко определена, но все же ...
Пример: у меня есть список Пушистиков в базе данных. Нам не важно, что такое Пушистик. Я хочу класс, чтобы восстановить пушистики. Тем не менее, пушистые могут меняться в соответствии с некоторой логикой. В зависимости от логики, этот класс будет возвращать данные из кэша или получать последние данные из базы данных. Можно сказать, что он управляет пушистиками, и это одно. Для простоты, скажем, загруженные данные хороши в течение часа, а затем их необходимо перезагрузить.
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()
кажется, хорошо для меня. Пользователь просит несколько пушистиков, мы их предоставляем. Собираюсь восстановить их из БД, если это необходимо, но это можно считать частью получения пушистых копий (конечно, это несколько субъективно).
NeedsReload()
тоже кажется правильным. Проверяет, нужно ли перезагрузить пушистики. UpdateNextLoad в порядке. Обновляет время для следующей перезагрузки. это определенно одна вещь.
Однако я чувствую, что LoadFluffies()
нельзя описать как одну вещь. Он получает данные из базы данных и планирует следующую перезагрузку. Трудно утверждать, что вычисление времени для следующей перезагрузки является частью получения данных. Тем не менее, я не могу найти лучший способ сделать это (переименование функции LoadFluffiesAndScheduleNextLoad
может быть лучше, но это только делает проблему более очевидной).
Есть ли элегантное решение, чтобы действительно написать этот класс в соответствии с SRP? Я слишком педантичен?
Или, может быть, мой класс на самом деле не делает только одну вещь?
DateTime.UtcNow
чтобы избежать перехода на летнее время или даже изменения текущего часового пояса.