View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.lang.java.rule.codesize;
    5
    6   import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
    7   import net.sourceforge.pmd.lang.java.ast.ASTFieldDeclaration;
    8   import net.sourceforge.pmd.lang.java.ast.ASTMethodDeclarator;
    9   import net.sourceforge.pmd.lang.java.ast.AccessNode;
    10  import net.sourceforge.pmd.lang.java.rule.design.ExcessiveNodeCountRule;
    11  import net.sourceforge.pmd.util.NumericConstants;
    12
    13  /**
    14   * @author aglover
    15   *         <p/>
    16   *         Class Name: ExcessivePublicCount
    17   *         <p/>
    18   *         Rule attempts to count all public methods and public attributes defined in a class.
    19   *         <p/>
    20   *         If a class has a high number of public operations, it might be wise to consider whether
    21   *         it would be appropriate to divide it into subclasses.
    22   *         <p/>
    23   *         A large proportion of public members and operations means the class has high potential to be
    24   *         affected by external classes. Futhermore, increased effort will be required to
    25   *         thoroughly test the class.
    26   */
    27  public class ExcessivePublicCountRule extends ExcessiveNodeCountRule {
    28
    29      public ExcessivePublicCountRule() {
    30          super(ASTCompilationUnit.class);
    31          setProperty(MINIMUM_DESCRIPTOR, 45d);
    32      }
    33
    34      /**
    35       * Method counts ONLY public methods.
    36       */
    37      public Object visit(ASTMethodDeclarator node, Object data) {
    38          return this.getTallyOnAccessType((AccessNode) node.jjtGetParent());
    39      }
    40
    41      /**
    42       * Method counts ONLY public class attributes which are not PUBLIC and
    43       * static- these usually represent constants....
    44       */
    45      public Object visit(ASTFieldDeclaration node, Object data) {
    46          if (node.isFinal() && node.isStatic()) {
    47              return NumericConstants.ZERO;
    48          }
    49          return this.getTallyOnAccessType(node);
    50      }
    51
    52      /**
    53       * Method counts a node if it is public
    54       *
    55       * @param node The access node.
    56       * @return Integer 1 if node is public 0 otherwise
    57       */
    58      private Integer getTallyOnAccessType(AccessNode node) {
    59          if (node.isPublic()) {
    60              return NumericConstants.ONE;
    61          }
    62          return NumericConstants.ZERO;
    63      }
    64  }