2010-05-18 12 views
6

मैं अनुकूलन योग्य जहाजों के साथ एक अंतरिक्ष शूटर गेम विकसित कर रहा हूं। आप रडार चार्ट * की एक जोड़ी के माध्यम से जहाज के किसी भी गुण की ताकत बढ़ा सकते हैं। आंतरिक रूप से, मैं प्रत्येक जहाज को उप-वर्गीकृत SpaceObject वर्ग के रूप में दर्शाता हूं, जिसमें ShipInfo है जो उस जहाज के विभिन्न गुणों का वर्णन करता है।इस समस्या के लिए अच्छा कोड आर्किटेक्चर?

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

मैं सरल और वास्तविक गुणों के बीच परिवर्तन करने के लिए कोड विकसित कर सकता हूं, लेकिन मुझे कुछ सिफारिशें चाहिए कि इस अनुवादक कोड के साथ बातचीत करने के दर्द को कम करने के लिए किस प्रकार की वास्तुकला प्रदान की जाए (यानी 5 के साथ कोई विधि नहीं + तर्क या कुछ अन्य बकवास)। क्या किसी के पास कोई विचार है?

* = वास्तव में अभी तक लागू नहीं किया गया है, लेकिन यह योजना है।

उत्तर

5

बिल्डर पैटर्न के बारे में क्या? आप अपने ShipInfo वर्ग पर एक स्थिर FillDefaults विधि हो सकता था और फिर एक उदाहरण विधि है कि उदाहरण है कि आप के साथ काम कर रहे हैं, इस तरह के माध्यम से रिटर्न ShipInfo से प्रत्येक संपत्ति आवंटित:

ShipInfo.FillDefaults().CalculateSomething(50).AssignName("Testing...").RelativeFiringPower(10).ApplyTo(myShip); 

ShipInfo के भीतर, यह विचार करेंगे कुछ ऐसा:

public static ShipInfo FillDefaults() 
{ 
    ShipInfo newInstance = ...; 
    // Do some default setup here 
    return newInstance; 
} 

public ShipInfo CalculateSomething(int basis) 
{ 
    // Do some calculation 
    // Assign some values internally 
    return this; 
} 

// Keep following this pattern of methods 
public void ApplyTo(SpaceObject obj) 
{ 
    // Some checks here if you want 
    obj.ShipInfo = this; 
} 
+0

मुझे लगता है कि मुझे डिज़ाइन पैटर्न पुस्तक के माध्यम से वापस जाना होगा और वास्तव में इसके माध्यम से फ़्लिप करने के बजाए इसका अध्ययन करना होगा। जब मैं इसे हल करता हूं, तो मैं इस समाधान को पूरी तरह से याद करता हूं और सोचता हूं कि मैं इसे कैसे हल करूंगा, और मुझे लालित्य पसंद है! मैं नियमित आधार पर JQuery का भी उपयोग करता हूं और कनेक्शन नहीं बनाता, और JQuery में सब कुछ बिल्डर पैटर्न का उपयोग करता है ... – Ricket

5

मैं कहूंगा कि फेकाडे पैटर्न उस तरह की समस्या के लिए बिल्कुल सही है। यदि आपके पास अपनी विधियों पर 5+ तर्क हैं, तो उनमें से कम से कम एक नए प्रकार में encapsulating पर विचार करें।

+0

मैं फेकाडे पैटर्न से परिचित नहीं हूं; दिमाग मुझे स्पष्टीकरण की दिशा में इंगित करता है? (विकिपीडिया या स्टैक ओवरफ्लो का एक लिंक भी करेगा) – RCIX

+2

(+1, बीटीडब्ल्यू) हेएच: http://www.google.com/search?q=facade+pattern – ANeves

+0

http://dofactory.com/Patterns/PatternFacade। एएसपीएक्स –

1

ऐसा लगता है कि आप कुछ गुण सेट करना चाहते हैं, लेकिन दूसरों को नहीं, बल्कि महत्व के एक विशेष क्रम में नहीं ताकि आप बढ़ते अधिक तर्कों के साथ ओवरलोड को परिभाषित कर सकें।

आपको लगता है कि अन्य के लिए डिफ़ॉल्ट मान सेट न्यूनतम आवश्यक मूल्यों के साथ एक निर्माता को लागू कर सकता है, और फिर शेष प्रासंगिक मूल्यों को निर्धारित करने object initializer का उपयोग करें:

// Didn't set properties 2 3 and 6, only set the ones needed in this case. 
SpaceObject ship = new SpaceObject(someRequiredValue) { 
    Property1 = 50, 
    Property4 = Game.Settings.Ships.Armor.Strong, 
    Property5 = new PropertySet1{ 
    Prop51 = "Enterprise", 
    Prop53 = true, 
    Prop57 = false 
}; 
+0

खराब नहीं है, हालांकि मुझे नहीं लगता कि यह काम करेगा क्योंकि मेरे पास संपत्ति ब्लॉक ए है जिसे मैं संपत्ति ब्लॉक बी में अनुवाद करना चाहता हूं और मैं अनुवाद के कोड के साथ बातचीत करने के दर्द को कम करने के लिए एक आर्किटेक्चर की तलाश में हूं :) – RCIX

+0

आप संपत्ति ब्लॉक में एक ही सिद्धांत लागू कर सकते हैं। लेकिन बिल्डर पैटर्न जो आप चाहते हैं उसके लिए अच्छा लग रहा है। – ANeves

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