北航20级oo课程第四单元总结
OO第四单元总结
第四单元架构:
第四单元的作业需要我们自建MyImplementation类,实现UserApi接口的方法,当然,在实际上手的时候,我对一些常用方法进行了封装,在使用时,调用自建的Tool类中的静态方法;同时,对于hw15的自检方法,我也用自建的Check类进行实现,使得MyImplementation类中实现的功能不必太过于集中。
Tool类:
1 public class Tools { 2 public static String searchClassId(ArrayList<UmlElement> umls, String className) 3 throws ClassNotFoundException, ClassDuplicatedException; 4 5 public static String searchInteractionId(ArrayList<UmlElement> umls, String interactionName) 6 throws InteractionNotFoundException, InteractionDuplicatedException; 7 8 public static String searchLifelineId(ArrayList<UmlElement> umls, String lifelineName, 9 String interactionid, String interactionName) 10 throws LifelineNotFoundException, LifelineDuplicatedException; 11 12 public static String searchRegionId(ArrayList<UmlElement> umls, String stateMachineName) 13 throws StateMachineNotFoundException, StateMachineDuplicatedException; 14 15 private static boolean isWrongType(NameableType type, Direction direction); 16 17 public static void countDegree(ArrayList<UmlElement> umls, String className, 18 String methodName, String curid, 19 HashMap<String, HashMap<String, Integer>> couplingdegree, 20 HashMap<String, Integer> degreecount, 21 HashMap<String, ArrayList<String>> record) 22 throws MethodWrongTypeException, MethodDuplicatedException; 23 24 public static void generalInterface(ArrayList<UmlElement> umls, ArrayList<String> record); 25 26 public static boolean iscritical(ArrayList<UmlElement> umls, 27 HashMap<String, ArrayList<String>> region, 28 ArrayList<String> recored, String criticalid, 29 String regionid, ArrayList<String> endstates); 30 31 private static boolean isReachable(HashMap<String, ArrayList<String>> region, 32 ArrayList<String> recored, 33 int length, ArrayList<String> endstates); 34 35 private static boolean search(HashMap<String, ArrayList<String>> region, 36 ArrayList<String> recored, String criticalid, 37 int length, ArrayList<String> endstates); 38 }
上述框架中public修饰的方法被MyImplementation类调用,private修饰的方法则是被public修饰的方法进行调用。
Check类:
1 public class Check { 2 public static void checkForUml001(ArrayList<UmlElement> umls) throws UmlRule001Exception; 3 4 public static void checkForUml002(ArrayList<UmlElement> umls) throws UmlRule002Exception; 5 6 private static void checkName(ArrayList<UmlElement> umls, 7 HashMap<String, ArrayList<UmlAssociationEnd>> classes1, 8 HashMap<String, ArrayList<UmlAttribute>> classes2, 9 HashMap<String, String> classId2name, 10 Set<AttributeClassInformation> pairs); 11 12 public static void checkForUml003(ArrayList<UmlElement> umls) throws UmlRule003Exception; 13 14 private static boolean isCircle(HashMap<String, ArrayList<String>> father2children, 15 String father, String target, ArrayList<String> record, 16 ArrayList<String> result); 17 18 public static void checkForUml004(ArrayList<UmlElement> umls) throws UmlRule004Exception; 19 20 private static boolean isRepeated(HashMap<String, ArrayList<String>> child2fathers, 21 String child, ArrayList<String> record); 22 23 public static void checkForUml005(ArrayList<UmlElement> umls) throws UmlRule005Exception; 24 25 public static void checkForUml006(ArrayList<UmlElement> umls) throws UmlRule006Exception; 26 27 public static void checkForUml007(ArrayList<UmlElement> umls) throws UmlRule007Exception; 28 29 public static void checkForUml008(ArrayList<UmlElement> umls) throws UmlRule008Exception; 30 31 public static void checkForUml009(ArrayList<UmlElement> umls) throws UmlRule009Exception; 32 }
对作业架构的反思:
在作业中,对于传入的uml类,我只是笼统地用一个ArrayList进行了存储,没有进行分类整理,导致后面方法中需要不停的遍历来获取需要的信息,虽然UML类图中包含的内容不会太多,多次的遍历不会使我超出测评的时间限制,但是,这样做在逻辑层面不够完善,多次遍历的时候,也容易疏忽产生bug,对于纠错排查来说十分不便。
架构设计思维及OO方法理解的演进:
第一单元:
从这一单元中,我初步理解了oo面向对象的思维方式,学会对问题进行层次化地抽象分析。一开始,第一次作业我完全依靠面向过程的思路对问题进行理解,后来不得已对自己的代码进行了重构,在重构的过程中,我依照老师的思路,将表达式进行了拆解并建立对应的类,从最基本的因子到项再到表达式,通过层层地抽象,一个复杂的表达式最终被拆分成了一个有一个具体的对象,这个时候,只需要对每个对象进行针对该对象的操作,就可以方便地得出最终结果。相比面向过程的繁琐步骤,面向对象不仅思路清晰,而且可扩展性强,针对作业提出的新要求,我们只需要添加新的类而不用对前面已经实现的逻辑进行大改。
第二单元:
多线程是我们从第二单元接触的新概念,相比单线程,多线程之间可以灵活交互,但是同样也产生了线程安全的问题。在这一单元中,理解多线程并不困难,然而想要管理好线程之间的交互,保证线程安全却是一大难题,为此我们需要建立一个线程的控制类方便对线程的管理,同时还得防止死锁、轮询、忙等的出现。
第三单元:
通过学习jml规格,使得我们能够理解并实现jml规格,但学会jml不是本单元的目的,本单元实际上是为了让我们理解并体会“契约式编程”,毕竟在团队开发中,我们需要代码能够满足一定的功能需求,具有高复用性,高可靠性,并且便于测试。同时,我们需要注意,契约只是对程序功能的限制,具体实现需要我们自己决定。
第四单元:
这一单元主要是对UML模型以及语言的理解,UML模型很好地反映了面向对象的编程思想,系统学习UML模型能够有助于我们对程序进行设计规划,同时,通过编写程序解析UML对象之间的关系,使得我们对于UML模型层次化建模有了更加深入的理解。
测试理解与实践的演进:
在本学期的oo课程中,我并没有采用自动化测试等测试方法,基本上都是手动构造数据进行测试,有些时候还由于对题目理解的偏差导致自己误以为程序的结果是正确的,这一点很糟心。
在这四个单元中,构造数据基本上按照功能测试-随便构造数据-极端数据这三个步骤来的,第一步功能测试主要是验证各个方法的正确性,确保单独执行时能按照期望运行;第二步就是随便构造数据,测试单一功能组合起来后会不会出现bug;第三步极端数据主要考虑变量的表示范围,以及运行时间,然而实际构造时,我都有些疏忽,没能完全检测出bug。
课程收获:
在oo课程中,我不仅仅是掌握了基本的java语言,还学到了许多编程思想,层次化和面向对象的思想对于我以后的编程任务有着重要的指导作用。此外,oo课程中,我第一次接触到了多线程的相关知识,在学习oo之前,我实现的c语言编程基本都是一条main函数跑到底,但是接触多线程后,我发现自己可以实现不同线程之间的交互,虽然会有线程安全的问题出现,但是我感觉编程的世界一下子丰富了许多,利用多线程,我甚至可以编写一些简单的游戏,这令我感到十分有趣。
改进建议:
1.希望每次线上考试之前,如果有涉及到新的设计模式,或者函数,希望能提前下发预习文档,否则容易上机的时候一脸懵逼。
2.第二单元的内容建议也放进假期pre当中,多线程最好早点让同学们有个基本的理解,否则电梯月开始才学时间上十分紧张。
3.第三单元jml读起来太痛苦了,完全可以考虑换个更好的来替代jml,毕竟重点是契约式编程,换个工具不影响。