注:コードサンプルはc#で記述されていますが、それは問題ではありません。適切なものを見つけることができないため、c#をタグとして配置しました。これはコード構造についてです。
Clean Codeを読んで、より良いプログラマーになろうとしています。
私はしばしば、単一の責任原則(クラスと関数は1つのことだけを行うべきです)、特に関数に従うことに苦労しています。たぶん私の問題は、「一つのこと」が明確に定義されていないことですが、それでも...
例:データベースにFluffiesのリストがあります。Fluffyが何であるかは気にしません。クラスに綿毛を回復させたい。ただし、綿毛はいくつかのロジックに従って変化する可能性があります。いくつかのロジックに応じて、このクラスはキャッシュからデータを返すか、データベースから最新のデータを取得します。毛羽立ちを管理していると言えますが、それは一つのことです。簡単にするために、ロードされたデータが1時間有効であり、それを再ロードする必要があるとしましょう。
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()
私には大丈夫そうです。ユーザーはいくつかの綿毛を要求し、それらを提供します。必要に応じてDBからそれらを回復しますが、それは綿毛を取得することの一部と考えることができます(もちろん、それはいくらか主観的です)。
NeedsReload()
正しいようです。fluffiesをリロードする必要があるかどうかを確認します。UpdateNextLoadは問題ありません。次のリロードの時間を更新します。それは間違いなく一つのことです。
しかし、私は何LoadFluffies()
が単一のものとして説明することはできないと感じています。データベースからデータを取得し、次のリロードをスケジュールしています。次のリロードの時間を計算することがデータ取得の一部であると主張するのは困難です。しかし、私はそれを行うためのより良い方法を見つけることができません(関数の名前を変更するLoadFluffiesAndScheduleNextLoad
方が良いかもしれませんが、それは問題をより明白にします)。
SRPに従ってこのクラスを実際に作成するエレガントなソリューションはありますか?私はつまらないですか?
それとも、私のクラスが実際に1つのことだけを行っているわけではありませんか?
DateTime.UtcNow
いますが、夏時間の切り替えや現在のタイムゾーンの変更さえも避けるために使用します。