2009-10-28 12 views
7

मेरे पास एक पर्ल कोडबेस है, और बहुत सारे अनावश्यक कार्य हैं और वे कई फाइलों में फैले हुए हैं।मैं पर्ल में अनावश्यक कोड को कैसे पहचान और निकाल सकता हूं?

क्या कोडबेस में उन अनावश्यक कार्यों की पहचान करने का कोई सुविधाजनक तरीका है? क्या कोई आसान उपकरण है जो इसके लिए मेरे कोडबेस को सत्यापित कर सकता है?

+1

मुझे "अनावश्यक" कहने पर आपका क्या मतलब है, इस बारे में बिल्कुल निश्चित नहीं है। क्या आप एकाधिक सबस के बारे में बात कर रहे हैं कि सभी एक ही काम करते हैं? या सब्स के बारे में जो कभी नहीं बुलाया जाता है? अथवा दोनों? – innaM

उत्तर

10

आप क्रॉस-रेफरेंस रिपोर्ट जेनरेट करने के लिए B::Xref मॉड्यूल का उपयोग कर सकते हैं।

+0

मैं इस तरह कुछ ढूंढ रहा था ... – someguy

3

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

मैंने आपके प्रश्न को "refactoring" के साथ टैग किया है। आपको उस विषय के तहत दायर इस साइट पर कुछ रोचक सामग्री मिल सकती है।

+5

मुझे स्टॉक रूम स्टाइल रिफाएक्टर पसंद है। 1. गिट में कोड की जांच करें। 2. सुनिश्चित करें कि आपके पास बहुत सारे परीक्षण हैं। 3. पूरी तरह से मॉड्यूल का नाम कुछ असामान्य करने के लिए बदलें। 4. एक खाली बनाएँ। 5. परीक्षणों को दोबारा कॉपी करें, जब तक आप परीक्षण न करें, तब तक उन्हें दोबारा दोहराएं। 6. पुराने मॉड्यूल से कार्यों की प्रतिलिपि बनाने की आवश्यकता के एक महीने के बाद, इसे हटा दें। –

+0

@ अन्य: आप रीफैक्टरिंग के बारे में सही हैं ... लेकिन पहले मुझे कार्यों का पता लगाने की आवश्यकता है .. :) – someguy

0

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

grep -r "sub " codebase/* > function_list 

आप डुप्लिकेट के लिए इस तरह से भी देख सकते हैं:

यहाँ एक अति सरल उदाहरण है। यदि आप पर्ल की ओओपी क्षमता का उपयोग कर रहे हैं तो यह विचार कम प्रभावी हो सकता है।

यह कोड कोड प्रलेखन उपकरण NaturalDocs का उल्लेख करने योग्य भी हो सकता है। इससे आपको आगे बढ़ने में मदद मिलेगी।

+10

यदि आप पर्ल के साथ काम कर रहे हैं, तो 'gck' का शुद्ध-पर्ल संस्करण 'एके' का उपयोग करने पर विचार करें पर्ल के अधिक शक्तिशाली regex समर्थन का लाभ लेता है। –

8

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

आप प्रत्येक दिनचर्या में सभी वैरिएबल नामों को सामान्य रूप से $ ए, $ बी, $ सी और सामान्य रूप से तारों के समान कुछ करने के द्वारा सामान्यीकरण को थोड़ा अधिक स्मार्ट बना सकते हैं। इस पर निर्भर करता है कि आप कितना आक्रामक होना चाहते हैं।

#!perl 

use strict; 
use warnings; 

use PPI; 

my %Seen; 

for my $file (@ARGV) { 
    my $doc = PPI::Document->new($file); 
    $doc->prune("PPI::Token::Comment");   # strip comments 

    my $subs = $doc->find('PPI::Statement::Sub'); 
    for my $sub (@$subs) { 
     my $code = $sub->block; 
     $code =~ s/\s+/ /;      # normalize whitespace 
     next if $code =~ /^{\s*}$/;    # ignore empty routines 

     if($Seen{$code}) { 
      printf "%s in $file is a duplicate of $Seen{$code}\n", $sub->name; 
     } 
     else { 
      $Seen{$code} = sprintf "%s in $file", $sub->name; 
     } 
    } 
} 
+0

अच्छा! लेकिन आपको खाली दिनचर्या को नजरअंदाज करने की आवश्यकता क्यों है? – innaM

+1

उद्देश्य केवल अनावश्यक कोड नहीं ढूंढना है बल्कि इसे हटाने में सहायता करना है। यह चलने पर जल्दी से स्पष्ट था कि खाली दिनचर्या रिपोर्टिंग सिर्फ अव्यवस्था थी। 'Sub foo {}' के साथ कुछ भी गलत नहीं है। जब आप विकल्प '* foo = \ & DO_NOTHING' के बारे में सोचते हैं, जो' my $ foo = $ EMPTY_STRING' के रूप में मूर्खतापूर्ण है, तो इसे सभी को समझना चाहिए। – Schwern

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