blog2

前言

1.题目集四难度一般,题量中等和之前的题目量等同,为三道题目。三道题目分别考察了正则表达式,日期类的间关系和图形类的继承。

2.题目集五难度中等,题量略有增加,为五道题目。五道题目分别考察了字符串的处理、数组的处理、排序算法、正则表达式和日期的类间关系迭代

3.题目集六难度低,题量增加,为六道。六道题目前四道都是考察了正则表达式,第五道是图形类的继承和多态的迭代,第六道是图形的第三次迭代。

设计与分析

4-7-2和5-7-5

4-7-2

4-7-2 Source Monitor生成表内容

4-7-2 Power Designer类图

解释:圈复杂度最高是14,类间关系是组合关系,业务类是DateUtil、实体类是Day、Month和Year类。Main类复杂度过高在于对输入的信息的处理上,DateUtil类的复杂度过高是在处理日期合法上。这次题目的类的方法和题目集三的一样。这次日期类的迭代关键是类间关系的不同,即类间关系的设计区别,这次类间关系是组合关系。

心得:

1.通过细分问题,设计类间关系和方法解题。

2.组合关系是contains的关系,耦合性强,整体和部分的生存期相同。调用的时候是一级一级调用方法。

3.了解在代码中组合关系的体现。

5-7-5

5-7-5Source Monitor生成表内容

5-7-5 Power Designer类图


解释:圈复杂度最高是14,类间关系是聚集,除类间关系以外,其他都和4-7-2一样。

心得:

1.聚集关系是has的关系,耦合性较低,整体和部分的生存期不同。

3.了解的在代码层面上的聚集关系的体现。

日期类聚合设计的优劣比较

组合和聚集的主要区别是整体和部分的生存期不同。

 组合的整体和部分的生存期相同。

 聚集的整体和部分的生存期不同。

聚集相比于组合的优势在于聚集在部分不存在时,整体依旧是能存在的。

4-7-3、6-7-5和6-7-6

4-7-3

4-7-3 Source Monitor生成表内容

4-7-3 Power Designer类图

解释:圈复杂度最高为11,在Main类中,过高的主要原因是对输入数据的处理方面过于复杂。主要有两条继承链分别是:Ball类->Circle类->Shape类和Box类->Rectangle类->Shape类。Shape类为实体类。两条链中的方法都非常简单。

心得:

1.复写父类的方法要做标注,即@Override。

6-7-5

6-7-5 Source Monitor生成表内容

6-7-5 Power Designer类图

解释:圈复杂度最高为11,在Main类中,过高的主要原因是对输入数据的处理方面过于复杂。有三个继承类,Circle类、Rectangle类、Triangle类都继承抽象类---Shape类。

心得:

1.父类是实体类,但是子类可以是抽象类。如Shape类是抽象类,而它的父类Object类却是实体类。

2.父类是抽象类,子类如果是实体类,就必须实例化父类的抽象方法。如Rectangle类的父类--Shape类有三个抽象方法public abstract boolean validate(),public abstract double getArea(),public abstract String toString()Rectangle类中都需要写对应的方法去实例化父类的抽象方法。

3.父类是抽象类,子类没有完全实例化父类的抽象方法,那么子类必须声明为抽象类。

6-7-6

6-7-6 Source Monitor生成表内容

6-7-6 Power Designer类图

解释:圈复杂度最高为4,在Main类中,圈复杂度在10以内,程序的维护性高。Circle类,Rectangle类都继承了接口GetArea类,都实例化了接口类中的public abstract double getArea()方法。

心得:

1.接口是可以跨域不同的类的对行为的抽象。如Circle类和Rectangle类都有共同的行为getArea()。

2.接口的方法都是public abstract,接口能定义常量.如常量public static final a = 0;

三种渐进式图形继承设计的思路与技术运用

1.题目集4-7-3的继承是实体类继承实体类,题目集6-7-5的继承是实体类继承抽象类,题目集6-7-7的继承是实体类继承接口类。

2.题目集6-7-5的父类是从多个子类的高度抽象概括得出的抽象类,抽象类所跨域的是具有相似特点的类。

3.题目集6-7-6的接口是对行为的抽象。可以跨不同的类。

正则表达式总结

1.分组提取

//来源自题目集4-7-1
String regex = "([1-9]\\d{0,3})[\\/]([1-9]|1[0-2])[\\/]([1-9]\\d?)[ ]([0-9]|[12]\\d)[:]00";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(measureDateTime);
		if(!m.matches()) {
			return false;
		}
		int year = Integer.parseInt(m.group(1));
		int month = Integer.parseInt(m.group(2));
		int day = Integer.parseInt(m.group(3));
		int hour = Integer.parseInt(m.group(4));

2.数值正则(前导不为零)

//来源自题目集4-7-1
//前导不为零
String regex = "[1-9]\\d{0,2}([.]\\d{1,3})?";
String regex = "[1-9][.]\\d{2}";
String regex = "([1-9]\\d{0,3})";

3.通配符和特殊字符

//来源自题目集4-7-1
//特殊字符要表示原来的意思要双斜杠
String regex = "(.)[.]";//第一个点是通配符,第二个是点

4.在方法中以正则作为所有或则部分参数

//来源自题目集4-7-1
Pattern p = Pattern.compile(regex);
Pattern.matches(regex,arg);//多参数正则作为第一个参数

5.正则表达式的删除和替换

