大佬教程收集整理的这篇文章主要介绍了OO unit4 summary,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
第四单元个人认为主要是考察对于层次结构的理解,即如何理解并处理好UML图的树状结构组织,在理好层次之间以及层次内部的相互关系之后,就只剩下代码实现的问题了。但是不得不说,刚开始接触UML特别是对starUML不熟悉的时候,如果指导书说的不是太清楚,真的很难动手实现,比如说在第一次作业的时候,我就完全理解错了,导致难度飞升,一度怀疑老师所说的“简单”。@H_675_5@虽然说相比JML是真的不太简单@H_197_6@
由于主要架构课程组都已经做好了,所以我们基本不用构思什么架构,只需要做好层次化的组织就行了
这次作业只要求实现类图相关的存储与查询。
在数据的存储方面,考虑到不同层次的元素之间是有很强的关系的,常常需要进行特定的操作,比如对于class
这个元素,查询指令中有查询与class相关联的需求以及查询他所实现的接口的需求,很自然的想到被关联的class实例和被实现的interface实例最好作为属性放进此class实例中,当然还需要提供一系列的查询操作。
因为查询操作众多,显然需要使用hashmap
进行存储,刚好hashmap
是一对一的查询使用起来非常舒服,这里如果出现有多个键相同但是值不同的话,说明存在异常(同名),再建一个name2Valid
的hashmap
,对每次查询时输入的键进行检查是否有效就好了,速度也非常快。
但是课程组提供的接口给出的是课程组写的类对应的实例,此时如果采用继承来做就不太好实例化自己写的类,因此我干脆把课程组给的实例封进了自己写的类中,虽然结构上有亿点丑陋,有一点不OO,但是因为到了烤漆,也就将就着用了,最终形成以下结构:(其他的元素也大都如此,把课程组给的实例封进自己写的类中,然后就能很方便地使用
@H_618_30@public class MyClass {
private UmlClass umlClass;
private MyClass father = null;
private MyClass topFather = null;
private Boolean updatedTopFather = false;
...
private HashSet<MyInterface> interfaces = new HashSet<>();
private String name;
private ArrayList<MyClass> associations = new ArrayList<>();
public MyClass(UmlClass umlClass) {
thiS.UR_326_11845@lClass = umlClass;
name = umlClass.getName();
}
...
public void setTopFather(MyClass topFather) {
this.topFather = topFather;
}
public MyClass getTopFather() {
return topFather;
}
public void setupdatedTopFather(Boolean updatedTopFather) {
this.updatedTopFather = updatedTopFather;
}
public Boolean hasupdatedTopFather() {
return updatedTopFather;
}
...
public void addoperation(MyOperation operation) {
operations.add(operation);
}
public HashSet<MyInterface> geTinterfaces() {
return interfaces;
}
...
}
此外,由于第一次作业CPU使用时间限制为2s,其中有几个非常耗时的查询操作,查实现的接口,(这里还需要查接口的继承情况),查关联的类等。
考虑到实现的难度,我选择用递归来解决问题,同时采用记忆化加速。即将相关的操作提供一个flag
,如果flag
有效则直接返回对应的查询元素,若无效,则进行对应的递归查找,并更新相应的信息的存储。
异常处理方面,要特别注意异常抛出的顺序,大体按照从顶层向底层的顺序抛异常就好了。
最后,考虑到输入元素的顺序可能不确定,因此我选择把所有输入的元素先分类存储,然后按照合理的顺序一个一个地存进相应的类中,为了方便管理,我写了一个@H_931_15@myinfoLoader的类来专门处理读入信息的问题。
第二次作业相比第一次多了时序图和状态图的处理,处理过程完全一样,有了第一次的经验,这次作业做起来显得比较简单。同时CPU使用时间放宽到10s,再加上多的两个UML图的查询基本上没有什么耗时的查询操作,完全不需要什么算法,直接用暴力做法硬莽就是了。
由于新增了两种UML图,我新增加了两个模块进行管理:
这次作业需要增加Rule的check操作,一共八条,可能是因为在烤漆,整体实现难度不太高
Rule3
和Rule4
要求接口不能重复继承接口,类不能重复继承类,类不能重复实现接口。
由于在我的架构中,@H_931_15@myinfoLoader在读取信息的时候需要将实现的类或者继承的类(接口)存进属性,只需要对于第一次作业信息读取存储的部分加一个判断,并提供一个flag
,如果存储信息的过程中出现了不合法的行为,那就直接把对应的flag
置为有效,检查的时候查对应的flag
就行了
比如在Rule4的检查中:
如果没有update并且父类不为空,这时候更新他的继承的接口首先需要递归地更新他父类的接口,然后检查一下父类是否合法(如果父类标志位有效,子类置标志位)
再对父类实现的接口做一遍更新,同时如果接口标志位有效(不合法)那子类肯定不合法,置标志位。
最后把所有的接口合在一起去重,看是否有重复的,如果有表明需要置标志位,无效。
在check
模块中只需要对每个类更新一下,然后查一下标志位就好了:
public void checkForUml003() throws UmlRule003Exception {
HashMap<String,MyInterface> id2Interface = myUmlClassModelInteraction.getId2Interface();
Iterator iterator = id2Interface.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String,MyInterface> entry = (Map.Entry)iterator.next();
MyInterface myInterface = entry.getValue();
myUmlClassModelInteraction.updateFatherInterface(myInterfacE);
}
iterator = id2Interface.entrySet().iterator();
HashSet<UmlInterface> ans = new HashSet<>();
while (iterator.hasNext()) {
Map.Entry<String,MyInterface> entry = (Map.Entry)iterator.next();
MyInterface myInterface = entry.getValue();
if (myInterface.getDup() == truE) {
ans.add(myInterface.getUmlInterface());
}
}
if (!ans.isEmpty()) {
throw new UmlRule003Exception(ans);
}
}
Rule2
有里面关于类和接口是否成环的问题,因为CPU时间十分充裕,直接用暴力做法就好,需要注意的是,对于已经遍历过的点需要打上标记,否则将导致TLE
关于类的成环问题,由于只存在单继承,最简单的做法就是一直查父类,看是否能回到开始的类,如果能,说明类的继承会成环
需要注意的是,当所查的类在一个环之外的时候,会出现死循环,所以还得记录查找路径,当再次出现记录的路径里的类的时候应该结束查找。
接口成环我采用了bfs如果会回到最初的接口表示成环,注意为查过的点打上flag
第一单元:第一次自己动手写评测机,对于个方面都不太熟悉,加上第一单元我并不是很会递归下降,不仅作业中读取很费力,评测机的数据生成也很费力,即使勉勉强强生成了数据强度也还是不高,导致第一单元作业中有很多bug@H_675_5@泪目@H_197_6@,具体来说我的做法就是通过正则表达式解析逆向生成数据,然后跑出结果,然后与正确结果对拍,正确结果来自Python
里的sympy
……掌握了评测机的主要搭建思路:
(构造数据->用命令行跑代码并记录结果->与其他结果对拍并记录对拍结果)为后面的评测机书写打好了基础。
第二单元:在Python
中构造电梯类,生成数据之后,跑代码,每输出一个提示信息,就读取并解析,更新Python
中电梯类的相关状态并检查,一旦不合规范就相应的错误
第三单元:随机生成各种数据(强度可能不高,用数量保证质量),然后找几个同学一起跑并对拍;专门构造一些容易超时的针对性数据,用time
库来测运行时间,精度很高
第四单元:先自己构造各种边界数据,考虑到一些基本情况,进行手动人工测试,确保程序大致正确。然后手工生成针对性数据,多个同学一起跑并对拍。
一学期的OO课终于结束啦!总结了一下,大概有一下收获:
以上是大佬教程为你收集整理的OO unit4 summary全部内容,希望文章能够帮你解决OO unit4 summary所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。