2015-03-06 21 views
5

मैं अक्सर रोजगार के अपने स्थान पर एक विशाल, बहुत-अच्छी तरह से प्रलेखित, ऑब्जेक्ट उन्मुख पर्ल रेपो पर काम करता हूं। कोड को बनाए रखने के दौरान, मुझे अक्सर उन चीजों का पता लगाने की आवश्यकता होती है जो अन्य वर्गों से विरासत में प्राप्त होती हैं ताकि मैं समझ सकूं कि वे क्या कर रहे हैं। उदाहरण के लिए, मैं यह पता लगाने की क्या $self->mystery है और यह क्या कर रही है की जरूरत है:निर्धारित करें कि मूस के गुण और तरीके कहाँ से विरासत में मिलीं?

package Foo::Bar; 
use Moose; 
use Method::Signatures; 
use Foo::Bar::Element; 
use Foo::Bar::Function; 
use base qw (Baz::Foo::Bar); 

method do_stuff ($some_arg) { 
    # mystery is not defined in Foo::Bar 
    my $mystery = $self->mystery; 
    $mystery->another_mystery($some_arg); 
} 

मैं आमतौर पर जिस तरह से बहुत अधिक समय माता-पिता कक्षाओं के माध्यम से पता लगाने के खर्च अपने आप पाते हैं। तो मेरा सवाल यह है कि, क्या यह पता लगाने के लिए एक आसान तरीका है कि $self->mystery कहां से आता है? या दूसरे शब्दों में, मुझे यह जानने की ज़रूरत है कि रहस्य कहां घोषित किया गया है।

और "आसान तरीका" से, मेरा मतलब यह नहीं है कि फ़ाइलों के माध्यम से खोज करने के लिए ack या grep का उपयोग करना है। मुझे उम्मीद है कि कुछ प्रकार का डिबगिंग मॉड्यूल है जिसे मैं इंस्टॉल और उपयोग कर सकता हूं जो मुझे कुछ अंतर्दृष्टि देने में मदद कर सकता है।

धन्यवाद।

+0

गंभीरता से, हालांकि, सभी कहा जाता है जब तक आप विभिन्न वर्गों में तरीकों में से एक * टन * है 'mystery',' पावती '^ उप mystery'' वास्तव में, जहां कि विधि परिभाषित किया गया है खोजने के लिए सबसे अच्छा तरीका है। –

+1

आप यह स्पष्ट नहीं करते हैं कि आप इस जानकारी का उपयोग कैसे करना चाहते हैं। मैं चाहता हूं कि यह एक प्रोग्रामिंग आईडीई में उपलब्ध हो, लेकिन जब से आप * "कुछ प्रकार के डिबगिंग मॉड्यूल" * के लिए पूछते हैं, तो मानक डीबगर क्या आप चाहते हैं? आप बस विधि * में * चरण * का उपयोग कर सकते हैं और देख सकते हैं कि यह आपको कहां लेता है। – Borodin

+0

@jcast - नहीं, बिल्कुल नहीं। 'रहस्य' एक मूस विशेषता हो सकती है। या इस रेपो के लिए उपयोग करें, यह लिखा गया है कि यह या तो 'उप' या 'विधि' हो सकता है। या यह एक हैंडलर विधि के रूप में परिभाषित किया जा सकता: 'है foo => (है => 'ro', संभालती है => [qw (बार रहस्य baz)]' –

उत्तर

5

मानक पर्ल के लिए धन्यवाद। । । comes_from विधि!

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

क्यों नहीं?सरल: मानक पर्ल में जिस उत्तर को आप ढूंढ रहे हैं उसे प्राप्त करने के लिए आपको की आवश्यकता है।

$origin  = $self->comes_from("mystery"); 
$secret_origin = $self->comes_from("another_mystery"); 
$birthplace = Some::Class->comes_from("method_name"); 

कि सबरूटीन जो कि विधि के लिए हल होगा का मूल नाम वापस आ जाएगी: आसान तरीका पता लगाने के लिए जहां कुछ से आता है बहुत उपयोगी comes_from विधि का उपयोग करने के लिए है। जैसा कि आप देखते हैं, comes_from ऑब्जेक्ट विधि और क्लास विधि दोनों के रूप में काम करता है, जैसे can और isa

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

