Not: Kod örneği c # ile yazılmıştır, ancak bu önemli olmamalıdır. Daha uygun bir tane bulamadığım için etiket olarak c # koydum. Bu kod yapısı ile ilgilidir.
Temiz Kod okuyorum ve daha iyi bir programcı olmaya çalışıyorum.
Kendimi genellikle Tek Sorumluluk Prensibine (sınıflar ve işlevler sadece bir şey yapmalıdır), özellikle işlevlerde takip etmekte zorlanırım. Belki benim sorunum "tek bir şey" iyi tanımlanmış değil, ama yine de ...
Bir örnek: Bir veritabanında Fluffies listesi var. Bir Fluffy'nin ne olduğu umrumda değil. Bir sınıfın tüyleri düzeltmesini istiyorum. Ancak, kabartmalar bazı mantığa göre değişebilir. Bazı mantığa bağlı olarak, bu sınıf verileri önbellekten döndürür veya veritabanından en son verileri alır. Tüyleri yönettiğini söyleyebiliriz ve bu bir şeydir. Basitleştirmek için, yüklenen verilerin bir saat boyunca iyi olduğunu ve daha sonra yeniden yüklenmesi gerektiğini varsayalım.
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()
bana iyi geliyor. Kullanıcı bazı kabarıklıklar ister, biz bunları sağlıyoruz. Gerekirse onları DB'den kurtaracak, ancak bu tüyleri elde etmenin bir parçası olarak düşünülebilir (elbette, bu biraz özneldir).
NeedsReload()
doğru görünüyor. Fluffies'i yeniden yüklememiz gerekip gerekmediğini kontrol eder. UpdateNextLoad iyidir. Bir sonraki yeniden yükleme süresini günceller. bu kesinlikle tek bir şey.
Ancak, neyin LoadFluffies()
tek bir şey olarak tanımlanamayacağını hissediyorum . Veritabanından veri alıyor ve bir sonraki yeniden yüklemeyi planlıyor. Bir sonraki yeniden yükleme için sürenin hesaplanmasının veri almanın bir parçası olduğunu iddia etmek zor. Bununla birlikte, bunu yapmak için daha iyi bir yol bulamıyorum (işlevi yeniden adlandırmak LoadFluffiesAndScheduleNextLoad
daha iyi olabilir, ancak sorunu daha açık hale getirir).
Bu sınıfı gerçekten SRP'ye göre yazmak için zarif bir çözüm var mı? Çok bilgiç miyim?
Ya da belki de sınıfım gerçekten tek bir şey yapmıyor?
DateTime.UtcNow
böylece yaz saati değişiklikleri, hatta geçerli saat diliminde bir değişiklik önlemek için kullanın .