2010-01-17 11 views
7

मेरे पास पाइथन/पीईक्यूटी में लिखा गया एक बहुत ही डेटा केंद्रित एप्लिकेशन है। मैं की योजना बना रहा हूं ताकि वास्तव में कोर से UI को अलग करने के लिए कुछ रिफैक्टरिंग कर सकें, मुख्य रूप से क्योंकि अभी तक कोई वास्तविक परीक्षण नहीं है, और स्पष्ट रूप से इसे बदलना है।रिफैक्टरिंग

पहले से ही कुछ अलगाव है, और मुझे लगता है कि मैंने कुछ चीजें सही तरीके से की हैं, लेकिन यह बिल्कुल सही नहीं है। दो उदाहरण के लिए, आप को दिखाने के लिए चीजों को किस तरह मुझे परेशान कर रहे हैं:

  • जब एक डेटा वस्तु का प्रतिनिधित्व पर उपयोगकर्ता को राइट-क्लिक, संदर्भ मेनू पॉप अप होने वाले डेटा वस्तु द्वारा बनाई गई है, हालांकि यह डेटा ऑब्जेक्ट (अनिवार्य रूप से डेटाबेस पंक्ति का ORM प्रतिनिधित्व) स्पष्ट रूप से UI के साथ कुछ भी नहीं करना चाहिए।

  • जब डेटाबेस में कुछ लिखा जाता है, लेकिन लेखन विफल रहता है (उदाहरण के लिए डेटाबेस रिकॉर्ड किसी भिन्न उपयोगकर्ता द्वारा लॉक किया गया है), शास्त्रीय "पुनः प्रयास/निरस्त करें" संदेश बॉक्स उपयोगकर्ता को प्रस्तुत किया जाता है। यह संवाद डेटा प्रदाता * द्वारा बनाया गया है, हालांकि प्रदाता को स्पष्ट रूप से कोई UI कार्यक्षमता नहीं होनी चाहिए। स्पष्ट रूप से, प्रदाता इसके बजाय अपवाद बढ़ा सकता है या अन्यथा विफलता का संकेत दे सकता है, और यूआई पकड़ सकता है और तदनुसार कार्य कर सकता है।

    * यही वह शब्द है जिसका उपयोग मैं उस वस्तु के लिए करता हूं जो मूल रूप से डेटाबेस तालिका का प्रतिनिधित्व करता है और को अपने डेटा ऑब्जेक्ट्स और डेटाबेस इंजन के बीच मध्यस्थ करता है; मुझे यकीन है कि है कि क्या क्या आमतौर पर एक "प्रदाता"

मैं परीक्षण के साथ अनुभव नहीं है कहा जाता है कि नहीं कर रहा हूँ, तो मैं आसानी से नहीं testability समस्याओं या की तरह "लगता है" है, लेकिन इससे पहले कि मैं उसमें प्रवेश करता हूं, कुछ पुनर्गठन करना होता है।

कोई जटिल व्यापार तर्क शामिल (यह मुख्य रूप से बस CRU डी है हाँ, यहाँ तक कि डी के बिना), और इस पुनर्लेखन की तुलना में अधिक पुनर्गठन किया जाएगा है, इसलिए मैं की तरह प्रतिगमन कीड़े को शुरू करने के बारे में वास्तव में चिंतित नहीं हूँ this question में चर्चा की।

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

तो, मेरा प्रश्न: क्या यह टेस्टेबिलिटी और रखरखाव बढ़ाने के लिए एक व्यवहार्य दृष्टिकोण है? कोई अन्य टिप्पणी, विशेष रूप से पाइथन के साथ दिमाग में?

उत्तर

1

मैंने पहले यूआई/बैकएंड अलगाव के उद्देश्य से बड़े विरासत कोड के लिए रिफैक्टरिंग की है। यह मजेदार और पुरस्कृत है।

/प्रशंसा;)

जो भी पैटर्न एक कॉल या यह MVC का हिस्सा बनने के लिए यह एक बहुत ही स्पष्ट एपीआई परत के लिए अमूल्य है। यदि संभव हो तो आप एक प्रेषक के माध्यम से सभी यूआई अनुरोधों को रूट कर सकते हैं जो यूआई < -> तर्क संचार जैसे अधिक नियंत्रण प्रदान करेंगे। कैशिंग को लागू करने, प्रमाणन आदि

कल्पना करने के लिए:

[QT Frontend] 
[CLIs]    <=======> [Dispatcher] <=> [API] <==> [Core/Model] 
[SOAP/XMPRPC/Json] 
[API Test Suite] 

इस तरह

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

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

