अपनी संज्ञाओं, क्रियाओं, विशेषणों को लिखना एक महान दृष्टिकोण है, लेकिन मैं वर्ग डिजाइन के बारे में सोचना पसंद करता हूं क्योंकि यह सवाल पूछ रहा है कि क्या डेटा छिपाया जाना चाहिए ?
कल्पना कीजिए कि आपके पास एक Query
वस्तु और एक Database
वस्तु थी:
Query
वस्तु आप बनाने में सहायता करते हैं और एक प्रश्न स्टोर करेगा - दुकान, कुंजी यहाँ, के रूप में एक समारोह की सहायता से आप एक बस के रूप में आसानी से बना है। शायद आप रह सकते हैं Query().select('Country').from_table('User').where('Country == "Brazil"')
:। यह बिल्कुल वाक्यविन्यास से कोई फर्क नहीं पड़ता - यह आपका काम है! - कुंजी वह वस्तु है जो आपको कुछ छिपाने में मदद कर रही है , इस मामले में क्वेरी को स्टोर और आउटपुट करने के लिए आवश्यक डेटा। ऑब्जेक्ट की शक्ति इसका उपयोग करने के सिंटैक्स से आती है (इस मामले में कुछ चतुर जंजीर) और यह जानने की आवश्यकता नहीं है कि यह काम करने के लिए क्या स्टोर करता है। यदि सही किया जाता है तो Query
ऑब्जेक्ट एक से अधिक डेटाबेस के लिए क्वेरी को आउटपुट कर सकता है। यह आंतरिक रूप से एक विशिष्ट प्रारूप को संग्रहीत करता है, लेकिन आउटपुट करते समय आसानी से अन्य प्रारूपों में परिवर्तित हो सकता है (पोस्टग्रेज, माईएसक्यूएल, मोंगबीडी)।
अब Database
वस्तु के माध्यम से विचार करते हैं । यह क्या छुपाता है और संग्रहीत करता है? अच्छी तरह से स्पष्ट रूप से यह डेटाबेस की पूरी सामग्री को स्टोर नहीं कर सकता है, क्योंकि यही कारण है कि हमारे पास डेटाबेस है! तो फिर विषय बिंदु क्या है? लक्ष्य यह छिपाना है कि डेटाबेस उन लोगों से कैसे काम करता है जो Database
ऑब्जेक्ट का उपयोग करते हैं । आंतरिक राज्य में हेरफेर करने पर अच्छी कक्षाएं तर्क को सरल बनाएंगी। इस Database
ऑब्जेक्ट के लिए आप यह छिपा सकते हैं कि नेटवर्किंग कॉल कैसे काम करती है, या बैच क्वेरीज़ या अपडेट या कैशिंग लेयर प्रदान करती है।
समस्या यह है कि यह Database
बहुत बड़ा है। यह दर्शाता है कि डेटाबेस का उपयोग कैसे किया जाता है, इसलिए कवर के तहत यह कुछ भी और सब कुछ कर सकता है। स्पष्ट रूप से नेटवर्किंग, कैशिंग, और बैचिंग आपके सिस्टम के आधार पर निपटने के लिए काफी कठिन हैं, इसलिए उन्हें छुपाना बहुत मददगार होगा। लेकिन, जैसा कि बहुत से लोग ध्यान देंगे, एक डेटाबेस पागलपन से जटिल है, और कच्चे डीबी कॉल से आगे आपको मिलता है, यह कठिन है कि प्रदर्शन के लिए ट्यून करें और समझें कि चीजें कैसे काम करती हैं।
यह ओओपी का मौलिक व्यापार है। यदि आप सही अमूर्त उठाते हैं, तो यह कोडिंग को सरल बनाता है (स्ट्रिंग, एरे, डिक्शनरी), यदि आप एक एब्सट्रैक्शन उठाते हैं जो बहुत बड़ा है (डेटाबेस, ईमेल मैनजर, नेटवर्किंग मैन), तो यह वास्तव में समझने के लिए बहुत जटिल हो सकता है कि यह काम करता है, या क्या करना है उम्मीद करते हैं। लक्ष्य जटिलता को छिपाना है , लेकिन कुछ जटिलता आवश्यक है। अंगूठे का एक अच्छा नियम Manager
वस्तुओं से बचने के लिए शुरू करना है, और इसके बजाय ऐसी कक्षाएं बनाएं जो इस तरह हैं structs
- वे सभी डेटा पकड़ते हैं, कुछ सहायक विधियों के साथ आपके जीवन को आसान बनाने के लिए डेटा बनाने / हेरफेर करने के लिए। उदाहरण के लिए, EmailManager
एक फ़ंक्शन के साथ शुरुआत के मामले में कहा जाता है sendEmail
जो एक Email
वस्तु लेता है। यह एक सरल प्रारंभिक बिंदु है और कोड को समझना बहुत आसान है।
अपने उदाहरण के लिए, इस बारे में सोचें कि आप जो खोज रहे हैं उसकी गणना करने के लिए किन डेटा की आवश्यकता है। यदि आप जानना चाहते हैं कि कोई जानवर कितनी दूर तक चल रहा था, उदाहरण के लिए, आपके पास ( AnimalStep
और AnimalTrip
एनिमस्टेप्स का संग्रह) कक्षाएं हो सकती हैं। अब जब प्रत्येक Trip के पास सभी चरण डेटा हैं, तो उसे इसके बारे में सामान का पता लगाने में सक्षम होना चाहिए, शायद AnimalTrip.calculateDistance()
समझ में आता है।