2010-07-19 10 views
5

मैं सोच रहा हूं कि कोई ऑब्जेक्ट किसी अन्य ऑब्जेक्ट पर एक प्रश्न पूछ रहा है जो परोक्ष रूप से इसे "खराब" डिज़ाइन है। उदाहरण के लिए ...ओओ डिज़ाइन - ऑब्जेक्ट क्लास को प्रश्न पूछता है कि परोक्ष रूप से इसे

आवश्यकताएं: कैरेक्टर (ऑब्जेक्ट) ग्रिड पर चलता है। जब यह किसी अन्य स्थान पर जाने की कोशिश करता है, तो उसे यह पता होना चाहिए कि क्या उस स्थान को पहले से ही उस पर कब्जा कर लिया गया है जो इसे अवरुद्ध करता है, या यदि ग्रिड का वह हिस्सा पूरी तरह से पहुंच योग्य नहीं है। (ध्यान दें कि चरित्र को खुद को जानने की जरूरत है)।

आवेदन में, एक राज्य में एक टाइलमेनर और एक वर्चमान प्रबंधक होता है। टाइलमैनर जानता है कि टाइल्स किस प्रकार पहुंच योग्य हैं और कौन नहीं हैं। Virtermanager पात्रों के टाइल स्थानों को जानता है।

क्या चरित्र के लिए AuthorizeMovement कहें, यह निर्धारित करता है कि यह टाइलमेनगर और कैरेक्टर मैनेजर के माध्यम से आंदोलन संभव है या नहीं, और यदि सच है तो झूठ बोलना संभव है?

क्या यह किसी भी महत्वपूर्ण सिद्धांत का उल्लंघन कर रहा है, जिससे सड़क पर परेशानी हो रही है?

स्पष्ट रूप से यह सामान्यीकृत है और समस्या को समझने के लिए आवश्यक चीज़ों को अलग कर दिया गया है।

उत्तर

1

मुझे कोई समस्या नहीं दिख रही है। अच्छा ओओ डिजाइन कई सिद्धांतों के साथ आता है। लेकिन इसके मूल में आपके पास बड़ा 4 है: Encapsulation, विरासत, पॉलीमोर्फिज्म, और एब्स्ट्रक्शन। इसके अलावा, आप उच्च संयोजन और कम युग्मन चाहते हैं। मतलब है कि आपकी वस्तुएं/कक्षाएं कहीं भी फिट हो सकती हैं और किसी विशेष कार्यान्वयन या कक्षा से बंधी नहीं हैं।

इसके साथ, ऐसा लगता है कि आपने उपर्युक्त आंदोलन और पात्रों को अलग वर्गों में सार तत्वों के रूप में उपयोग किया है। तो आपकी कैरेक्टर क्लास बोर्ड को सीधे संशोधित नहीं कर रही है, जो खराब होने पर खराब होगी।

जैसे ही आप अपनी समस्या की गहरी समझ प्राप्त करते हैं, आप हमेशा अन्य सिद्धांतों का लाभ उठाने के लिए अपने डिजाइन को बेहतर बनाने के लिए कोड को दोबारा प्रतिक्रिया दे सकते हैं।

+0

+1 सहमत है, यह आवश्यक नहीं है। उदाहरण के लिए एक पर्यवेक्षक राज्य-परिवर्तन अधिसूचना के बाद अपने राज्य के लिए मनाई गई वस्तु (जिसमें सभी पर्यवेक्षकों की एक सूची है) पूछता है। अनंत लूप/मृत ताले के लिए बस देखें –

2

मैं सुझाव दूंगा कि यह एक खराब डिजाइन की संभावना है, हां। बोलने के लिए "लाल झंडा", गोलाकार संदर्भ है। आप ने कहा:

... एक वस्तु किसी अन्य वस्तु है कि परोक्ष रूप से यह

रखती है तो, "पकड़" वस्तु "आयोजित" वस्तु के लिए एक संदर्भ है, और भी करने के लिए एक सवाल पूछने "आयोजित" ऑब्जेक्ट को "प्रश्न पूछने" ऑर्डर करने के लिए "होल्डिंग" ऑब्जेक्ट के संदर्भ की आवश्यकता होगी।

यह एक गोलाकार वस्तु निर्भरता ग्राफ बनाता है और अक्सर एक कोड गंध होता है।

ऐसा लगता है कि कुछ अन्य वर्ग में चरित्र और टाइलमेनर और/या कैरेक्टर मैनेजर दोनों के बारे में जानने की ज़िम्मेदारी होनी चाहिए।

+0

वह आसानी से एक कमजोर संदर्भ का उपयोग कर सकता है। आखिरकार, मैं ईमानदारी से संदेह करता हूं कि उसका चरित्र राज्य से स्वतंत्र रूप से काम कर सकता है, इसलिए वास्तव में, यहां एक संदर्भ है। – Puppy

+0

@qstrain जेसन मैकक्रैरी के जवाब पर मेरी टिप्पणी देखें। मैं सामान्य रूप से कोड गंध के बारे में आपसे सहमत हूं लेकिन वैध उपयोग के मामले भी हैं। –

+0

मैं इस धारणा पर सवाल कर रहा हूं कि चरित्र को खुद को स्थानांतरित करने के बारे में कुछ भी पता होना चाहिए। इस परिदृश्य में चरित्र में यह जानने के लिए पर्याप्त जानकारी नहीं है कि यह कहां और कहां स्थानांतरित हो सकता है, जिसका अर्थ यह होगा कि यदि चरित्र स्थानांतरित करने का निर्णय लेता है, या स्थानांतरित करने के लिए कहा जाता है, तो अन्य वस्तुओं को भी अपने राज्य को अपडेट करने की आवश्यकता होती है। यह अत्यधिक जटिल लगता है। स्थिति को उलटा क्यों न करें और चाल प्रदर्शन करने के लिए CharacterManager और/या TileManager को संदेश दें। तब उन वस्तुओं में से एक चरित्र को बता सकता है कि यह कहां है। यह मेरे लिए बहुत अधिक प्राकृतिक लगता है क्योंकि सभी जानकारी एक दिशा में बहती है। –

0

यह किसी भी ओओपी सिद्धांत के खिलाफ नहीं है। कॉल का ब्योरा पूरी तरह से सारित है और आप किसी भी तरह राज्य वस्तु पर निर्भर करते हैं। पृथ्वी पर आप इस कार्य को कैसे लागू करेंगे?

अमूर्त और सिद्धांत उपयोगी उपकरण हैं। लेकिन आपको अपने कोड को अच्छे के रूप में अर्हता प्राप्त करने के लिए उन पर निर्भर नहीं होना चाहिए। प्रत्येक परिदृश्य या प्रत्येक सिद्धांत प्रत्येक परिदृश्य या हर संभव कार्यान्वयन के लिए अच्छा नहीं है। वे दिशानिर्देश हैं, नियम नहीं। यदि आप तुरंत वैकल्पिक कार्यान्वयन नहीं देख पा रहे हैं, तो इसका उपयोग करें और फिर इसे वापस आएं।

संबंधित मुद्दे