2009-03-26 17 views
6

डेल्फी में मृत कोड ढूंढना आमतौर पर वास्तविक सरल होता है: बस संकलित करें और फिर अपने नीले बिंदुओं को याद करने वाले दिनचर्या के लिए स्कैन करें। स्मार्ट लिंकर उन्हें ट्रैक करने के बारे में बहुत अच्छा है, ज्यादातर समय।क्या डेल्फी में अप्रयुक्त ईवेंट हैंडलर का पता लगाने का कोई तरीका है?

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

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

+1

वास्तव में, आरटीटीआई के माध्यम से लोडिंग वास्तविक अभ्यास में हर समय होती है। हर बार जब आप एक डीएफएम संसाधन लोड करते हैं, तो आप आरटीटीआई के साथ नाम से विधि पते लाते हैं। यही कारण है कि ईवेंट हैंडलर ने पहली जगह में दृश्यता प्रकाशित की है। लिंकर डीएफएम सामग्री की व्याख्या नहीं करता है; न ही संकलक करता है। –

+0

मुझे इसके बारे में सब कुछ पता है। कृपया pedantic मत बनो। मेरा मतलब था कि आपके कोड में कहीं और से आरटीटीआई के माध्यम से संदर्भित किया गया था। (इसे दूसरे शब्दों में मैन्युअल रूप से करना।) और * वह * बहुत ही कम होता है, जब तक कि आप किसी प्रकार की आरपीसी तकनीक नहीं कर रहे हों। –

उत्तर

2

मुझे नहीं लगता कि यह एक स्वचालित बिंदु से संभव है। किसी ऑब्जेक्ट के अंदर कोई विशेष ईवेंट होने पर ईवेंट हैंडलर सक्रिय होते हैं। यह भी दिया गया रन में ट्रिगर नहीं किया गया है इसका मतलब यह नहीं है कि इसका नेतृत्व करने के लिए कोई निष्पादन मार्ग नहीं है।

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

उदा।

बटन.ऑनक्लिक: = DefaultClickHandler;

बटन.ऑनक्लिक: = स्पेशलक्लिक हैंडलर;

मानते हैं कि क्लिक हैंडलर ऑनक्लिक ईवेंट हस्ताक्षर से मेल खाते हैं, लेकिन हस्ताक्षर गलत होने पर आपको संकलन नहीं मिलेगा। विधि हस्ताक्षर और तुलना कि .dfm में उन लोगों (करने के तरीकों के बारे में उनकी सुनिश्चित करें कि आप बनाना:


हालांकि, आप शायद सभी तरीकों कि लगता है एक (TObject प्रेषक) की तलाश द्वारा सभी को छोड़ दिया संचालकों पा सकते हैं यदि आप डेल्फी के पुराने संस्करण के साथ काम कर रहे हैं तो इसे पाठ के रूप में सहेजें), स्वचालित रूप से वायर्ड नहीं होने वाली चींटी को मेरी पुस्तक में संदेह होगा।

-

अगर आप न नीचे cygwin पथ जाना चाहते हैं, आप src और दो TStirngLists में DFM लोड और नाम बाहर चीर/प्रत्येक से idents और लूप के एक जोड़े के साथ एक सूची उत्पन्न कर सकते हैं और कुछ स्ट्रिंग मैनिप्लेशंस। मेरा अनुमान है कि आप जिस चीज के साथ रह सकते हैं उसे प्राप्त करने के लिए लगभग 20 मिनट का काम है।

+0

धन्यवाद, लेकिन जैसा कि मैंने मार्कसक से कहा था, मैं यहां सबसे आम मामला देख रहा हूं, अपवाद नहीं। मुझे अच्छी तरह से पता है कि सभी मृत-कोड ईवेंट हैंडलर को हर मामले में कोई झूठी सकारात्मक न होने का कोई मूर्ख तरीका नहीं है। इसका मतलब यह नहीं है कि आपकी खोज को कम करने में स्वचालन का थोड़ा सा उपयोगी नहीं हो सकता है। –

+0

मेरे संशोधित नोट को देखें – MikeJ

