2011-05-26 5 views
12

में कोई ब्रेसिज़ नहीं होने के बावजूद सरल अगर अनुमति दें, तो मैं यह जांचने के लिए checkstyle का उपयोग करता हूं कि मेरा जावा कोड हमारी परियोजना के दिशानिर्देशों का सम्मान करता है या नहीं।कोडास्टाइल

हालांकि, हमारे पास एक दिशानिर्देश है कि मैं यह नहीं समझ सकता कि इस टूल के साथ कैसे जांच करें। हम अगर यह उदाहरण की तरह, कोई ब्रेस के लिए (कोई किसी और और उस में कोई अन्य सशर्त संरचना के साथ करता है, तो समझ में) सरल अनुमति देना चाहते हैं:

// valid 
if(condition) callFunction(); 

// invalid 
if(condition) for(int i = 0; i < someValue; i++) callFunction(i); 

// valid 
if(condition) { 
    for(int i = 0; i < someValue; i++) { 
     callFunction(i); 
    } 
} 

// invalid 
if(condition) callFunction(); 
else callOtherFunction(); 

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

इसके साथ कोई भी मदद वास्तव में सराहना की जाएगी।

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

+12

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

+1

@ मार्क मुझे सरल फ़ंक्शन कॉल के लिए इनलाइन ifs का उपयोग करने के बारे में पता नहीं है, लेकिन मुझे लगता है कि कुछ स्थितियों की जांच करने के लिए उनका उपयोग करना उचित है और शर्तों को पूरा नहीं होने पर अपवाद फेंकना उचित है। –

+6

यह प्रश्न इस बारे में नहीं है कि दिशानिर्देश उचित हैं या नहीं। यह प्रश्न इन दिशानिर्देशों का समर्थन करने के लिए चेकस्टाइल को संशोधित करने के तरीके के बारे में है। मुझे लगता है कि हमें इस प्रश्न में दिशानिर्देशों पर चर्चा करने से बचना चाहिए। –

उत्तर

5

अंत में, मैंने चेकस्टाइल के लिए एक कस्टम चेक लागू किया। यहाँ स्रोत कोड अगर किसी में रुचि है:

import com.puppycrawl.tools.checkstyle.api.Check; 
import com.puppycrawl.tools.checkstyle.api.DetailAST; 
import com.puppycrawl.tools.checkstyle.api.TokenTypes; 

public class IfBracesCheck extends Check { 

    @Override 
    public int[] getDefaultTokens() { 
     return new int[] { 
      TokenTypes.LITERAL_ELSE, 
      TokenTypes.LITERAL_IF, 
     }; 
    } 

    @Override 
    public void visitToken(DetailAST aAST) { 
     final DetailAST slistAST = aAST.findFirstToken(TokenTypes.SLIST); 

     if(aAST.getType() == TokenTypes.LITERAL_ELSE) { 
      // If we have an else, it must have braces, except it is an "else if" (then the if must have braces). 
      DetailAST ifToken = aAST.findFirstToken(TokenTypes.LITERAL_IF); 

      if(ifToken == null) { 
       // This is an simple else, it must have brace. 
       if(slistAST == null) { 
        log(aAST.getLineNo(), "ifBracesElse", aAST.getText()); 
       } 
      } else { 
       // This is an "else if", the if must have braces. 
       if(ifToken.findFirstToken(TokenTypes.SLIST) == null) { 
        log(aAST.getLineNo(), "ifBracesConditional", ifToken.getText(), aAST.getText() + " " + ifToken.getText()); 
       } 
      } 
     } else if(aAST.getType() == TokenTypes.LITERAL_IF) { 
      // If the if uses braces, nothing as to be checked. 
      if (slistAST != null) { 
       return; 
      } 

      // We have an if, we need to check if it has no conditionnal structure as direct child. 
      final int[] conditionals = { 
       TokenTypes.LITERAL_DO, 
       TokenTypes.LITERAL_ELSE, 
       TokenTypes.LITERAL_FOR, 
       TokenTypes.LITERAL_IF, 
       TokenTypes.LITERAL_WHILE, 
       TokenTypes.LITERAL_SWITCH, 
      }; 

      for(int conditional : conditionals) { 
       DetailAST conditionalAST = aAST.findFirstToken(conditional); 

       if (conditionalAST != null) { 
        log(aAST.getLineNo(), "ifBracesConditional", aAST.getText(), conditionalAST.getText()); 

        // Let's trigger this only once. 
        return; 
       } 
      } 
     } 
    } 
} 
0

जबकि मैं टिप्पणियों से सहमत हूं कि यह एक बुरा विचार है, हो सकता है कि आप दिशानिर्देशों को बदलने में सक्षम न हों। >- -> धनुकोष्ठक आवश्यकता,

  • मॉड्यूल का एक नया उदाहरण बनाएं अगर कीवर्ड Regexp को निष्क्रिय

    1. checkstyle मॉड्यूल में ब्लाकों: तो आप इस प्रयास करना चाहें RegexpSingleLineJava और एक regexp है कि आपके अवैध मामलों नहीं बल्कि अपने वैध लोगों

    (मॉड्यूल na से मेल खाता है खोजने की कोशिश मेस ग्रहण चेकस्टाइल प्लगइन 5.3.0 से हैं)

  • +0

    मैंने ऐसा कुछ सोचा, लेकिन रेगेक्स उस नियम को संभालने के लिए पर्याप्त शक्तिशाली नहीं है, यहां तक ​​कि यह शायद समाधान का एक हिस्सा है। – deadalnix

    +0

    Regexp बहुत शक्तिशाली है;) आपके उदाहरणों से, दूसरा उदाहरण पहले से ही अमान्य है, जब तक कि कथन के लिए ब्रेसिज़ होने की आवश्यकता होती है। आगे का उदाहरण अभी भी मान्य है, लेकिन मेरे पास एक regexp है जो काम कर रहा है - बस चेकस्टाइल में नहीं। हो सकता है कि आप इसे समझ सकें: (? एस) यदि। *; * * अन्य – Stephan

    +0

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

    1

    बस ऐसे ही अब checkstyle का समर्थन करता है 'allowSingleLineIf' संपत्ति जो कुछ मामलों को शामिल किया गया जोड़ना चाहते हैं।

    <module name="NeedBraces"> 
         <property name="allowSingleLineIf" value="true"/> 
        </module> 
    
    0

    CheckStyle 6.14 NeedBracesCheck rool समर्थन allowSingleLineStatement विकल्प

    allowSingleLineStatement जो ब्रेसिज़ के बिना एकल लाइन बयानों की अनुमति देता है, उदा .:

    अगर (obj.isValid()) return true;

    जबकि (obj.isValid()) सत्य लौटते हैं;

    ऐसा करें। नोटिफ़ाई(); जबकि (ओ! = शून्य);

    (int i = 0;;) this.notify();

    documentation