Catatan: Sampel kode ditulis dalam c #, tetapi itu tidak masalah. Saya telah menempatkan c # sebagai tag karena saya tidak dapat menemukan yang lebih tepat. Ini tentang struktur kode.
Saya membaca Kode Bersih dan berusaha menjadi programmer yang lebih baik.
Saya sering menemukan diri saya berjuang untuk mengikuti Prinsip Tanggung Jawab Tunggal (kelas dan fungsi harus melakukan hanya satu hal), khususnya dalam fungsi. Mungkin masalah saya adalah "satu hal" tidak didefinisikan dengan baik, tetapi masih ...
Contoh: Saya punya daftar Fluffies di database. Kami tidak peduli apa itu Fluffy. Saya ingin kelas memulihkan bulu. Namun, bulu bisa berubah sesuai dengan beberapa logika. Bergantung pada beberapa logika, kelas ini akan mengembalikan data dari cache atau mendapatkan yang terbaru dari database. Kita dapat mengatakan bahwa ia mengelola bulu, dan itu adalah satu hal. Untuk membuatnya sederhana, katakanlah data yang dimuat baik untuk satu jam, dan kemudian harus dimuat ulang.
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()
sepertinya tidak masalah bagi saya. Pengguna meminta beberapa fluffies, kami menyediakannya. Akan memulihkan mereka dari DB jika diperlukan, tetapi itu bisa dianggap sebagai bagian dari mendapatkan fluffies (tentu saja, itu agak subyektif).
NeedsReload()
sepertinya benar juga. Memeriksa apakah kita perlu memuat ulang fluffies. UpdateNextLoad baik-baik saja. Memperbarui waktu untuk memuat ulang berikutnya. itu pasti satu hal.
Namun, saya merasa apa LoadFluffies()
yang tidak bisa digambarkan sebagai satu hal. Itu mendapatkan data dari Database, dan menjadwalkan memuat ulang berikutnya. Sulit untuk membantah bahwa menghitung waktu untuk memuat ulang berikutnya adalah bagian dari mendapatkan data. Namun, saya tidak dapat menemukan cara yang lebih baik untuk melakukannya (mengubah nama fungsi LoadFluffiesAndScheduleNextLoad
menjadi lebih baik, tetapi itu hanya membuat masalah lebih jelas).
Apakah ada solusi elegan untuk benar-benar menulis kelas ini sesuai dengan SRP? Apakah saya terlalu berlebihan?
Atau mungkin kelas saya tidak hanya melakukan satu hal?
DateTime.UtcNow
agar Anda menghindari pergantian tabungan siang hari, atau bahkan perubahan zona waktu saat ini.