BUAA OO unit_4 & conclusion
本次作业是完成UML类图分析器,对UML类进行分析包含有
架构图:
1.总结本单元作业的架构设计
本次作业是完成UML类图分析器,对UML类进行分析包含有
第一次作业是单独对class model进行分析,第二次加入了对流程图和状态图的分析,最后一次加入了对图形的正确性的分析,因此,这三次可以比较顺利严格的进行增量迭代,引入第15次作业的架构进行说明。
对输入数据进行分类,每一种元素应该属于哪个类,就按照其所属分配到相应的类图模块中。class model我直接通过实现接口UmlClassModelInteraction
,其余类推。
在class model中,包含有class,operation,interaction这些小的具有较为独立但是复杂的元素,可以实现对父类寻找、参数寻找、关联类、接口寻找等等的指令。collaboration这一类中,会存在多个独立的interaction模块,因此设立singlecollaboration
对单独的交互模块进行分析,包含了participant没有单独设置成一个类,直接用map对其消息进行管理。状态图分析,同上分析,加上了独立的状态转换图,但是单独分出一个state类,对要查询状态之间的迁移情况、本身的性质进行管理。
在各种类图类中加入正确性的检验,然后用MyUmlGeneralInteraction
对这些实现了对应接口的类进行引用,直接调用接口的方法或者检验正确性的方法。
2.总结自己在四个单元中架构设计及OO方法理解的演进
第一单元:对包含简单幂函数和简单正余弦函数及其嵌套组合函数的导函数的求解。
这一单元就是让我们去适应从以前C语言面对过程,一个程序实现一个功能,一个程序包含所有元素的思想转到面向对象,对问题中出现的元素进行分解,分层,再将其联系组合实现丰富多样的功能。
这一单元中,可以很自然的按照所出现的因子、项、表达式这几种明显的层次对类进行划分,每个类只需要管理好自己的层次的计算规则。
这个单元还运用了工厂模式对因子的初始化进行统一的管理。
第二单元:电梯
这一单元是让我们了解多线程程序设计,并且包含有许多新的设计模式。
在这个单元中,多线程的协调分配,电梯调度策略,共享资源的管理是多线程设计中所学到的新的思路。在架构中,这一单元主要是设立有电梯、调度器、人、等待队列这几类。并且更加关注各个类之间的协作、应答响应、每个时态的状态。要防止死锁、特别耗时耗能的轮询等多线程经典bug,还需要平衡下中心调度、分布式调度的性能优势、架构的优势。
这一单元学习了生产者消费者模式,策略模式等。
第三单元:JML
这一单元学习的JML规格,对它的理解以及部分自己编写JML。这个单元中,主要是对规格的描述进行实现,对于具体的实现方式可以自己进行选择,比如容器、算法这些方面,但是主要的架构还是严格按照规格指定的来写即可。我对规格的想法就是它有点像对目的的描述,但有时又像是对具体的实施的方法的描述,但总总而言之就是对逻辑的约束。
第四单元:UML分析器
这一单元的架构如上所述,主要是更加了解了UML类图是如何进行联系、构建的,我将元素打得很散,分列出很多可能并没有太大必要去实现的对象,缺少了对过程、一个总体上真正的需求的类的分析提取。
3.总结自己在四个单元中测试理解与实践的演进
第一单元:这个单元第一二次作业不是特别难,但是由于第一次作业时没有对规则考虑完全,正则表达式出现错误,第二次又滥用递归导致超时,第三次作业的时候,改编了z同学第二次作业的python写的测评机,在正确率上没有问题了。在这一单元中,一个我比较深入关注到的是,如何去判断两个元素相同或者是我所需要归为一类的,而我写的判断函数总是出现缺陷。此外就是优化,我主力放在去括号和合并同类项上面,在这个过程中主要是靠上面的equal函数以及递归去括号,几种去括号的情况的分类。(虽然最后提交的时候还是怂了在能加括号的地方给他补上)
第二单元:这个单元的第一次作业是整个OO作业中对我来说最难的,因为我很难理解多线程这个新的概念,并且对于消费者生产者模式最初我完全不懂,不知道在这种多线程中,到底什么算是生产者什么算消费者又该用什么去表示,我后来明白了多线程可以姑且从宏观上理解为几个“程序”同时一起工作。才勉强写完了程序但是完全没有理解死锁等问题。第二次作业通过找bug理解了死锁和调度问题,迭代较快。在第三次时我尝试了另一种电梯抢人的调度。
这个单元从第二次作业开始我借助了同学的数据转化输入代码,将造的大量随机数据输入,不检验正确性,仅仅考虑是否会产生因为死锁或者其他线程不安全问题导致的TLE问题。
第三单元:这一单元学习了JML,这次由于一个小bug导致我错的很惨,然后我终于开始摸索写个测评机,各种诡异的转来转去,python造数据,C对拍,bat用于cmd进行数据输入输出导出,多谢l同学的建议...总算折腾出一个。然后第二三次作业强测结果比较好了。
第四单元:这个单元是最初理解整个类图很困难,这些元素代表着什么,又该如何通过输入的去建立整个图,尤其是第一次作业不知道starUML,纯凭借PPT进行理解,对整个架构的设计显得很仓促很像打补丁似的。但是后面通过自己去设计各种类图,使用starUML开始明白了这些元素互相之间真正的关系。
4.总结自己的课程收获
面对对象构造设计这门课程让我对写程序写代码没有那么畏惧了,反正都要debug,代码量大,任务量大,就大着吧,一点一点的理解消化掉,能做完的。此外通过阅读别人的代码,听上课分享还有OO博客,可以知道大佬们他们是如何进行构思的,比如一单元第二次作业我从正则转到递归下降,第二单元的分布式,第三次的交并集等。而就在刚才我拜读了一位大佬的博客,了解到他们是直接是对测评机进行了迭代,封装,可以高效有序的进行评测,甚至还有GUI而我的仅仅是非常零散的非常简易的凑出来一个。这些可以说让我有了很多新的想法、思路。
这门课还让我学到了上述关于面对对象的思想,一些设计模式,多线程的设计方法,JML,UML等,还有对测评机搭建的一些经历。
5三个意见
1.希望对每次作业给出一个明确的demo,对于基础很差的同学,真的很需要通过一份较为成熟的模板引导纠正。
2.对于作业中出现的不明确的表达以及在后期的修正,希望能够更加明确的把补充放在更加明显的地方,最好对题目的形容有具体的表述,比如在最后一个单元中,出现的可能性,二义性较多,会混淆而且由于更新提示不够明显,容易忽略掉。
3.希望课程组把网站开放到2点钟,夜猫子还是晚上精神好。
最后谢谢各位老师助教大大的帮助支持!这个学期受益良多!