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 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 ExcessivePublicCount extends ExcessiveNodeCountRule { 28 29 public ExcessivePublicCount() { 30 super(ASTCompilationUnit.class); 31 } 32 33 /** 34 * Method counts ONLY public methods. 35 */ 36 public Object visit(ASTMethodDeclarator node, Object data) { 37 return this.getTallyOnAccessType((AccessNode) node.jjtGetParent()); 38 } 39 40 /** 41 * Method counts ONLY public class attributes which are not PUBLIC and 42 * static- these usually represent constants.... 43 */ 44 public Object visit(ASTFieldDeclaration node, Object data) { 45 if (node.isFinal() && node.isStatic()) { 46 return NumericConstants.ZERO; 47 } 48 return this.getTallyOnAccessType(node); 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 NumericConstants.ONE; 60 } 61 return NumericConstants.ZERO; 62 } 63 }