ان كنت تعمل ضمن فريق على احد مشاريع الاندرويد, فربما واجهتكم مشكلة ان كل مطور لديه الاسلوب الخاص في كتابة الكود, فالبعض مثلاً يقوم باضافة علامة {} في سطر جديد والبعض يضيفها في نفس السطر, والبعض يتبع اسلوب camelcase في تسميه المتغيرات والبعض يتبع اسلوب اخر … وغيرها من الاختلافات الاخرى, ولحل هذه المشكلة ولتوحيد اسلوب الكتابة على مستوى المشروع بالكامل تستطيع استخدام اداة Check Style.

أداة Check Style

Checkstyle هي أداة لفحص كود الجافا الخاص بمشروعك وفحص مدى مطابقته للمعاير المتبعة والمتفق عليها سواء كانت على مستوى الـ Community او معايير الفريق الذي تعمل معه,  فكل ماعليك هو ان تقوم ببرمجة المعاير الخاصة بك مثل اسماء الـ methode او الكلاسات او حتى المسافات بين المتغيرات وغيرها من المعايير الاخرى بداخل ملف xml وذلك عن طريق بعض اوامر الـ Regex وبعض الـ Tags الخاصة بالاداة.

استخدام CheckStyle

في البداية قم باضافة الكود التالي الى ملف build.gradle

apply plugin: 'checkstyle'
 
task checkstyle(type: Checkstyle) {
    configFile rootProject.file('checkstyle.xml')
    source 'src/main/java'
    ignoreFailures false
    showViolations true
    include '**/*.java'
 
    classpath = files()
}

ومن ثم قم بانشاء ملف جديد باسم checkstyle.xml بداخل مجلد المشروع والصق بداخله الكود التالي والذي يحتوي على المعايير الخاصة بك:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker">
    <!--module name="NewlineAtEndOfFile"/-->
    <module name="FileLength"/>
    <module name="FileTabCharacter"/>

    <!-- Trailing spaces -->
    <module name="RegexpSingleline">
        <property name="format" value="\s+$"/>
        <property name="message" value="Line has trailing spaces."/>
    </module>

    <!-- Space after 'for' and 'if' -->
    <module name="RegexpSingleline">
        <property name="format" value="^\s*(for|if)[^ ]"/>
        <property name="message" value="Space needed before opening parenthesis."/>
    </module>

    <!-- For each spacing -->
    <module name="RegexpSingleline">
        <property name="format" value="^\s*for \(.*?([^ ]:|:[^ ])"/>
        <property name="message" value="Space needed around ':' character."/>
    </module>

    <module name="TreeWalker">
        <!--<property name="cacheFile" value="${checkstyle.cache.file}"/>-->

        <!-- Checks for Javadoc comments.                     -->
        <!-- See http://checkstyle.sf.net/config_javadoc.html -->
        <!--module name="JavadocMethod"/-->
        <!--module name="JavadocType"/-->
        <!--module name="JavadocVariable"/-->
        <!--module name="JavadocStyle"/-->


        <!-- Checks for Naming Conventions.                  -->
        <!-- See http://checkstyle.sf.net/config_naming.html -->
        <module name="ConstantName"/>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-zA-Z0-9_]*$"/>
        </module>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="StaticVariableName"/>
        <module name="TypeName">
            <property name="format" value="^[A-Z][a-zA-Z0-9_]*$"/>
        </module>


        <!-- Checks for imports                              -->
        <!-- See http://checkstyle.sf.net/config_import.html -->
        <module name="AvoidStarImport"/>
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports">
            <property name="processJavadoc" value="true"/>
        </module>


        <!-- Checks for Size Violations.                    -->
        <!-- See http://checkstyle.sf.net/config_sizes.html -->
        <module name="LineLength">
            <property name="max" value="100"/>
        </module>
        <!--<module name="MethodLength"/>-->
        <module name="ParameterNumber"/>


        <!-- Checks for whitespace                               -->
        <!-- See http://checkstyle.sf.net/config_whitespace.html -->
        <module name="GenericWhitespace"/>
        <module name="EmptyForIteratorPad"/>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="WhitespaceAfter"/>
        <module name="WhitespaceAround"/>


        <!-- Modifier Checks                                    -->
        <!-- See http://checkstyle.sf.net/config_modifiers.html -->
        <!--module name="ModifierOrder"/-->
        <module name="RedundantModifier"/>


        <!-- Checks for blocks. You know, those {}'s         -->
        <!-- See http://checkstyle.sf.net/config_blocks.html -->
        <module name="AvoidNestedBlocks"/>
        <module name="EmptyBlock"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces">
            <property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_FOR, LITERAL_WHILE"/>
        </module>
        <module name="RightCurly"/>


        <!-- Checks for common coding problems               -->
        <!-- See http://checkstyle.sf.net/config_coding.html -->
        <!--<module name="AvoidInlineConditionals"/>-->
        <module name="CovariantEquals"/>
        <!--<module name="DoubleCheckedLocking"/>-->
        <module name="EmptyStatement"/>
        <module name="EqualsAvoidNull"/>
        <module name="EqualsHashCode"/>
        <!--<module name="HiddenField"/>-->
        <module name="IllegalInstantiation"/>
        <module name="InnerAssignment"/>
        <!--<module name="MagicNumber"/>-->
        <module name="MissingSwitchDefault"/>
        <module name="RedundantThrows"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>

        <!-- Checks for class design                         -->
        <!-- See http://checkstyle.sf.net/config_design.html -->
        <!--module name="DesignForExtension"/-->
        <!--module name="FinalClass"/-->
        <module name="HideUtilityClassConstructor"/>
        <module name="InterfaceIsType"/>
        <!--<module name="VisibilityModifier"/>-->


        <!-- Miscellaneous other checks.                   -->
        <!-- See http://checkstyle.sf.net/config_misc.html -->
        <module name="ArrayTypeStyle"/>
        <!--module name="FinalParameters"/-->
        <module name="TodoComment"/>
        <module name="UpperEll"/>
    </module>
</module>

تشغيل الاداة لفحص الكود

لتشغيل الاداة التي قمنا باضافتها, قم بفتح التبويب Gradle من اليمين ومن ثم اختار الـ Module الذي تريد فحصه واختر other -> checkStyle وبعد ذلك Right click -> Run .

ستظهر لك في الاسفل جميع المشاكل التي وجدتها الاداة مع توضيح لكل خطأ وفي اي سطر بالضبط.