注意:代码示例是用c#编写的,但这无关紧要。我将c#用作标签,因为找不到更合适的标签。这是关于代码结构的。
我正在阅读Clean Code,并试图成为一个更好的程序员。
我经常发现自己难以遵循“单一责任原则”(类和功能只能做一件事),尤其是在功能方面。也许我的问题是“一件事”的定义不明确,但仍然...
一个例子:我在数据库中有一个Fluffies列表。我们不在乎什么是蓬松。我想上课恢复蓬松。但是,蓬松可以根据某些逻辑进行更改。根据某些逻辑,此类将从缓存中返回数据或从数据库中获取最新数据。我们可以说它管理蓬松,这是一回事。为了简单起见,假设加载的数据可以使用一个小时,然后必须重新加载。
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
可以避免使用夏令时转换,甚至避免当前时区的更改。