2012-12-03 14 views
11

"इस विधि का प्रयोग न करें" हम काम पर यहाँ Perl::Critic उपयोग किया गया है हमारे कोड सम्मेलनों लागू करने के लिए। हाल ही में Temp::File::tempdir फ़ंक्शन के कारण /tmp निर्देशिका भरने के साथ हम समस्याओं में भाग गए। tempdir पर्ल प्रक्रिया समाप्त होने पर साफ़ हो जाती है, लेकिन चूंकि हमारा पूरा बैकएंड एक पर्ल प्रक्रिया है, यह तब होता है जब सर्वर स्वयं पुनरारंभ होता है (अक्सर नहीं)। हम डेवलपर्स को भविष्य में newdir ऑब्जेक्ट विधि का उपयोग करने के लिए प्रोत्साहित करना चाहते हैं, जैसे ही वस्तु दायरे से बाहर हो जाती है।पर्ल :: समालोचक प्रकार शासन

असल में, हम Temp::File::tempdir एक कोड सम्मेलन उल्लंघन के रूप में चिह्नित करने के लिए कोशिश कर रहे हैं, लेकिन मैं किसी भी नियम है कि CPAN पर समान होगा खोजने के लिए प्रतीत नहीं कर सकते हैं। मैं समझता हूं कि झूठी सकारात्मकताओं को पेश किए बिना गतिशील रूप से टाइप की गई भाषा में लागू करना मुश्किल है, लेकिन मुझे उम्मीद है कि किसी ने अतीत में इसी तरह के मुद्दे को एक और बहिष्कृत समारोह के साथ भाग लिया है। हम सभी मुश्किल मामलों को पकड़ने की उम्मीद नहीं कर रहे हैं, केवल Temp::File::tempdir के सबसे स्पष्ट उपयोग। विचार tempdir के आकस्मिक उपयोग को हतोत्साहित करना है जब newdir नौकरी कर सकता है, आलोचक को मूर्ख बनाने के सभी प्रयासों को पकड़ने के लिए नहीं (डेवलपर हमेशा ## no critic का उपयोग कर सकता है)। यह शायद जब tempdir प्रयोग किया जाता है शिकायत करने के लिए पर्याप्त हो सकता है अगर use Temp::File परिभाषित किया गया है (अधिमानतः जाँच कि कुछ भी नहीं किसी और tempdir को पुनर्परिभाषित) और जब Temp::File::tempdir प्रयोग किया जाता है।

वहाँ पहले से ही कुछ इसी तरह है, या मैं खरोंच से शुरू करना चाहिए? धन्यवाद

+2

जिज्ञासु इस उत्पादन उत्पन्न करता है। कॉन्फ़िगर करने योग्य 'ProhibitEvilModules' और 'ProhibitEvilVariables' नीतियां हैं, लेकिन कोई' ProhibitEvilMethods' नहीं है? – mob

उत्तर

9

वर्तमान में आपको जो कुछ चाहिए उसे प्रदान करने के लिए Perl::Critic में कुछ भी नहीं है, लेकिन यह संभव है कि ऐसा कुछ करने के लिए नीति को जोड़ना संभव हो। दुर्भाग्यवश कार्यक्रम में प्रत्येक टोकन ठीक से पहचानने के लिए व्यापक विचार नहीं है, इसलिए यह इससे अधिक कोडिंग ले सकता है।

कि (q, qq, और qw रूपों के लिए किसी भी सीमांकक के साथ)

use File::Temp 'tempdir'; 
use File::Temp q(tempdir); 
use File::Temp "tempdir"; 
use File::Temp qq(tempdir); 
use File::Temp qw/ tempdir /; 

के किसी भी उपयोग tempdir आयात करना चाहता है एक use File::Temp बयान के लिए इस कार्यक्रम के जाँच करता है। यह PPI::Token::Word नोड के लिए भी जांच करता है जो फ़ंक्शन कॉल की तरह दिखता है और File::Temp::tempdir के बराबर है।

package Perl::Critic::Policy::Prohibit_tempdir; 

use strict; 
use warnings; 

use Perl::Critic::Utils qw{ is_function_call :severities }; 
use Scalar::Util 'blessed'; 

use base 'Perl::Critic::Policy'; 

my $DESC = 'Temp::File::tempdir function'; 
my $EXPL = 'The tempdir function from Temp::File is deprecated. Use newdir method instead'; 

sub default_severity { $SEVERITY_HIGH }; 

sub applies_to{ qw/ PPI::Statement::Include PPI::Token::Word/} 

sub violates { 

    my ($self, $elem) = @_; 

    if ($elem->isa('PPI::Statement::Include')) { 

    return unless $elem->type eq 'use'; 

    my $module = $elem->module; 
    return unless $module and $module eq 'File::Temp'; 

    for my $kid ($elem->children) { 

     next unless blessed($kid) =~ /^PPI::Token::Quote/; 

     if ($kid->can('string') and $kid->string eq 'tempdir' 
      or $kid->can('literal') and grep $_ eq 'tempdir', $kid->literal) { 
     return $self->violation($DESC, $EXPL, $elem); 
     } 
    } 
    } 
    else { 
    if (is_function_call($elem) and $elem eq 'File::Temp::tempdir') { 
     return $self->violation($DESC, $EXPL, $elem); 
    } 
    } 

    return; 
} 

1; 
इस कोड

use strict; 
use warnings; 

use File::Temp 'tempdir'; 
use File::Temp "tempdir"; 
use File::Temp qw/ tempdir /; 

my $dir = tempdir(); 
$dir = tempdir; 
$dir = File::Temp::tempdir; 

my $ft = File::Temp->new; 
$dir = $ft->newdir; 

साथ

से perlcritic -4 test.pl

Code not contained in explicit package at line 1, column 1. Violates encapsulation. (Severity: 4) 
Temp::File::tempdir function at line 4, column 1. The tempdir function from Temp::File is deprecated. Use newdir method instead. (Severity: 4) 
Temp::File::tempdir function at line 5, column 1. The tempdir function from Temp::File is deprecated. Use newdir method instead. (Severity: 4) 
Temp::File::tempdir function at line 6, column 1. The tempdir function from Temp::File is deprecated. Use newdir method instead. (Severity: 4) 
Temp::File::tempdir function at line 10, column 8. The tempdir function from Temp::File is deprecated. Use newdir method instead. (Severity: 4) 
Module does not end with "1;" at line 13, column 1. Must end with a recognizable true value. (Severity: 4) 
+0

धन्यवाद, यह लगभग वही है जो हमें चाहिए, यह अभी तक लाइन 8 और 9 नहीं पकड़ता है, लेकिन मैं इसे ऐसा करने के लिए ट्विक कर दूंगा, और शायद इसे अधिक सामान्य बना सकता हूं ताकि इसे प्रति-मॉड्यूल को प्रति-मॉड्यूल निर्दिष्ट किया जा सके। थोड़ा और सामान्य। –

+0

मैंने आपके प्रश्न में वर्णित दृष्टिकोण का उपयोग किया था। लाइन 8 और 9 में मौजूद कॉल केवल तभी संकलित होंगे जब लाइन 4, 5 या 6 के पिछले उदाहरण हैं। यानी सबराउटिन को कॉल करने से पहले आयात किया जाना चाहिए। 'Tempdir' को कॉल की पहचान करने में समस्या जो मॉड्यूल नाम के साथ पूरी तरह से योग्य नहीं है वह यह है कि' पीपीआई 'शब्दकोष की उपस्थिति के संदर्भ में बहुत उपयोगी नहीं है। 'पर्ल :: क्रिटिक :: यूटिल्स' द्वारा प्रदान किया गया 'is_function_call' क्लासिफायरफायर बहुत अस्पष्ट है, और इसका मतलब यह है कि नशे की लत अन्य नौ संभावनाओं में से कोई भी प्रतीत नहीं होती है। – Borodin