某软件公司需要设计一个源代码解析工具,该工具可以对源代码进行解析和处理,在该工具的初始版本中,主要提供了以下 3 个功能。所有代码和接口均在一个package内。
目录
作业内容
某软件公司需要设计一个源代码解析工具,该工具可以对源代码进行解析和处理,在该工具的初始版本中,主要提供了以下 3
个功能。
(1)
度量软件规模。可以统计源代码中类的个数、每个类属性的个数以及每个类方法的个数等。
(2)
提取标识符名称,以便检查命名是否合法和规范。可以提取类名、属性名和方法名等。
(3)
统计代码行数。可以统计源代码中每个类和每个方法中源代码的行数。
将来还会在工具中增加一些新功能,为源代码中的类、属性和方法等提供更多的解析操
作。现采用访问者模式设计该源代码解析工具,可将源代码中的类、属性和方法等设计为待
访问的元素,上述不同功能由不同的具体访问者类实现,绘制对应的类图并编程模拟实现
一、UML图
二、代码
1.Visitor类
public abstract class Vistor {
public abstract void visit(Code code);
}
2.Element接口
public interface Element {
public abstract void accept(Vistor v);
}
3.Code类
public class Code implements Element{
private String name;
public Code(String name){
this.name = name;
}
public String getName(){
return this.name;
}
@Override
public void accept(Vistor v) {
v.visit(this);
}
}
4.SizeVisitor类
public class SizeVisitor extends Vistor{
@Override
public void visit(Code code) {
System.out.println(code.getName() + "调用了度量软件规模方法");
}
}
5.TypeVisitor类
public class TypeVisitor extends Vistor{
@Override
public void visit(Code code) {
System.out.println(code.getName()+"调用了提取标识符名称方法");
}
}
6.CalcVisitor类
public class CalcVisitor extends Vistor{
@Override
public void visit(Code code) {
System.out.println(code.getName()+"调用了统计代码行数方法");
}
}
7.Test类
public class Test {
public static void main(String[] args) {
SizeVisitor sizeVisitor = new SizeVisitor();
CalcVisitor calcVisitor = new CalcVisitor();
TypeVisitor typeVisitor = new TypeVisitor();
Code code1 = new Code("代码1");
Code code2 = new Code("代码2");
System.out.println("代码1调用方法");
code1.accept(sizeVisitor);
code1.accept(calcVisitor);
code1.accept(typeVisitor);
System.out.println("代码2调用方法");
code2.accept(sizeVisitor);
code2.accept(calcVisitor);
code2.accept(typeVisitor);
}
}