नोट: कोड नमूना c # में लिखा गया है, लेकिन इससे कोई फर्क नहीं पड़ता। मैंने एक टैग के रूप में c # डाला है क्योंकि मैं एक और अधिक एप्रीप्रिएट नहीं कर सकता। यह कोड संरचना के बारे में है।
मैं क्लीन कोड पढ़ रहा हूं और एक बेहतर प्रोग्रामर बनने की कोशिश कर रहा हूं।
मैं अक्सर खुद को सिंगल रिस्पांसिबिलिटी प्रिंसिपल (क्लासेस और फ़ंक्शंस केवल एक ही काम करना चाहिए) का पालन करने के लिए संघर्ष करता हूं, विशेष रूप से फ़ंक्शंस में। शायद मेरी समस्या यह है कि "एक बात" अच्छी तरह से परिभाषित नहीं है, लेकिन फिर भी ...
एक उदाहरण: मेरे पास एक डेटाबेस में 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
ताकि आप दिन के उजाले में बचत से बचें, या वर्तमान समय में बदलाव भी कर सकें।