2010-04-07 12 views
5

मैं एक ऐसा एप्लीकेशन तैयार कर रहा हूं जो मुझे ग्राफिक पर कुछ फ़ंक्शंस खींचने की अनुमति देगा। प्रत्येक समारोह को अंक के एक सेट से खींचा जाएगा जिसे मैं इस ग्राफिक वर्ग में पास करूंगा।इस तरह से एक वर्ग को डिजाइन करना कि यह "ईश्वर वस्तु" नहीं बनता

विभिन्न प्रकार के अंक हैं, जो सभी को माईपॉइंट क्लास से विरासत में मिला है। कुछ प्रकार के बिंदुओं के लिए यह स्क्रीन पर उन्हें प्रिंट कर देगा, जैसा कि वे हैं, दूसरों को अनदेखा किया जा सकता है, अन्य जोड़े गए हैं, इसलिए उनसे जुड़े कुछ प्रकार के तर्क हैं जो जटिल हो सकते हैं।

ग्राफिक को वास्तव में कैसे आकर्षित करें यहां मुख्य मुद्दा नहीं है। मुझे परेशान करता है कि कोड तर्क कैसे बनाएं ताकि यह ग्राफिकमेकर वर्ग तथाकथित ईश्वर-वस्तु नहीं बन सके।

वह कुछ इस तरह बनाने के लिए आसान होगा:

class GraphicMaker { 
    ArrayList<Point> points = new ArrayList<Point>(); 

    public void AddPoint(Point point) { 
     points.add(point); 
    } 

    public void DoDrawing() { 
     foreach (Point point in points) { 
      if (point is PointA) { 
       //some logic here 
      else if (point is PointXYZ) { 
       //...etc 
      } 
     } 
    } 
} 

कैसे आप कुछ इस तरह करना होगा? मैं एक सही तरीका लग रहा है प्रत्येक प्वाइंट वस्तु पर ड्राइंग तर्क डाल करने के लिए किया जाएगा (ताकि प्वाइंट से प्रत्येक बच्चे वर्ग कैसे खुद को आकर्षित करने के लिए पता होगा), लेकिन दो में समस्या आने पर:

