หมายเหตุ:ตัวอย่างโค้ดเขียนด้วย c # แต่นั่นไม่ควรสำคัญ ฉันใส่ c # เป็นแท็กเพราะหาแท็บไม่ได้อีก นี่คือเกี่ยวกับโครงสร้างรหัส
ฉันอ่าน Clean Code และพยายามเป็นโปรแกรมเมอร์ที่ดีขึ้น
ฉันมักจะพบว่าตัวเองกำลังดิ้นรนเพื่อทำตามหลักการความรับผิดชอบเดียว (ชั้นเรียนและฟังก์ชั่นควรทำเพียงสิ่งเดียว) โดยเฉพาะอย่างยิ่งในฟังก์ชั่น บางทีปัญหาของฉันคือ "สิ่งหนึ่ง" ไม่ชัดเจน แต่ก็ยัง ...
ตัวอย่าง: ฉันมีรายการ Fluffies ในฐานข้อมูล เราไม่สนใจว่าปุยคืออะไร ฉันต้องการชั้นเรียนเพื่อกู้คืนความผิดปกติ อย่างไรก็ตาม 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
เพื่อหลีกเลี่ยงการเปลี่ยนการประหยัดเวลากลางวันหรือแม้แต่การเปลี่ยนแปลงในเขตเวลาปัจจุบัน