इस दृष्टिकोण से एक विशिष्ट लाभ आप एपीआई परत और नए UI है के बाद, अब आप विरासत कोड के लिए वापस जाओ और ठीक कर सकते हैं/में यह refactor है शायद छोटे कदम।

अन्य सुझाव आपके परीक्षण सूट तैयार करना है। What are the first tasks for implementing Unit Testing in Brownfield Applications? पर इंटरस्टार की सलाह देखें।

+0

अब यह एक दिलचस्प विचार है, इसे प्यार करो! प्रेषक से संबंधित कोई स्रोत या टिप नहीं है? अर्थात। विभिन्न कार्यान्वयन संभावनाएं, संभावित चेतावनी, अनुभव इत्यादि? – balpha

+0

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

+0

संदर्भ निर्धारित करने और पास करने के लिए भी बहुत महत्वपूर्ण भूमिका निभाई गई थी। – Shekhar

7

यदि आपने पहले से ऐसा नहीं किया है, तो माइकल फेदर द्वारा "विरासत संहिता के साथ प्रभावी ढंग से कार्य करना" पढ़ें - यह वास्तव में इस तरह की स्थिति से संबंधित है, और इससे निपटने के लिए तकनीकों का भरपूर धन प्रदान करता है।

वह एक महत्वपूर्ण बिंदु है जिसे रिफैक्टरिंग से पहले कुछ परीक्षण करने की कोशिश करना है। चूंकि यह यूनिट परीक्षणों के लिए उपयुक्त नहीं है, इसलिए कुछ एंड-टू-एंड परीक्षणों को जगह में लाने का प्रयास करें। मेरा मानना ​​है कि क्यूटी के पास जीयूआई चलाने के लिए अपना स्वयं का परीक्षण ढांचा है, इसलिए ऐसे परीक्षण जोड़ें जो ज्ञात डेटाबेस के खिलाफ जीयूआई में हेरफेर करते हैं और परिणाम की पुष्टि करते हैं। जैसे ही आप कोड साफ़ करते हैं, आप यूनिट परीक्षणों के साथ एंड-टू-एंड परीक्षणों को प्रतिस्थापित या बढ़ा सकते हैं।

+1

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

2

आप अपने सभी आवेदन परीक्षण करने के लिए सभी अन्य भागों से आपके आवेदन के सभी जीयूआई भागों को निकालने के लिए चाहते हैं, आप मॉडल-व्यू-प्रस्तुतकर्ता का उपयोग करना चाहिए: आप कुछ स्पष्टीकरण here और here पा सकते हैं।

इस मॉडल के साथ, आपके आवेदन की आपकी सभी सेवाएं प्रस्तुतियों का उपयोग करती हैं जबकि केवल उपयोगकर्ता सीधे विचारों (जीयूआई भागों) के साथ बातचीत कर सकते हैं। प्रस्तुतकर्ता आवेदन से विचारों का प्रबंधन कर रहे हैं। यदि आप जीयूआई ढांचे को संशोधित करना चाहते हैं तो आपके आवेदन से आपके पास एक जीयूआई हिस्सा स्वतंत्र होगा। केवल एक चीज जिसे आप संशोधित करना होगा प्रस्तुतकर्ता और विचार स्वयं हैं।

आपके द्वारा जीयूआई परीक्षणों के लिए, आपको बस प्रस्तुतकर्ताओं के लिए लिखना होगा। यदि आप जीयूआई उपयोगों का परीक्षण करना चाहते हैं, तो आपको integration tests बनाना होगा।

आशा है कि मदद करता है!

+0

हां, मुझे उस पैटर्न के बारे में पता है और यह कम या ज्यादा मैं जा रहा हूं। असल में, कुछ विस्तार करने के लिए मैंने पहले ही किया है। तो मैं आपका जवाब एक संकेत के रूप में लेता हूं कि मैं सही दिशा ले रहा हूं :-) धन्यवाद – balpha

+0

आपका स्वागत है बाल्फा। मुझे लगता है कि यह आपके ऐप के लिए अधिक टेस्टेबल होने का सबसे अच्छा तरीका है। –

1

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

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

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

+0

आप सही हैं, इसका स्पष्ट रूप से उल्लेख नहीं किया गया है, धन्यवाद। यह "विरासत संहिता के साथ प्रभावी ढंग से कार्य करना" (जो मैंने इस दौरान पढ़ा था) के प्रमुख बिंदुओं में से एक है, और इसके लिए एक दिलचस्प दृष्टिकोण स्टैक ओवरफ़्लो उत्तर में है कि शेखर अपने उत्तर में लिंक करता है। – balpha