मैं पायथन में एक गेम लिख रहा हूं और मैं अपने कोड को फिर से डिजाइन करने के बारे में कुछ सलाह ढूंढ रहा हूं। गेम इकाई के लिए आंदोलन घटक की परिभाषा नीचे दी गई है।

लोड फ़ंक्शन एक प्रॉपर्टी ट्री ऑब्जेक्ट लेता है और तदनुसार self की विशेषताओं को सेट करता है। सेव फ़ंक्शन इसके विपरीत करता है: self की विशेषताओं के आधार पर, एक प्रॉपर्टी ट्री उत्पन्न होती है और वापस आती है।

class Movement(EntityComponent):
    def __init__(self):
        # Default values
        self.speed = 0
        self.acceleration = 0

    def load(self, properties):
        self.speed = int(properties['Speed'])
        self.acceleration = int(properties['Acceleration'])

    def save(self):
        pt = PropertyTree()
        pt['Speed'] = str(self.speed)
        pt['Acceleration'] = str(self.acceleration)
        return pt

कोड के साथ समस्या यह है कि बहुत सारी सूचनाओं का दोहराव चल रहा है। सबसे पहले, मैं प्रॉपर्टीट्री में कुंजियों को self की विशेषताओं के साथ संबद्ध करने वाली जानकारी की नकल करता हूं, और मैं स्वयं कुंजियों की नकल भी करता हूं ('Speed' और 'Acceleration' तार दो बार दिखाई देते हैं)। जाहिर है, गलतियों के लिए बहुत जगह है।

मैं इसे कैसे दोबारा कर सकता हूं?

1
Paul Manta 10 सितंबर 2011, 23:38
जबकि डीआरवाई सिद्धांत रूप में अच्छा है, दो बार कुछ दोहराने का मतलब यह नहीं है कि आपको 20 लाइन सामान्यीकृत समाधान लिखना चाहिए जो अभी भी आपके वास्तविक कोड में केवल एक पंक्ति को बचाता है।
 – 
user395760
10 सितंबर 2011, 23:45
1
@ डेलनान, अच्छा बिंदु। हालांकि, मुझे संदेह है कि उसके पास शायद बहुत सारी कक्षाएं हैं जो इसे सामान्यीकृत समाधान को सहायक बनाती हैं।
 – 
Winston Ewert
10 सितंबर 2011, 23:50

1 उत्तर

सबसे बढ़िया उत्तर

शुरुआती बिंदु के रूप में:

class Movement(EntityComponent):
    def __init__(self):
        # Default values
        self.speed = 0
        self.acceleration = 0

    serializable_fields = [
        ('speed', int),
        ('acceleration', int)
    ]

def load(object, source):
    for name, field_type in object.serialiable_fields: 
        settarr(object, name, field_type(source[name]))

def save(object):
    target = PropertyTree()
    for name, field_type in object.serializable_fields:
         target[name] = str(getattr(object, name))
    return target

मूल रूप से, एक अलग सेव/लोड सिस्टम बनाएं, शायद EntityComponent वर्ग में। सिस्टम को वर्तमान ऑब्जेक्ट को क्रमबद्ध करने का तरीका बताने के लिए फ़ील्ड के लिए डेटा की सूची प्रदान करें।

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

1
Winston Ewert 11 सितंबर 2011, 01:26
1
आप डिफ़ॉल्ट को भी स्टोर कर सकते हैं: ('speed', int, 0)
 – 
Karoly Horvath
10 सितंबर 2011, 23:48
1
और निश्चित रूप से आप लक्ष्य को सेव विधि में वापस करना चाहते थे।
 – 
Paul Hildebrandt
11 सितंबर 2011, 00:11
यह देखते हुए कि आपके प्रॉपर्टीट्री के लिए आपके पास अलग-अलग मामले हैं (शायद ये उपयोगकर्ता-सामना करने वाले नाम हैं?), आप इसे अपने serializable_fields tuples में भी शामिल करना चाहेंगे।
 – 
Alec Munro
11 सितंबर 2011, 00:27
धन्यवाद, मैं एक अलग दृष्टिकोण के लिए गया था, लेकिन आप जवाब ने मुझे प्रेरित किया। मैंने एक अनुवर्ती प्रश्न पोस्ट किया: stackoverflow.com/questions/7374995
 – 
Paul Manta
11 सितंबर 2011, 02:08