OO第13-14次作业总结
面向对象第13-14次作业总结博客
1、设计分析
这个单元是我做的最差的一个单元。总工程量超过2000行(有效代码量1200左右),但两次都炸掉。
1.1、第13次作业--UML类图的解析
根据给定的UML类图部分内容,解析出关于类、方法、属性的相关信息。需要考虑继承等细节。
这是面向对象和容器类选择的综合考量。
架构上,首先实现对外接口。其次,对不同的UML元素采取不同处理:对于类,自定义一个ClassInfo
类,存放和类相关的信息,比如父类、实现的接口、属性、方法等;对于接口,直接列一个邻接表,存放extends的接口。其它元素,表示的是类的成员和关系,做其他处理。架构设计没有任何思维难度。
另外,就是题目要求用类名、方法名、属性名等查找,所以要区分id和name,并采取不同的索引容器。大量用HashMap
和HashSet
。这样可以根据contains
系列检查存在性,根据size
系列检查唯一性。
最难的地方,在于以下几个命令:实现的所有接口;属性查找(考虑继承);关联(考虑继承)。考虑继承,就需要设计一个递归的结构,和递归的处理方法。另外就是,为了保证效率,在查找后缓存在类信息中,便于重复查找。
这次本来很稳当的,最容易错的地方都专门考虑和测试了。但是,没想到错在一个指导书语焉不详的地方:属性可见性检查,需要输出属性名+类名。这个类名,是原始类名的意思,而不是提供的classname。虽说语焉不详,但是这种错误的根源在我,没有张口去问,想当然。
UML类图
复杂度分析
方法
Method | ev(G) | iv(G) | v(G) |
---|---|---|---|
ClassInfo.addAssociation(String,boolean) | 1.0 | 2.0 | 2.0 |
ClassInfo.addAttr(UmlAttribute,String) | 1.0 | 3.0 | 4.0 |
ClassInfo.addInterface(String,String) | 2.0 | 2.0 | 2.0 |
ClassInfo.addOperation(UmlOperation) | 1.0 | 2.0 | 2.0 |
ClassInfo.addPara(UmlParameter) | 2.0 | 2.0 | 3.0 |
ClassInfo.ass() | 1.0 | 1.0 | 1.0 |
ClassInfo.ClassInfo(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.getAssList() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAssSet() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAttributes() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAttributeVisibility(String) | 3.0 | 1.0 | 3.0 |
ClassInfo.getClassName() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaceIds() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaceMap() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaces() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNotHiddenList() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfAss() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfAttr() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfSelfAttr() | 1.0 | 1.0 | 1.0 |
ClassInfo.getOperations() | 1.0 | 1.0 | 1.0 |
ClassInfo.getOptCnt(OperationQueryType) | 2.0 | 2.0 | 2.0 |
ClassInfo.getSuperClassId() | 1.0 | 1.0 | 1.0 |
ClassInfo.getTopClassId() | 1.0 | 1.0 | 1.0 |
ClassInfo.getTopClassName() | 1.0 | 1.0 | 1.0 |
ClassInfo.hasInterfacesCompleted() | 1.0 | 1.0 | 1.0 |
ClassInfo.isInterfacesCompleted() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperAssIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperAttrIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperInterfaceIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.setAssList(LinkedList) | 1.0 | 1.0 | 1.0 |
ClassInfo.setNumOfAss(int) | 1.0 | 1.0 | 1.0 |
ClassInfo.setSuperClassId(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.setTopClassId(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.setTopClassName(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasAssIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasAttrIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasInterfaceIncluded() | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.addAss(UmlAssociation) | 1.0 | 3.0 | 3.0 |
MyUmlInteraction.addAssociationEnd(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.addAttribute(UmlElement) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.addClass(UmlElement) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.addGen(UmlGeneralization) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.addInterface(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.addInterfaceGroup(ClassInfo) | 2.0 | 4.0 | 5.0 |
MyUmlInteraction.addOpt(HashMap,String) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.addParam(UmlParameter) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.addRealization(UmlInterfaceRealization) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.addSuperAss(String) | 2.0 | 3.0 | 4.0 |
MyUmlInteraction.addSuperAttr(String) | 2.0 | 4.0 | 5.0 |
MyUmlInteraction.addSuperInterface(String) | 1.0 | 3.0 | 3.0 |
MyUmlInteraction.checkException(String) | 3.0 | 1.0 | 3.0 |
MyUmlInteraction.findTopClass(String) | 2.0 | 3.0 | 3.0 |
MyUmlInteraction.getClassAssociatedClassList(String) | 1.0 | 3.0 | 3.0 |
MyUmlInteraction.getClassAssociationCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.getClassAttributeCount(String,AttributeQueryType) | 4.0 | 4.0 | 4.0 |
MyUmlInteraction.getClassAttributeVisibility(String,String) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.getClassCount() | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.getClassOperationCount(String,OperationQueryType) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.getClassOperationVisibility(String,String) | 1.0 | 3.0 | 3.0 |
MyUmlInteraction.getImplementInterfaceList(String) | 1.0 | 2.0 | 2.0 |
MyUmlInteraction.getInformationNotHidden(String) | 1.0 | 1.0 | 1.0 |
MyUmlInteraction.getTopParentClass(String) | 2.0 | 1.0 | 2.0 |
MyUmlInteraction.MyUmlInteraction(UmlElement...) | 3.0 | 8.0 | 17.0 |
Total | 80.0 | 104.0 | 123.0 |
Average | 1.27 | 1.6507936507936507 | 1.95 |
类
Class | OCavg | WMC |
---|---|---|
ClassInfo | 1.30 | 48.0 |
MyUmlInteraction | 2.88 | 75.0 |
Total | 123.0 | |
Average | 1.95 | 61.5 |
细节越多,复杂度越大。这次考虑的细节非常之多,越写越堆积。所以,架构设计还是非常重要的,一不小心就超行数。把ClassInfo
类独立出来是一个明智的选择。
1.2、第14次作业--类图、顺序图、状态图的解析
类图延续了上次的。于是,bug修复之后,以为这次会简单,谁知指导书自相矛盾,越写越陷入了循环迭代。提问区反复提问才搞清楚情况。自己菜没办法。OO炸四次,总成绩能不能上80还说不准呢。大学第一个70分的课程就要这样诞生了吗。听说,往届一般有40%的人是90+,大部分的人只炸一次,甚至一次不炸。唉,这课算学的彻底失败了。这门课也决定了这学期绩点不仅不能弥补上学期,反而比上学期更烂。
这次又需要检查合法性。这三个检查函数是老大难,差不多有400行左右的代码是关于有效性检查的。
无论怎样,来说说架构设计。依然是,类、状态机、时序图定义自己的Info类。Class MyInteraction extends MyClassInteraction implements Interaction
,也就是继承上次的类图解析类,避免直接复制。
最难的就是有效性检查。首先是重名问题。这个简单。循环继承,也简单,dfs找强连通分量(或者直接找环)。难中之难是这个Uml009,也就是重复继承。不仅要检查接口重复继承,还要检查类实现接口的这种问题。就错在这个函数上,全军覆没。我觉得其它问题,都是
其实方法也没有思考难度,仅仅是求类实现的所有接口,以及接口继承的所有接口。但问题就在于如何保证不重复。由于循环继承的问题已经排除,所以最好的办法就是自顶向下。一旦发现重复就加入异常类/接口表中。
运是强者的谦辞,命是弱者的借口。承认自己的不足比什么都有用。工程能力并不是一朝一夕练就的,得到今天这个落魄下场,也全是我自己的过错,怪不得任何规则。
UML类图
复杂度分析
方法
Method | ev(G) | iv(G) | v(G) |
---|---|---|---|
ClassInfo.addAssociation(String,String,boolean) | 1.0 | 3.0 | 3.0 |
ClassInfo.addAttr(UmlAttribute,String) | 1.0 | 3.0 | 4.0 |
ClassInfo.addInterface(String,String) | 1.0 | 2.0 | 2.0 |
ClassInfo.addOperation(UmlOperation) | 1.0 | 2.0 | 2.0 |
ClassInfo.addPara(UmlParameter) | 2.0 | 2.0 | 3.0 |
ClassInfo.ass() | 1.0 | 1.0 | 1.0 |
ClassInfo.ClassInfo(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.getAssList() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAssSet() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAttributes() | 1.0 | 1.0 | 1.0 |
ClassInfo.getAttributeVisibility(String) | 3.0 | 1.0 | 3.0 |
ClassInfo.getClassName() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaceIds() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaceMap() | 1.0 | 1.0 | 1.0 |
ClassInfo.getInterfaces() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNotHiddenList() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfAss() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfAttr() | 1.0 | 1.0 | 1.0 |
ClassInfo.getNumOfSelfAttr() | 1.0 | 1.0 | 1.0 |
ClassInfo.getOperations() | 1.0 | 1.0 | 1.0 |
ClassInfo.getOptCnt(OperationQueryType) | 2.0 | 2.0 | 2.0 |
ClassInfo.getSuperClassId() | 1.0 | 1.0 | 1.0 |
ClassInfo.getTopClassId() | 1.0 | 1.0 | 1.0 |
ClassInfo.getTopClassName() | 1.0 | 1.0 | 1.0 |
ClassInfo.hasAssName(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.hasInterfacesCompleted() | 1.0 | 1.0 | 1.0 |
ClassInfo.isDup() | 1.0 | 1.0 | 1.0 |
ClassInfo.isInterfacesCompleted() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperAssIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperAttrIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.isSuperInterfaceIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.setAssList(LinkedList) | 1.0 | 1.0 | 1.0 |
ClassInfo.setNumOfAss(int) | 1.0 | 1.0 | 1.0 |
ClassInfo.setSuperClassId(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.setTopClassId(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.setTopClassName(String) | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasAssIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasAttrIncluded() | 1.0 | 1.0 | 1.0 |
ClassInfo.superHasInterfaceIncluded() | 1.0 | 1.0 | 1.0 |
MachInfo.addState(UmlElement) | 1.0 | 3.0 | 4.0 |
MachInfo.addTrans(String,String,boolean) | 1.0 | 3.0 | 4.0 |
MachInfo.getStateNum() | 1.0 | 1.0 | 1.0 |
MachInfo.getSubNum(String) | 3.0 | 2.0 | 3.0 |
MachInfo.getTransNum() | 1.0 | 1.0 | 1.0 |
MachInfo.MachInfo(String) | 1.0 | 1.0 | 1.0 |
MachInfo.subBfs(String) | 2.0 | 3.0 | 4.0 |
MyUmlClassInteraction.addAss(UmlAssociation) | 1.0 | 3.0 | 3.0 |
MyUmlClassInteraction.addAssociationEnd(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.addAttribute(UmlElement) | 1.0 | 2.0 | 2.0 |
MyUmlClassInteraction.addClass(UmlElement) | 1.0 | 2.0 | 2.0 |
MyUmlClassInteraction.addGen(UmlGeneralization) | 1.0 | 3.0 | 3.0 |
MyUmlClassInteraction.addInterface(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.addInterfaceGroup(ClassInfo) | 2.0 | 3.0 | 4.0 |
MyUmlClassInteraction.addOpt(HashMap,String) | 1.0 | 2.0 | 2.0 |
MyUmlClassInteraction.addParam(UmlParameter) | 1.0 | 2.0 | 2.0 |
MyUmlClassInteraction.addRealization(UmlInterfaceRealization) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.addSuperAss(String) | 2.0 | 3.0 | 4.0 |
MyUmlClassInteraction.addSuperAttr(String) | 2.0 | 4.0 | 5.0 |
MyUmlClassInteraction.checkException(String) | 3.0 | 1.0 | 3.0 |
MyUmlClassInteraction.classAddSuperInterface(String) | 1.0 | 3.0 | 3.0 |
MyUmlClassInteraction.findTopClass(String) | 2.0 | 3.0 | 3.0 |
MyUmlClassInteraction.getClassAssociatedClassList(String) | 1.0 | 3.0 | 3.0 |
MyUmlClassInteraction.getClassAssociationCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getClassAttributeCount(String,AttributeQueryType) | 4.0 | 4.0 | 4.0 |
MyUmlClassInteraction.getClassAttributeVisibility(String,String) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getClassCount() | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getClassMap() | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getClassOperationCount(String,OperationQueryType) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getClassOperationVisibility(String,String) | 1.0 | 3.0 | 3.0 |
MyUmlClassInteraction.getElementMap() | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getImplementInterfaceList(String) | 1.0 | 2.0 | 2.0 |
MyUmlClassInteraction.getInformationNotHidden(String) | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getInterfaceDup() | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getInterfaces() | 1.0 | 1.0 | 1.0 |
MyUmlClassInteraction.getTopParentClass(String) | 2.0 | 1.0 | 2.0 |
MyUmlClassInteraction.interfaceAddSuper(String) | 2.0 | 7.0 | 7.0 |
MyUmlClassInteraction.MyUmlClassInteraction(UmlElement...) | 3.0 | 8.0 | 17.0 |
MyUmlGeneralInteraction.addInter(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.addMach(UmlElement) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.addTrans(UmlTransition) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.checkForUml002() | 2.0 | 5.0 | 6.0 |
MyUmlGeneralInteraction.checkForUml008() | 2.0 | 9.0 | 9.0 |
MyUmlGeneralInteraction.checkForUml009() | 6.0 | 12.0 | 12.0 |
MyUmlGeneralInteraction.classDfs(String,HashSet,HashSet) | 2.0 | 4.0 | 4.0 |
MyUmlGeneralInteraction.getIncomingMessageCount(String,String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.getMessageCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.getParticipantCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.getStateCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.getSubsequentStateCount(String,String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.getTransitionCount(String) | 1.0 | 1.0 | 1.0 |
MyUmlGeneralInteraction.interException(String) | 3.0 | 2.0 | 3.0 |
MyUmlGeneralInteraction.interfaceDfs(String,HashSet,HashSet) | 2.0 | 4.0 | 4.0 |
MyUmlGeneralInteraction.machException(String) | 3.0 | 2.0 | 3.0 |
MyUmlGeneralInteraction.MyUmlGeneralInteraction(UmlElement...) | 2.0 | 3.0 | 10.0 |
MyUmlGeneralInteraction.retFromRecur(String,HashSet) | 1.0 | 3.0 | 3.0 |
MyUmlGeneralInteraction.tempAdd(UmlElement,HashMap>) | 1.0 | 2.0 | 2.0 |
SeqInfo.addMsg(UmlMessage) | 1.0 | 2.0 | 2.0 |
SeqInfo.addObj(UmlLifeline) | 1.0 | 2.0 | 2.0 |
SeqInfo.getIncome(String) | 3.0 | 2.0 | 3.0 |
SeqInfo.getMsgNum() | 1.0 | 1.0 | 1.0 |
SeqInfo.getObjNum() | 1.0 | 1.0 | 1.0 |
SeqInfo.SeqInfo(String) | 1.0 | 1.0 | 1.0 |
Total | 138.0 | 196.0 | 230.0 |
Average | 1.35 | 1.92 | 2.25 |
类
Class | OCavg | WMC |
---|---|---|
ClassInfo | 1.31 | 51.0 |
MachInfo | 2.57 | 18.0 |
MachInfo.StateInfo | 0.0 | |
MyUmlClassInteraction | 2.68 | 83.0 |
MyUmlGeneralInteraction | 3.21 | 61.0 |
SeqInfo | 1.67 | 10.0 |
Total | 223.0 | |
Average | 2.19 | 37.17 |
耦合度分析
ClassInfo | 0.0 | 0.0 | 0.0 | 2.0 | 4.0 |
MachInfo | 0.0 | 1.0 | 1.0 | 1.0 | 3.0 |
MachInfo.StateInfo | 0.0 | 0.0 | 0.0 | 1.0 | 4.0 |
MyUmlClassInteraction | 0.0 | 1.0 | 1.0 | 1.0 | 3.0 |
MyUmlGeneralInteraction | 1.0 | 4.0 | 5.0 | 2.0 | 2.0 |
SeqInfo | 1.0 | 1.0 | 5.0 | 1.0 | 2.0 |
Total | |||||
Average | 0.33 | 1.17 | 2.0 | 1.33 | 3.0 |
2、架构总结、测试
架构:
第一单元多项式,使用了抽象类和类的递归结构。重点运用了方法重写。
第二单元多线程,了解了单例模式和工厂模式。会运用锁和同步。
第三单元图算法,了解了多重容器的使用,类的解耦。另外就是利用类的继承进行迭代开发。
第四单元UML,依然是迭代开发。接口独立,算法和容器开类封装。
其实越到后面,OO方法的选择,是一个自然而然的事情,并没有特意去思考哪一种设计模式,哪一种架构,而是根据需求。需求是一切设计的出发点和落脚点。甚至说,哪一种设计模式,我连名字听都没听说过,但是,一说大意,立马就知道自己用过。
测试:
第一单元使用对拍器,借助Python的数学工具。
第二单元改装定时输入接口。借用别人的special judge。
第三单元学会了Junit。
第四单元,手造类图+随机命令+对拍。
尤其是Junit的学习,受益匪浅。虽然依然隐藏着不明bug,但是,至少Junit的使用可以让我避免一些无脑错误。
测试手段也是一个循序渐进的过程。从最初像OJ题那样的对拍,到Junit等工具。测试的目的并不是证明自己没有错误,而是发现自己的错误。但并不是所有错误都可以通过测试检查出来。只有缜密的设计思维,才能从根本上避免错误。测试仅仅是针对自己的实现层面易错的地方进行,不能解决设计层面的纰漏。我这两个单元的惨败,就是因为设计思维的漏洞,用错误测试错误。
3、课程收获和建议
收获
最初步的收获,就是Java用得滚瓜烂熟。
第一单元,初步的“编译原理”。重点是类的迭代结构。继承和多态,这是所有OO设计的基础。
第二单元,把多线程摸了个门清。这是游戏体验最好的一个单元。
第三单元,复习了图算法。
第四单元,大工程量下的压力测试。并没有助教说的很简单,其实每年的最后一个单元都是大boss级别。
总的收获就是,OO设计模式的了解,以及算法、工程能力的提升。虽然这个课的作业写的很失败,但并不代表没用。
看到知乎上,有好多往届人故意攻击OO课程的,我觉得,他们就是像我这样炸过好几次作业的人,不懂得从自身分析问题,而去怪罪课程规则。我并没有标榜我的高尚,而是觉得他们这种键盘侠非常“睿智”。
这门课的体系还是非常好的,只不过,美中不足的地方在于指导书的自恰性不足,有好多有歧义的话,有可能有两种完全不同的实现。我能理解,指导书设计过程中,有好多难以全面考虑的地方,我们设计程序会犯错误,为什么不能设身处地想一下助教设计指导书也会有错误呢?毕竟,这种实验类的课程,助教也在为了精品作业而殚精竭虑。他们也有自己的课程,并不是全职服务员。
另外这门课的结果,也是我的反面教材,深刻的教训就是,一切设计都要有缜密的思维,方方面面都必须考虑清楚。只有这样才能得心应手。
建议
1、比如测试数据,至少提供一组强测数据,针对我们可能的错误来做自我检查。
2、编写指导书的时候,尽量考虑语言上的歧义情况,以及测试标准,数据限制等等。
3、在烤漆的作业,能否减少工程量,可以更多精力投入烤漆(不过这一点,我觉得其实可以忽略,因为总有人可以完成,物竞天择适者生存,我完不成我就应该接受被淘汰的结果。如果一门课让所有人都拿高分,这门课反倒没意义,我这么建议,对能完成的人实际上并不公平)。
我想对自己说的话:OO已结束,新征程将要开启。无论过去的结果如何,都已经成为过去。以史为鉴面向未来,相信失败乃成功之母。
OO第13-14次作业总结的更多相关文章
- 面向对象OO第1-3次作业总结
面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...
- OO第四单元UML作业总结暨OO课程总结
目录 目录一.第四单元UML两次作业架构设计第一次作业第二次作业二.架构设计总结与OO方法理解演进三.测试理解与实践演进四.课程收获总结五.课程改进建议六.尾声 一.第四单元UML两次作业架构设计 第 ...
- Week14《Java程序设计》第14次作业总结
Week14<Java程序设计>第14次作业总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何 ...
- js如何判断一组数字是否连续,得到一个临时数组[[3,4],[13,14,15],[17],[20],[22]];
var arrange = function(arr){ var result = [], temp = []; arr.sort(function(source, dest){ return sou ...
- intellij idea 13&14 插件推荐及快速上手建议 (已更新!)
原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转 ...
- OO第二次博客作业——电梯调度
OO第二次博客作业——电梯调度 前言 最近三周,OO课程进入多线程学习阶段,主要通过三次电梯调度作业来学习.从单部电梯的傻瓜式调度到有性能要求的调度到多部电梯的调度,难度逐渐提升,对同学们的要求逐渐变 ...
- OO第二次博客作业—17373247
OO第二次博客作业 零.写在前面 OO第二单元宣告结束,在这个单元里自己算是真正对面向对象编程产生了比较深刻的理解,也认识到了一个合理的架构为编程带来的极大的便利. (挂三次评测分数 看出得分接近等差 ...
- TeamViewer 12\13\14 破解版(解决检测为商业用途的方式)
一.Windows系统下破解TeamViewer的方式 1.用Windows直接卸载本地的TeamViewer软件2.下载一个Everything软件,并安装好它(这是一个搜索本机文件的工具,超级好用 ...
- 剑指offer19:按照从外向里以顺时针的顺序依次打印出每一个数字,4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
1 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印 ...
- 【20171027中】alert(1) to win 第13,14,15,16题
第13题 题目: function escape(s) { var tag = document.createElement('iframe'); // For this one, you get t ...
随机推荐
- SP1716 GSS3
题意翻译 \(n\) 个数,\(q\) 次操作 操作\(0\) \(x\) \(y\)把\(A_x\) 修改为\(y\) 操作\(1\) \(l\) \(r\)询问区间\([l, r]\)的最大子段和 ...
- ECharts 上手
一.获取 ECharts 你可以通过以下几种方式获取 ECharts. 从官网下载界面选择你需要的版本下载,根据开发者功能和体积上的需求,我们提供了不同打包的下载,如果你在体积上没有要求,可以直接下载 ...
- Flask&&人工智能AI --3
一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...
- 剑指Offer——数组中出现次数超过一半的数字——一题多解
看题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- python3+Appium自动化03-Appium元素检测
需要导入方法NoSuchElementException from appium import webdriver from selenium.common.exceptions import NoS ...
- Linux Shell简单命令
sudo uname --m 查看操作系统位数sudo uname --s 显示内核名字ssudo uname --r 显示内核版本sudo uname --n 显示网络主机名sudo uname - ...
- 【Linux】Linux常用命令大全
系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...
- java多线程基础(二)--java多线程的基本使用
java多线程的基本使用 在java中使用多线程,是通过继承Thread这个类或者实现Runnable这个接口或者实现Callable接口来完成多线程的. 下面是很简单的例子代码: package c ...
- PHP面向对象编程一
php面向对象编程(一) 类与对象关系: 类就像一个人类的群体 我们从类中实例化一个对象 就像是制定一个人. 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何 ...
- IE6、7下块级元素设置display:inline-block不换行的解决办法
使用背景 在实际的工作中,我们有的时候会把块元素设置为inline-block,这样做的目的有2个,一是块元素能够排列到一行,二是块元素就形成包裹性,能够自适应content area,而不必设置宽和 ...