2

कोई समाधान नहीं है जो सबसे सामान्य मामले में सही उत्तर देने के लिए गारंटी देता है (जैसा कि आप नोट करते हैं, आरटीटीआई के माध्यम से उन्हें कॉल करने की संभावना पर)।

एक समाधान कोड कवरेज परीक्षण करना होगा और उन हैंडलरों पर ध्यान से देखें जो कभी नहीं पहुंचे थे।

+0

मैं "सबसे सामान्य मामला" नहीं ढूंढ रहा हूं; मैं सबसे आम मामले की तलाश में हूं: डीएफएम में संदर्भित हैंडलर के खिलाफ पीएएस फ़ाइल में फॉर्म घोषणा के शीर्ष खंड में घोषित ईवेंट हैंडलर की सूची की जांच करें, और किसी अनाथ की रिपोर्ट करें। –

6

इसमें कुछ समय बदसूरत है (ठीक है, यह एक बहुत बदसूरत है), लेकिन एक इकाई के लिए यह सरल करने के लिए करीब है, और कोई अतिरिक्त उपकरणों की आवश्यकता:

  1. सुनिश्चित करें कि के वर्तमान संस्करण प्रपत्र स्रोत नियंत्रण में चेक किया गया है!
  2. कक्षा के इंटरफ़ेस के शीर्ष पर जाएं जहां ईवेंट हैंडलर हैं। सभी ईवेंट हैंडलर विधि इंटरफेस हटाएं।
  3. कोड एक्सप्लोरर/त्रुटि अंतर्दृष्टि देखें। जिन तरीकों में कार्यान्वयन हैं लेकिन कोई इंटरफेस हाइलाइट नहीं किया जाएगा। कार्यान्वयन हटाएं।
  4. अब इकाई को सहेजें। डेल्फी एक समय में, हर घटना के लिए लापता घटना हैंडलर के बारे में शिकायत करता है जो वास्तव में संभाला जाता है। त्रुटियों के रूप में इन्हें नीचे लिखें।
  5. फॉर्म के मूल संस्करण को देखें, और अपनी सूची में मौजूद किसी भी चीज़ के लिए ईवेंट हैंडलर को हटा दें।
+0

मैं संकलित करने के लिए एक और कदम जोड़ूंगा और देख सकता हूं कि यह किसके बारे में शिकायत करता है क्योंकि उन्हें कोड के माध्यम से बुलाया जाता है। –

+0

रिफैक्टर विधि का उपयोग करने से बेहतर कैसे है? यह कोड में और dfm में सभी संदर्भों को एक बार में प्राप्त करता है ... –

+0

मुझे रीफैक्टरिंग से अधिक आसानी मिलती है, लेकिन यह व्यक्तिगत पसंद का मामला है, मुझे लगता है। इसे संभालने के उचित तरीके के लिए –

2

मुझे ऐसा करने के लिए एक पूर्ववर्ती ऐप या प्लगइन से अवगत नहीं है, लेकिन इसे स्क्रिप्ट करना मुश्किल नहीं होना चाहिए।

आप यह मानते हुए RTTI उपयोग कर रहे हैं नहीं या मैन्युअल ईवेंट हैंडलर्स बताए: (मैं डेल्फी के बजाय एक सी ++ बिल्डर उपयोगकर्ता हूँ, इसलिए निम्नलिखित काफी सही नहीं हो सकता है।)

  1. एक सूची बनाएँ आपके कोड में सभी प्रकाशित तरीकों का।
    • ऐसा करने का उचित तरीका *.pas पढ़ने के लिए है। प्रत्येक टेक्स्ट ब्लॉक को class घोषणा या published निर्देश से शुरू होता है और end, private, या public के साथ समाप्त होता है। इन पाठ ब्लॉक में से प्रत्येक के भीतर, प्रत्येक procedure निकालें।
    • ऐसा करने का आसान तरीका आम घटना हैंडलर प्रकारों की एक सूची बनाना है और मान लें कि वे प्रकाशित हैं।
  2. एक बार आपके पास यह सूची हो जाने के बाद, अपनी डीएफएम फ़ाइल में नहीं मिली सूची से सबकुछ प्रिंट करें।

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

