काफी समय से मैं एक आवेदन पर काम कर रहा हूं। चूंकि प्रोग्रामिंग सिर्फ एक शौक है, यह प्रोजेक्ट पहले से ही बहुत लंबा रास्ता ले रहा है, लेकिन यह बिंदु के अलावा है। अब मैं एक बिंदु पर हूं जहां हर "समस्या" हल करने में बहुत मुश्किल हो जाती है। और मैं कोड को दोबारा प्रतिक्रिया देने की सोच रहा हूं, हालांकि इसके परिणामस्वरूप "पूर्ण" पुनर्लेखन होगा।प्रोग्रामिंग प्रतिमान; यह सोचकर कि पुनः लिखना/रीफैक्टरिंग आवश्यक है
मुझे समस्या की व्याख्या करने दें, और मैंने इसे वर्तमान में कैसे हल किया। असल में मेरे पास डेटा है, और मैंने इस डेटा पर चीजों को होने दिया है (अच्छी तरह से मैंने प्रत्येक कार्यक्रम के बारे में बताया है?)। क्या होता है:
डाटा -> पूछता है प्रदर्शित करने के लिए दर्शक -> दर्शक को प्रदर्शित करता है वास्तविक डेटा के आधार पर डेटा दर्शक रिटर्न उपयोगकर्ता इनपुट -> डेटा -> पूछते हैं, "प्रबंधक" यह निष्पादित करने के लिए -> नए डेटा
अब इस बहुत अच्छी तरह से काम करता था, और मैं "क्यूटी द्वारा हे मैं उदाहरण परिवर्तन कमांड प्रॉम्प्ट के लिए हो सकता है, या खिड़कियों - या यहाँ तक कि ले कि बाहरी (सी #) और केवल इस कार्यक्रम कॉल" मूल रूप से सोच रहा था ।
हालांकि कार्यक्रम बढ़ने के साथ ही यह अधिक से अधिक थकाऊ हो गया। सबसे महत्वपूर्ण बात यह है कि आंकड़ों के आधार पर डेटा अलग-अलग शिष्टाचार में प्रदर्शित होता है और इससे भी महत्वपूर्ण बात यह है कि यह कहां स्थित है। तो मैं पेड़ पर वापस गया & अभिभावक रेखा क्या है "ट्रैक" करने के लिए कुछ भी जोड़ा गया। "फिर सामान्य दर्शक सबसे विशिष्ट वास्तविक विजेट की खोज करेगा। इसका उपयोग [स्थान; विजेट] मानों के साथ एक सूची है, और सबसे अच्छा मिलान स्थान पाता है।
नई "डेटा" के लिए अद्यतन करते समय समस्याएं शुरू होती हैं - मुझे सभी संपत्तियों - दर्शक, सेवर इत्यादि के माध्यम से जाना होगा। चेक-मैकेनिज्म को अद्यतन करने से मुझे बहुत सारी त्रुटियां मिलीं .. चीजें जैसे "हे, यह अब गलत विजेट क्यों प्रदर्शित कर रहा है?"
अब मैं इसे पूरी तरह से स्वैप कर सकता हूं। और पेड़ डेटास्ट्रक्चर के बजाय एक सामान्य दर्शक को बुला रहा हूं। मैं ओओ "आंतरिक" वृक्ष क्षमताओं का उपयोग करूंगा। नोड्स बच्चे होंगे (& whe n एक नया दर्शक या सहेजने की आवश्यकता है एक नया बच्चा बनता है)।
यह कठिन जांच तंत्र को हटा देगा, जहां मैं पेड़ में स्थान की जांच करता हूं। हालांकि यह कीड़े का एक और अन्य खुल सकता है। और मुझे इस पर कुछ टिप्पणियां चाहिए? क्या मुझे दर्शक को पूरी तरह से अलग रखना चाहिए - डेटा की जांच में कठिनाई हो रही है? या नया दृष्टिकोण बेहतर है, फिर भी यह एक एकल नोड में डेटा & निष्पादन को जोड़ता है। (तो मैं कहने के लिए CLI/सी # यह लगभग असंभव हो जाता है क्यूटी से परिवर्तन करना चाहते हैं, तो)
क्या विधि मैं अंत में आगे बढ़ाने चाहिए? क्या मैं कुछ और कर सकता हूं? दर्शक को अलग रखने के लिए, फिर भी यह देखने के लिए जांच करने से रोकें कि विजेट किस प्रकार प्रदर्शित होना चाहिए?
संपादित करें, बस कुछ "कोड" दिखाने के लिए और मेरा प्रोग्राम कैसे काम करता है। यकीन नहीं है कि यह कोई अच्छा है जैसा कि मैंने पहले ही कहा था कि यह पद्धतियों के क्लस्टरफक बन गया है।
यह कई "गेममेकर परियोजनाओं" को एक साथ विलय करने के लिए है (जीएम के रूप में: स्टूडियो में उस विशेषता की अजीब कमी है)। गेममेकर प्रोजेक्ट फाइलें बस एक्सएमएल-फाइलों के सेट हैं। (मुख्य एक्सएमएल फ़ाइल केवल अन्य एक्सएमएल फाइलों के लिंक के साथ, और प्रत्येक संसाधन -ोबजेक्ट, स्प्राइट, ध्वनि, कमरा इत्यादि के लिए एक एक्सएमएल फ़ाइल-)।हालांकि कुछ 'quirks' हैं जो बढ़ावा संपत्ति पेड़ या क्यूटी जैसे कुछ के साथ पढ़ने के लिए वास्तव में संभव नहीं है: 1) फ़ाइलों के कुछ हिस्सों में विशेषताओं/बाल नोड्स का आदेश बहुत महत्वपूर्ण है। और 2) सफेद जगह को अक्सर अनदेखा किया जाता है हालांकि अन्य बिंदुओं पर इसे संरक्षित करना बहुत महत्वपूर्ण है।
कहा जा रहा है कि वहां बहुत सारे अंक हैं जहां नोड बिल्कुल वही है .. जैसे पृष्ठभूमि में <width>200</width>
हो सकता है और एक कमरे में भी हो सकता है। फिर भी उपयोगकर्ता के लिए यह काफी महत्वपूर्ण है कि वह किस चौड़ाई के बारे में बात कर रहा है।
, तो "सामान्य दर्शक" (AskGUIFn) निम्नलिखित typedefs इस संभाल करने के लिए है:
typedef int (AskGUIFn::*MemberFn)(const GMProject::pTree& tOut, const GMProject::pTree& tIn, int) const;
typedef std::vector<std::pair<boost::regex, MemberFn> > DisplaySubMap_Ty;
typedef std::map<RESOURCE_TYPES, std::pair<DisplaySubMap_Ty, MemberFn> > DisplayMap_Ty;
कहाँ "GMProject :: pTree" एक पेड़ नोड है, RESOURCE_TYPES में ट्रैक रखने के लिए एक स्थिर है इस समय मैं किस प्रकार का संसाधन हूं (स्प्राइट, ऑब्जेक्ट इत्यादि)। "सदस्यएफएन" यहां कुछ ऐसा होगा जो विजेट लोड करता है। (हालांकि AskGUIFn पाठ्यक्रम का एकमात्र सामान्य दर्शक नहीं है, लेकिन यह केवल तब खोला जाता है जब अन्य "स्वचालित" -प्रोराइट, छोड़ें, नाम बदलें- हैंडलर विफल हो गए हैं)। जब पेड़ आंकड़ा संरचना सामान्य दर्शक यह दर्शक को निष्पादित करता है प्रदर्शित करने के लिए चाहता है बताता है
AskGUIFn::DisplayMap_Ty AskGUIFn::DisplayFunctionMap_INIT() {
DisplayMap_Ty t;
DisplaySubMap_Ty tmp;
tmp.push_back(std::pair<boost::regex, AskGUIFn::MemberFn> (boost::regex("^instances "), &AskGUIFn::ExecuteFn<MW::RoomInstanceDialog>));
tmp.push_back(std::pair<boost::regex, AskGUIFn::MemberFn> (boost::regex("^code $"), &AskGUIFn::ExecuteFn<MW::RoomStringDialog>));
tmp.push_back(std::pair<boost::regex, AskGUIFn::MemberFn> (boost::regex("^(isometric|persistent|showcolour|enableViews|clearViewBackground) $"), &AskGUIFn::ExecuteFn<MW::ResourceBoolDialog>));
//etc etc etc
t[RT_ROOM] = std::pair<DisplaySubMap_Ty, MemberFn> (tmp, &AskGUIFn::ExecuteFn<MW::RoomStdDialog>);
tmp.clear();
//repeat above
t[RT_SPRITE] = std::pair<DisplaySubMap_Ty, MemberFn>(tmp, &AskGUIFn::ExecuteFn<MW::RoomStdDialog>);
//for each resource type.
तब:
अब दिखाने के लिए कि कैसे इन नक्शे प्रारंभ कर रहे हैं (नाम स्थान "मेगावाट" में सब कुछ एक क्यूटी विजेट है) निम्नलिखित समारोह:
AskGUIFn::MemberFn AskGUIFn::FindFirstMatch() const {
auto map_loc(DisplayFunctionMap.find(res_type));
if (map_loc != DisplayFunctionMap.end()) {
std::string stack(CallStackSerialize());
for (auto iter(map_loc->second.first.begin()); iter != map_loc->second.first.end(); ++iter) {
if (boost::regex_search(stack, iter->first)) {
return iter->second;
}
}
return map_loc->second.second;
}
return BackupScreen;
}
और यह वह जगह है जहाँ समस्याओं खुलकर होने के लिए शुरू कर दिया।CallStackSerialize()
फ़ंक्शन कॉल-स्टैक पर निर्भर करता है .. हालांकि कॉल_स्टैक को "हैंडलर" के अंदर संग्रहीत किया जाता है। मैंने इसे वहां संग्रहित किया क्योंकि सबकुछ एक हैंडलर से शुरू होता है। मुझे सच में यकीन नहीं है कि मुझे यह "call_stack" कहां स्टोर करना चाहिए। एक और ऑब्जेक्ट पेश करें जो ट्रैक करता है कि क्या हो रहा है? मैंने उस मार्ग पर जाने की कोशिश की जहां मैं माता-पिता को नोड के साथ ही स्टोर करता हूं। (कॉल-स्टैक की आवश्यकता को रोकना)। हालांकि, साथ ही साथ मैं कामना नहीं करता था: प्रत्येक नोड में केवल एक वेक्टर होता है जिसमें उसके बच्चे नोड होते हैं। इसलिए पॉइंटर्स का उपयोग माता-पिता नोट को इंगित करने के लिए प्रश्न से बाहर है ... (पीएस: शायद मुझे इसे किसी अन्य प्रश्न में सुधारना चाहिए ..)
+1। सवाल पढ़ने के बिना, यह बस अच्छा लग रहा है। – iammilind
क्या आप "[इनर प्लेटफार्म इफेक्ट] (http://en.wikipedia.org/wiki/Inner_platform_effect) से परिचित हैं?" मैं आपकी समस्या को किसी भी निष्कर्ष निकालने के लिए पर्याप्त रूप से समझ नहीं पा रहा हूं (और मुझे निश्चित रूप से आपके आवेदन के बारे में कुछ नहीं पता!) लेकिन यदि आप इस शब्द से परिचित नहीं हैं तो यह थोड़ा सा शोध है। एक सुपर सामान्य उद्देश्य ढांचे के लिए एक बहुत ही जटिल प्रणाली को संशोधित करने के लिए संघर्ष करना इस विशेष एंटीपार्टर्न के लक्षण की तरह लगता है ... – Rook
यह नहीं है कि आपके डेटा नोड्स को एक प्रकार की प्रोफ़ाइल की आवश्यकता होती है जब वे बनाए जाते हैं, प्रोफाइल यह बताता है कि कैसे उपस्थित होने, उन्हें कार्य करने और बचाने के लिए? – armel