BUAA_OO Unit4 UML建模
BUAA_OO Unit4 UML建模
C1 架构设计
1)对每一个UML元素进行建模,UML-Json元素到自己建模的元素的转换使用工厂
2)在解析器构造方法中,对元素进行分类和逐步解析
3)查询面板使用管理者模式,分三类分别处理类图、状态图、顺序图的查询
4)UML建模图像如下,图片可保存后放大查看
C2 四个单元中架构设计和OO方法理解
? 事先学习了设计模式以及Java语言,使我对于面向对象设计实践有着强烈的兴趣。
? 第一单元的求导作业是我的初步尝试。在这次作业中,我尝试提升该程序的可扩展性,企图一次完成三次作业。使用了解析树的结构。但是在实验中,由于没有事先对架构进行设计,出现了化简需求和解析树节点形式标准的矛盾。在化简时依赖于具有标准形式的节点,而化简后的结果却总是产生非标准节点。这个问题困扰了我许久,在时间紧迫的背景下,我不得不放弃这一架构,改用简单的实现。经过这一次失败的尝试,我理解了需求分析、架构设计对于项目的重要性。
? 第二单元考察并发编程。并发编程是我前期学习中较为陌生的内容。通过熟读《多线程设计模式》,我了解到许多并发问题的处理方式,和常见的并发架构,并将书中的“事件分发”等高级架构付诸实践。在这一单元中,学习的主要阻碍是调度算法的理解。在经过操作系统复习之后,我才对于分布式调度和集中式调度有了深入理解,而在完成这一单元的过程中由于缺乏这一思想,使我的架构显得杂乱。尽管如此,由于启发式算法的存在,还是取得了不错的成绩。
? 第三单元考察的是形式化需求设计。这个单元使我倍增烦躁。理由是实际工程领域不会使用这样严格的表述,使用JML文档注释的方式也并不高效。尽管JML有着统一标准的优点,其标准是建立在极大的人物力投入之下的。不过在高精尖领域,这样的标准化需求是要高于开发效率需求的。另一方面,对于JML的自动化测试优点,我穷尽方法也没能理解,因为JML工具链落后,难以适应程序,SMT水平也不及人工证明。在JML的学习中,我觉得只有关于面向对象的部分是有意义的。即对于方法的接口化设计。
? 第四单元考察的是UML类图的理解。通过这一单元学习,我掌握了系统化架构设计的方式,具备了表述架构的能力。这不仅仅有利于个人的架构分析,也有利于和团队中其它成员的沟通交流。
? 在四个单元的学习中,我的架构设计能力不断精进,也掌握了面向对象设计的诸多方式。
? 面向对象设计,通过封装、继承、多态三大特性,实现了模块间的解耦,又有利于模块间的协作。面向对象设计相比于过程设计更具备工程化和体系化的优点。学习面向对象设计,掌握新型程序设计思想,对未来的发展大有裨益。
C3 测试能力的演进
? 由于将主要的精力放在算法设计、架构设计和细节处理上,测试能力是我十分薄弱的一项。
? 在第一单元作业当中,我的测试方法仅限于通过Junit进行简单测试,当时使用Junit只是做一些尝试,对于测试没有明确的测试思路。此时我对测试的理解停留在给出样例,比对答案的层面上。
? 在第二单元作业中,简单的Q&A模式已经不再适用。多线程程序的不可预见和不可再现性,使得简单的比对逻辑不能显示内在的矛盾。在这一单元的测试中,我适用的是形式化验证,我为每一个方法设计了一系列的前后置条件,随后对这些方法进行逐个测试分析,使得这些方法满足需求。然后通过自己的逻辑推导,来确保整个体系的正确性。此时我已经掌握了一些黑白盒测试的思路。
? 第三单元的作业中,由于存在例程,我没有执行编纂测试,而是与课程组给出的代码进行等价证明。
? 第四单元的作业中,由于学业压力的减小,我开始尝试多种测试方法。我首次编写了对拍机器,完成了数据生成器,实现全自动测试。但是由于缺乏训练,生成的测试样例没有针对性,对于边界的测试尚有不足。
? 通过四个单元的学习,我对测试的理解也逐步加深。形式化验证是最好的测试方式,也是最耗费精力的方式。同时,形式化验证依赖于架构设计的模块化,假如一个模块的状态严格取决于另一模块,那么就难以独立测试其功能。例如电梯作业中电梯的行为,是要取决于调度面板中等候队列。自动化随机测试有利于查找一般情况,及测试程序的请求压力。对于边界条件易于达到的问题,也可以方便地测试。而构造特殊样例并通过Junit的测试,则更有针对性。但也存在着耗费精力的问题。每一种测试方法都利弊共存,结合多种测试方法进行综合测试才更能保障程序的正确性。
C4 课程收获
? 面向对象程序设计课程使我收获颇丰。
? 首先通过课程学习,我掌握了面向对象设计方法,掌握了模块化设计的技能,这对于大型的软件工程是不可或缺的。在设计更优的算法和架构的过程中,我也收获了许多快乐的时光。其次,在学习过程中,我结识了许多能力强大的助教和同学。在和同学的交流探讨中,我对于自己的架构有了许多灵感。同时,在帮助同学解决问题时,我对作业需求的理解也逐步深入。最后,在长期的程序设计锻炼中,我的编程速度提高了不少,思路也更加清晰。
? 总而言之,这门课程对我来说意义非凡。
C5 课程建议
? 建议一:调整单元顺序,UML类图可以在学期开头就传授,理由是有利于架构设计,同时有利于同学间交流。这一单元与Java语法的联系并不紧密,适合同学上手。其次UML建模有利于增进对于面向对象设计的理解。
? 建议二:减少JML单元的作业,这个单元的作业2次足以使人理解JML的思想,重复训练到最后训练的侧重点变成了数据结构训练。同时JML和面向对象设计联系并不十分紧密,工商业中也少有应用。
? 建议三:增加多线程单元的练习。在多线程单元中,有许多高级的多线程设计方法没有设计,例如Messenge模式,主动对象等高级建模。我觉得可以使多线程设计的题目更加多样化,例如增加对于闸机模式等多线程设计方法的考察,来增加趣味性,以及提高同学们对于多线程并发效率的认识。
C6 线上学习体会
? 线上学习非常舒适,通过线上听讲,线上作业,线上实验的方式,我的学习效率直线攀升。这是一门依赖于电子设备才能进行的技术,通过线上方式反而有助于交互。
? 同时,面向对象程序设计是需要思考过程的一门课程,在线上学习模式下,我可以按照自己的节奏进行学习。当然,这离不开完备的OO课程评测网站的建设,和老师助教的辛苦付出。