#!/bin/bash 

for file in `find -name *.pas`; do 
    echo $file: 

    # Get a list of common event handling procedures. 
    # Add more types between the | symbols. 
    egrep '^[[:space:]]+procedure.*(Click|FormCreate|FormClose|Change|Execute)\(' $file | 
    awk '{print $2}' | cut -f 1 -d '(' > published.txt 

    # Get a list of used event procedures. 
    egrep '^[[:space:]]+On.* =' ${file%.pas}.dfm | awk '{print $3}' > used.txt 

    # Compare the two. 
    # Files listed in the left column are published but not used, so you can delete them. 
    # Files in the right column were not by our crude search for published event 
    # handlers, so you can update the first egrep command to find them. 
    comm -3 published.txt used.txt 

    echo 

done 

# Clean up. 
rm published.txt used.txt 

वास्तव में, यह उपयोग करें यदि आप Cygwin से परिचित नहीं हैं के लिए:

  • डाउनलोड करें और Cygwin स्थापित करें। मैं सोचता हूं डिफ़ॉल्ट इंस्टॉल आपको आपके द्वारा उपयोग किए जाने वाले सभी टूल देना चाहिए, लेकिन मैं सकारात्मक नहीं हूं।
  • स्क्रिप्ट को अपनी स्रोत निर्देशिका में cleanup.sh के रूप में सहेजें।
  • एक सिगविन कमांड प्रॉम्प्ट प्रारंभ करें।
  • यदि आपका स्रोत c: \ MyApp में है, तो cd /cygdrive/c/myapp
  • टाइप करें ./cleanup.sh टाइप करें और एंटर दबाएं।
+0

+1: मैं एक छोटी सी स्क्रिप्ट लिखूंगा जो इसे कर सकता है। हालांकि, egrep का उपयोग कर ईवेंट हैंडलर खोजने के लिए उल्लिखित तरीका खराब है। मुझे लगता है कि अजीब इसे करने के लिए बेहतर ढंग से सुसज्जित होना चाहिए, और सब कुछ के लिए पायथन का उपयोग करना अभी भी एक बेहतर फिट होगा। – mghie

+0

कंपाइलर के --doc विकल्प का उपयोग करके और परिणामस्वरूप XML फ़ाइल से शुरू करने से फ़ॉर्म के प्रकाशित तरीकों की सूची प्राप्त करने में भी मदद मिलनी चाहिए। – mghie

+0

यह egrep बुरा कैसे उपयोग करता है? (मुझे पता है कि यह एक त्वरित हैक है, मैं बस सोच रहा हूं कि इसमें क्या विशेष कमी है।) –

2

क्रेग के मुकाबले कहीं अधिक आसान दृष्टिकोण है।

एक संदिग्ध घटना हैंडलर पर जाएं। इसे लगातार तरीके से नामित करें - मैं इसे नाम के सामने एक एक्स डालकर करता हूं, कार्यान्वयन पर जाता हूं और वही काम करता हूं। देखें कि संकलक इसके बारे में क्या सोचता है।

यदि यह खुश नहीं है तो आप केवल नामों को वापस बदल दें।

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

5

प्रत्येक ईवेंट हैंडलर का नाम बदलने के लिए "नाम बदलें विधि" का उपयोग करें।चेकबॉक्स को "रीफैक्टरिंग से पहले संदर्भ देखें" चेक करें।

रिफैक्टरिंग विंडो की जांच करें। यदि ईवेंट हैंडलर नियंत्रण से जुड़ा हुआ है, तो "वीसीएल डिज़ाइनर अपडेट" अनुभाग दिखाएगा कि कौन से नियंत्रण विधि से जुड़े हैं।

यह भी दिखाएगा कि विधि किसी अन्य इकाई से कहलाती है, या प्रोग्रामेटिक रूप से असाइन की जाती है।

नोट: यह डी 2006 के लिए है, बाद के संस्करणों में थोड़ा अलग हो सकता है।

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

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