  1. अंक के प्रकार किया जाएगा कि ग्राफिक ऑब्जेक्ट क्लास में मौजूद सभी अन्य बिंदुओं को जानने की आवश्यकता है ताकि वे खुद को आकर्षित कर सकें।
  2. मैं ग्राफ़िक क्लास सार्वजनिक से कई विधियों/गुणों को बना सकता हूं, ताकि सभी बिंदुओं में ग्राफिक वर्ग का संदर्भ हो और वे अपने सभी तर्कों को अपनी इच्छानुसार बना सकें, लेकिन यह एक बड़ी कीमत नहीं है भगवान वर्ग नहीं चाहते हैं के लिए भुगतान करते हैं?

उत्तर

4

के रूप में आप का सुझाव दिया मैं करता हूँ और खुद को ड्राइंग, यह करने के लिए अन्य बिंदुओं की सरणी पारित करने के लिए प्रत्येक बिंदु जिम्मेदार बनाना होगा: अपने GraphicMaker लिए

interface ICanDraw { 
    void Draw(ArrayList<Point> allPoints); 
} 

public abstract class Point : ICanDraw { 
    ... 
} 

public PoniePoint : Point { 
    public void Draw(ArrayList<Point> allPoints) { 
     // do drawing logic here 
    } 
} 

:

public void DoDrawing() { 
    foreach (Point point in points) { 
     point.Draw(points); 
    } 
} 

(मेरे जावा थोड़ी जंगली है, इसलिए 100% वाक्य रचनात्मक रूप से जावा को सही नहीं कर सकता है, लेकिन मुझे लगता है कि यह मेरे सुझाव को व्यक्त करता है)।

+0

आह! मैंने ग्राफिक ऑब्जेक्ट क्लास को पॉइंट्स ड्रा() विधि के लिए तर्क के रूप में अंक की सूची पास करने का विचार नहीं किया था। यह एक बहुत अच्छा विचार प्रतीत होता है। यद्यपि मुझे अभी भी अनिश्चितता है कि ग्राफिक ऑब्जेक्ट क्लास में सभी संभावित रूप से प्रासंगिक गुणों को सार्वजनिक करने के लिए सबसे अच्छा नहीं है, जैसा कि भविष्य में मुझे अपने बिंदु ड्राइंग तर्क की आवश्यकता होगी न केवल सभी बिंदुओं की सूची बल्कि कुछ अन्य चीज़ों की सूची। यदि मैंने संपत्तियों को सार्वजनिक रखने के विरोध में सूची उत्तीर्ण की है, तो मुझे बिंदु के ड्रा() विधियों में नए पैरामीटर जोड़ना होगा। –

+1

यह वास्तव में निर्भर करता है कि ग्राफिक्सऑब्जेक्ट कैसे काम करता है, लेकिन मुझे लगता है कि मैं इसे ड्रा विधि में पास नहीं करूंगा (मैं गलत हो सकता हूं, यह बहुत प्रासंगिक है और मेरे पास पूर्ण संदर्भ नहीं है)।यदि आपको लगता है कि आपको ग्राफिक्स ऑब्जेक्ट प्रदान करने वाली जानकारी के सबसेट की आवश्यकता है, साथ ही सभी अंक, मैं ड्रा विधि को पारित करने के उद्देश्य से पूरी तरह से कक्षा बनाने पर विचार करता हूं जिसमें अंक की एक सूची और ग्राफिक्स ऑब्जेक्ट से अतिरिक्त सामग्री शामिल है जरुरत। यह एकल reposinsibilty और चिंताओं को अलग करता है। हाउवर - यदि ग्राफिक्स ऑब्जेक्ट ड्राइंग से संबंधित है तो इसे पास करें। –

+3

प्रेरणा के लिए मौजूदा सिस्टम पर नज़र डालें। स्विंग में, प्रत्येक घटक का अपना पेंट() होता है जिसे एक ग्रैपिक्स ऑब्जेक्ट पास किया जाता है। कंटेनर/लेआउट/घटक दृष्टिकोण कुछ घटकों को अन्य (निहित) घटकों को प्रभावित करने की अनुमति देता है। हालांकि, मैं प्वाइंट ड्रा के लिए सूची पास नहीं करूँगा। मैं ग्राफिक्स ऑब्जेक्ट में एक क्वेरी जोड़ता हूं जो अन्य बिंदुओं की एक सूची देता है। एक निश्चित प्रकार के साथ बिंदुओं की तरह, कुछ दूरी के भीतर, एक ही रंग, आदि –

3

आप सही हैं कि प्वाइंट के प्रत्येक उप-वर्ग के पास बेस प्वाइंट क्लास में से एक को ओवरराइड करने की अपनी ड्राइंग विधि होनी चाहिए।

ड्राइंग विधि को ग्राफिक्स ऑब्जेक्ट का संदर्भ लेना चाहिए, जिसमें पॉइंट ड्राइंग विधियों में उपयोग की जाने वाली किसी भी चीज़ के लिए सार्वजनिक विधियों/गुणों का होना चाहिए, जिसमें बिंदुओं की सूची शामिल है, यदि उनमें से कुछ चीजों में से एक है ड्राइंग विधियों की जरूरत है।

ग्राफिक्स कक्षा पर सार्वजनिक तरीकों के बारे में आप चिंतित क्यों हैं? एक बार कोड बढ़ने के बाद, कुछ अतिरिक्त दृश्य विधियां एक विशाल विधि से बहुत कम भ्रमित होती हैं जो सबकुछ करती है।

+0

हाँ, मुझे लगता है कि आप सही हैं। कुछ सार्वजनिक गुण/विधियां निश्चित रूप से यहां जाने का तरीका है। –

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