बहुरूपता
जब तक आप इसका उपयोग करते हैं getType()
या ऐसा कुछ भी करते हैं, आप बहुरूपता का उपयोग नहीं कर रहे हैं।
मैं समझता हूं कि आपको यह जानना चाहिए कि आपके पास किस प्रकार का है। लेकिन कोई भी कार्य जिसे आप जानना चाहते हैं जबकि उसे वास्तव में कक्षा में नीचे धकेल दिया जाना चाहिए। फिर आप ही बताएं कि इसे कब करना है।
प्रक्रियात्मक कोड की जानकारी मिलती है फिर निर्णय लेता है। ऑब्जेक्ट-ओरिएंटेड कोड वस्तुओं को चीजें करने के लिए कहता है।
- एलेक शार्प
इस सिद्धांत को कहा जाता है, मत पूछो । इसका अनुसरण करने से आपको विवरणों को चारों ओर फैलाने और उन पर कार्य करने वाले तर्क बनाने में मदद नहीं मिलती है। ऐसा करने से एक कक्षा अंदर से बाहर हो जाती है। कक्षा के अंदर उस व्यवहार को रखना बेहतर होता है, ताकि कक्षा बदलने पर यह बदल सके।
encapsulation
आप मुझे बता सकते हैं कि किसी भी अन्य आकृतियों की कभी आवश्यकता नहीं होगी, लेकिन मुझे विश्वास नहीं है कि आपको और न ही आपको चाहिए।
निम्नलिखित एनकैप्सुलेशन का एक अच्छा प्रभाव यह है कि नए प्रकार जोड़ना आसान है क्योंकि उनका विवरण उस कोड में नहीं फैलता है जहां वे दिखाई देते हैं if
और switch
तर्क। नए प्रकार के लिए कोड सभी एक जगह पर होना चाहिए।
एक प्रकार का अज्ञानी टकराव का पता लगाने की प्रणाली
मुझे दिखाते हैं कि मैं कैसे टकराव का पता लगाने वाला सिस्टम डिजाइन करूंगा जो कि प्रदर्शन करने वाला हो और किसी भी 2D आकृति के साथ काम करता हो।
कहते हैं कि आप इसे आकर्षित करने वाले थे। सरल लगता है। यह सभी मंडलियां हैं। यह एक सर्कल वर्ग बनाने के लिए लुभावना है जो टकराव को समझता है। समस्या यह है कि हमें सोचने की एक पंक्ति भेजती है जो 1000 सर्कल की आवश्यकता होने पर अलग हो जाती है।
हमें मंडलियों के बारे में नहीं सोचना चाहिए। हमें पिक्सल के बारे में सोचना चाहिए।
क्या होगा अगर मैंने आपको बताया कि इन लोगों को आकर्षित करने के लिए आप उसी कोड का उपयोग करते हैं, जिसका उपयोग आप यह पता लगाने के लिए कर सकते हैं कि जब वे स्पर्श करते हैं या यहां तक कि उपयोगकर्ता किस पर क्लिक कर रहे हैं।
यहां मैंने प्रत्येक सर्कल को एक अद्वितीय रंग के साथ खींचा है (यदि आपकी आँखें काली रूपरेखा को देखने के लिए पर्याप्त हैं, तो बस उस पर ध्यान न दें)। इसका मतलब है कि इस छिपी हुई छवि के हर पिक्सेल ने इसे आकर्षित किया। एक हैशमैप उस अच्छी तरह से देखभाल करता है। आप वास्तव में इस तरह से बहुरूपता कर सकते हैं।
यह छवि आपको कभी भी उपयोगकर्ता को नहीं दिखानी होगी। आप इसे उसी कोड के साथ बनाते हैं जिसने पहले वाले को आकर्षित किया था। बस अलग-अलग रंगों से।
जब उपयोगकर्ता किसी सर्कल पर क्लिक करता है, तो मुझे पता होता है कि कौन सा सर्कल है क्योंकि केवल एक सर्कल उस रंग का है।
जब मैं किसी दूसरे के ऊपर एक चक्र खींचता हूं तो मैं हर पिक्सेल को जल्दी से पढ़ सकता हूं जो मैं उन्हें एक सेट में डंप करके अधिलेखित करने वाला हूं। जब मैंने सेट किया है तो हर सर्कल से टकरा गया है और अब मुझे केवल एक बार कॉल करना है ताकि टकराव की सूचना दी जा सके।
एक नया प्रकार: आयत
यह सब मंडलियों के साथ किया गया था, लेकिन मैं आपसे पूछता हूं: क्या यह आयतों के साथ कोई भिन्न कार्य करेगा?
कोई भी चक्र ज्ञान का पता लगाने वाली प्रणाली में लीक नहीं हुआ है। यह त्रिज्या, परिधि या केंद्र बिंदु के बारे में परवाह नहीं करता है। यह पिक्सेल और रंग की परवाह करता है।
इस टकराव प्रणाली का एकमात्र हिस्सा जिसे व्यक्तिगत आकृतियों में नीचे धकेलने की आवश्यकता होती है, वह एक अनूठा रंग है। इसके अलावा आकार केवल उनके आकृतियों को आकर्षित करने के बारे में सोच सकते हैं। यह वैसे भी वे अच्छे हैं।
अब जब आप टकराव तर्क लिखते हैं तो आपको परवाह नहीं है कि आपके पास क्या उपप्रकार है। आप इसे टकराने के लिए कहते हैं और यह आपको बताता है कि यह किस आकृति के नीचे मिला है जो इसे खींचने का दिखावा कर रहा है। प्रकार जानने की जरूरत नहीं है। और इसका मतलब है कि आप अन्य वर्गों में कोड को अपडेट किए बिना आप जितने चाहें उतने उप प्रकार जोड़ सकते हैं।
कार्यान्वयन विकल्प
वास्तव में, यह एक अद्वितीय रंग होने की जरूरत नहीं है। यह वास्तविक वस्तु संदर्भ हो सकता है और अप्रत्यक्ष स्तर को बचा सकता है। लेकिन इस जवाब में तैयार होने पर वे उतने अच्छे नहीं दिखेंगे।
यह केवल एक कार्यान्वयन उदाहरण है। वहाँ निश्चित रूप से अन्य हैं। यह दिखाने के लिए क्या था कि आप इन आकार उप-छोरों को अपनी एकल ज़िम्मेदारी के साथ बेहतर तरीके से पूरी प्रणाली में काम करने दें। संभावित रूप से तेज़ और कम मेमोरी सघन समाधान हैं, लेकिन अगर वे मुझे उप-योगों का ज्ञान फैलाने के लिए मजबूर करते हैं तो मुझे प्रदर्शन लाभ के साथ भी उनका उपयोग करने के लिए घृणा होगी। जब तक मुझे स्पष्ट रूप से उनकी आवश्यकता नहीं होगी मैं उनका उपयोग नहीं करूंगा।
दोहरा प्रेषण
अब तक मैंने दोहरे प्रेषण को पूरी तरह से अनदेखा कर दिया है । मैंने ऐसा इसलिए किया क्योंकि मैं कर सकता था। जब तक टकराव वाले तर्क की परवाह नहीं की जाती है, तो दो प्रकार के टकराव की जरूरत नहीं है। यदि आपको इसकी आवश्यकता नहीं है, तो इसका उपयोग न करें। यदि आपको लगता है कि आपको इसकी आवश्यकता हो सकती है, तो जब तक आप यह कर सकते हैं तब तक इससे निपटना चाहिए। इस रवैये को YAGNI कहा जाता है ।
यदि आप तय करते हैं कि आपको वास्तव में विभिन्न प्रकार के टकरावों की आवश्यकता है, तो अपने आप से पूछें कि क्या n आकार के उपप्रकारों को वास्तव में n 2 प्रकार के टकरावों की आवश्यकता है। अब तक मैंने एक और आकार का उपप्रकार जोड़ना आसान बनाने के लिए वास्तव में कड़ी मेहनत की है। मैं इसे दोहरे प्रेषण कार्यान्वयन के साथ खराब नहीं करना चाहता जो कि हलकों को यह जानने के लिए मजबूर करता है कि वर्ग मौजूद हैं।
वैसे भी कितने प्रकार के टकराव हैं? एक छोटी सी अटकलें (एक खतरनाक चीज) लोचदार टकराव (उछालभरी), इनैलास्टिक (चिपचिपा), ऊर्जावान (अन्वेषण), और विनाशकारी (डैमगी) को जोड़ती है। वहाँ अधिक हो सकता है लेकिन अगर यह n 2 से कम है तो हमारे टकरावों को खत्म नहीं होने देता।
इसका मतलब यह है कि जब मेरा टारपीडो किसी ऐसी चीज से टकराता है जो नुकसान को स्वीकार करती है तो उसे पता नहीं चलता है कि यह एक अंतरिक्ष जहाज को मारती है। इसे केवल यह बताना है, "हा हा! आपने नुकसान के 5 अंक लिए।"
नुकसान पहुंचाने वाली चीजें नुकसान संदेशों को नुकसान पहुंचाने वाले संदेश भेजती हैं। इस तरह से आप अन्य आकृतियों को नए आकार के बारे में बताए बिना नए आकार जोड़ सकते हैं। आप केवल नए प्रकार के टकरावों के आसपास फैल रहे हैं।
अंतरिक्ष जहाज वापस टॉर को भेज सकता है "हा हा! आपने नुकसान के 100 अंक ले लिए।" के रूप में अच्छी तरह से "आप अब मेरे पतवार से चिपके हुए हैं"। और टॉरपी वापस भेज सकता है "ठीक है, मैं ऐसा कर रहा हूं ताकि मेरे बारे में भूल जाओ"।
किसी भी बिंदु पर या तो बिल्कुल नहीं पता कि प्रत्येक क्या है। वे बस जानते हैं कि टकराव इंटरफ़ेस के माध्यम से एक दूसरे से कैसे बात करें।
अब यकीन है, डबल प्रेषण आपको चीजों को इससे अधिक अंतर से नियंत्रित करने देता है लेकिन क्या आप वास्तव में ऐसा चाहते हैं ?
यदि आप कम से कम कृपया इस बारे में सोचें कि क्या आकार के टकराव के माध्यम से दोहरी प्रेषण होता है, तो कोई आकृति वास्तविक आकार के कार्यान्वयन पर नहीं। इसके अलावा, टकराव का व्यवहार एक ऐसी चीज है जिस पर आप निर्भरता के रूप में इंजेक्शन लगा सकते हैं और उस निर्भरता को सौंप सकते हैं।
प्रदर्शन
प्रदर्शन हमेशा महत्वपूर्ण होता है। लेकिन इसका मतलब यह नहीं है कि यह हमेशा एक मुद्दा है। टेस्ट प्रदर्शन। सिर्फ अटकलें मत लगाओ। प्रदर्शन के नाम पर बाकी सबकुछ त्यागने से आमतौर पर किसी भी तरह से वेध कोड नहीं होता है।