View Javadoc

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