use v5.10.1; 
use Path::Router; 
my($what, $method) = qw(Path::Router dump); 
say "$what->$method is really ", $what->comes_from($method); 

प्रिंट आउट:

Path::Router->dump is really Moose::Object::dump 

इसी प्रकार के कॉल भी तरह बातें प्रकट होगा:

Net::SMTP->mail  is really Net::SMTP::mail 
Net::SMTP->status is really Net::Cmd::status 
Net::SMTP->error is really IO::Handle::error 

यह सादा OLE सबरूटीन्स पर ठीक भी काम करता है:

SQL::Translator::Parser::Storable->normalize_name 
is really SQL::Translator::Utils::normalize_name 

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

sub UNIVERSAL::comes_from($$) { 
    require B; 
    my($invocant, $invoke) = @_; 
    my $coderef = $invocant->can($invoke) || return; 
    my $cv  = B::svref_2object($coderef); 
    return unless $cv->isa("B::CV");    
    my $gv  = $cv->GV; 
    return if $gv->isa("B::SPECIAL"); 
    my $subname = $gv->NAME; 
    my $packname = $gv->STASH->NAME; 
    return $packname . "::" . $subname; 
} 

घोषित करने से है कि एक UNIVERSAL उप, अब हर कोई है जो किसी को भी हो जाता है के रूप में इसके साथ खेलें, जैसे वे can और isa के साथ करते हैं। का आनंद लें!

+1

धन्यवाद, यह है बिल्कुल सही। बिल्कुल सरल, मैं जो खोज रहा था। –

2

क्या आप वाकई आईडीई नहीं चाहते हैं? ऐसा लगता है कि आप किस बारे में पूछ रहे हैं। Padre, Eclipse EPIC, Emacs, और vim और कई अन्य संपादक आपके द्वारा उल्लेख की जाने वाली सुविधाओं पर कुछ भिन्नता प्रदान करते हैं - शायद आप जितना चाहें उतना सरल। यदि आपके पास ctags नेविगेट करने के लिए बड़ी परियोजना है, तो सहायता कर सकते हैं - आमतौर पर एक संपादक में एकीकृत करना आसान होता है और आपको स्रोत फ़ाइलों के जटिल सेट के बिट्स को पहचानने के लिए अपनी कॉन्फ़िगरेशन फ़ाइल (regexes बीटीडब्लू) के साथ हैक करने की अनुमति है।

संबंधित PERL FAQ entry about IDEs और एक SO प्रश्न: What's a good development environment for Perl? है।

  • Devel::Kit
  • Devel::Peek
  • SUPER
  • Devel::Trepan
  • MooseX::amine/mex
  • : वहाँ भी आप जब विकासशील उपयोग करना चाहते हैं जाएगा CPAN मॉड्यूल के एक मेजबान है कि आप प्रोग्राम अपने कोड में नजर डालते हैं ...

आप एक स्क्रिप्ट का एक उदाहरण देख सकते हैं जो एसओ नोड में कक्षाओं में विधियों की तलाश करता है: Get all methods and/or properties in a given Perl class or module

आप इस तरह के टूल्स प्राप्त करने में सक्षम हो सकते हैं ताकि आप अपने स्रोत में एक शेल से या डीबगर के अंदर से उपयोगी तरीके से अपने स्रोत में घूमने में मदद कर सकें। Trepan में इसके दस्तावेज़ के हिस्से के रूप में डिबगिंग टूल का एक अच्छा संक्षिप्त सारांश है। आम तौर पर ही आप बहुत ही उत्पादक डीबगर और ack साथ Data::DumperB:: modules संयोजन (B::Xref, B::Deparse, आदि, etc।) हो सकता है।

+0

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

+0

@ 2rare2die आप ['MooseX :: amine' और mex] (https://metacpan.org/pod/MooseX::amine) को भी देखना चाहते हैं। मैं उन्हें अपनी प्रतिक्रिया में जोड़ दूंगा। –

+0

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

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