//来源自题目集5-7-4
Pattern p1 = Pattern.compile("//.*");
Matcher m1 = p1.matcher(str);
str = m1.replaceAll(" ");			

/**
*点模式:
*Pattern p = Pattern.compile(regex,DOTALL);
*默认情况下,此表达式不匹配行终止符。
*在dotall模式下,表达式。匹配任何字符,包括行终止符。
*/
Pattern p3 = Pattern.compile("\\/\\\\*.*\\\\*\\/",Pattern.DOTALL);
Matcher m3 = p3.matcher(str);
str = m3.replaceAll(" ");

6.杂项

//来源自题目集4-7-1
String regex = "[1-9]\\d+[ ][.][\\^]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(args);
m.find();
m.group();
m.group(1);
m.matches();

5-7-4

5-7-4

5-7-4Source Monitor生成表内容

5-7-4 Power Designer类图

解释:圈复杂度最高为5,在Main类中,圈复杂度在10以内,程序的维护性高。KeyWords类和DealString类是自己设计的类,KeyWords类的设计是为了创建关键字类,DealString类是业务类,帮助处理输入数据。其中DealString类的方法public String delet String(String str)是为了删除字符串、四则运算和注释。public List<KeyWrods> countTime(String str)是为了统计53个关键字出现的次数。

心得:

1.只要是能设计成类的,都尽量写成类。

2.模块化编程+注释。方便自己二次代码。

Java集合框架应用的分析总结

在题目集5-7-4中只使用了Collection类的List类,Map和Set均为使用但做了一定的了解。

1.List、Map、Set都直接或间接地使用迭代器遍历。

2.Map是能储存两个不同的值:键和值。两个值都是泛型需要自定义,键的值是不可重复的,值的内容是可以重复的。

3.Set的值是不可以重复的。对值可以排序。

采坑心得

1.数值超过范围。题目集5-7-5中测试点:下n天:整型数最大值测试。int 型最大值2147483647,当变量的值达到最大值时,不能再增大变量的值。

2.对数组操作非法。

不能直接把自定义的类的列表直接转换成数组。

3.变量赋值错误。在求日期的题目中,当闰年时2月改成29天,可是当平年时没有把改变了的值改成28天,还是之前闰年的2月份的值。

改进建议

1.日期类的对输入数据的处理的方法待改进,但是不过思路还是停留在把if-else语句改成switch语句,整体代码的圈复杂度不会有改变。

2.日期类中的求下n天、前n天和两日期之差的方法待改进。三种方法的实现可以直接暴力求解,完全不需要用自己的数学计算的方式求解。数学计算的方式和暴力循环求解的主要差别是:暴力求解所花的时间更长,但是数学计算的方式求解的代码不易看懂。

3.题目集4-7-1中的public HydrologicalInfo toHydrologicalInfo()方法待改进,提取字符串的处理可以通过正则表达式提取,而不是用spilt()方法分割提取转换。这样做的好处在于能简化代码,让代码更易于理解。

总结

组合和聚集

1.组合和聚集的主要区别在于整体和部分的区别。组合的耦合性强于聚集。

1.组合在代码中的体现:

//在整体B被创建的同时,部分A创建了
//B contains A
class A{}
class B {
	1.
	private A a = new A();
	2.
	private A a;
	public B(){
		super();
		a = new A();
	}
}

2.聚集在代码中的体现

//表现在代码层面,和关联关系是一致的,只能从语义级别来区分
//B has A
class A{}
class B{
	private A a;
	public funB1(A a){
		a.listen();
	}
	public funB2(){
		a = new A();
		a.listen();
	}
}

抽象类和接口

1.抽象类是对所跨域的是具有相似特点的类的抽象。

2.接口是对所跨域不同的类的对行为的抽象。

3.抽象类和接口类都是不能实例化的,但是可以作为引用声明。

4.抽象类的代码组成为属性+构造方法+抽象方法+方法

.接口的代码组成为常量+抽象方法。

代码实例:

public abstract class Shape{//访问修饰符 类修饰符 声明类 类名
    public abstract double getArea();//访问修饰符 方法修饰符 返回值 方法名
}
public class Rectangle extends Shape{
    private double width;
    private double length;
    
    public boolean getArea(){
        return this.width * this.length;
	}
}
interface GetArea {
	public abstract double getArea();
}
 class Circle  implements GetArea{
	private double radius;
	
	public Circle() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public double getArea() {
		return Math.PI * Math.pow(radius,2);
	}
}

两者的异同

类型 abstract class Interface
定义 abstract class关键字 Interface关键字
继承 抽象类可以继承一个类和实现多个接口;子类只可以继承一个抽象类 接口只可以继承接口(一个或多个);子类可以实现多个接口
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符
方法实现 可定义构造方法,可以有抽象方法和具体方法 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现
实现方式 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
作用 把相同的东西提取出来,即重用 为了把程序模块进行固化的契约,是为了降低偶

正则表达式

1.分组提取

2.数值正则(前导不为零)

3.通配符和特殊字符

4.在方法中以正则作为所有或则部分参数

5.正则表达式的删除和替换

细节在分析与设计中已经给出,这里不再赘述。

建议

1.习题集5-7-4中的第二个测试点的提示有问题,应该是提示四则运算,但是提示的却是中括号。完全不符合,让人摸不着头脑。

posted @ 2021-05-01 23:45  renwoxinga  阅读(115)  评论(0)    收藏  举报