OO第四单元总结
OO第四单元总结
一、本单元设计框架
第一次作业,为了方便查询,我创建了一个MyUmlClass类和一个MyUmlInterface类,识别阶段,遇到对应的attribute、operation和关系,都更新对应对象的属性。在查询的时候就比较方便。
存储信息时,我采用HashMap作为容器,一个是id为key对应Class的map,另一个是name为key对应id的map,用这两个map基本上就能够完成所有的查询任务。
第二次作业解析时序图和状态图,抓住元素层次关系,实现思路与上一次作业类似。
第三次作业增加一个check类,检查模型有效性,在前两次作业的基础上进行,难度不大。
因为个人时间关系,代码作业没有按时完成,在截止之后进行了代码编写,没有能进行测试。
二、四个单元架构设计及方法理解演进
Unit1
第一单元是承接预习作业与正式课程的一个单元,难度相对不小。我将这一单元的主要任务理解为识别与求导两个部分。在识别部分受编译课程启发,使用递归下降分析的策略。求导则是从最小单位“因子”开始,逐步向上传递。
从这个单元开始,我踏入了面向对象编程的世界。回看自己这个单元的代码,得益于预习作业,整个代码中已经有了面向对象的影子,但思路不够成熟,还是能看出不少任务重叠的部分,在表达式、项、因子类中,进行了重复的扫描过程,看起来不太面向对象。
Unit2
我将第二单元视为本课程最为重要的部分。需要完成请求的分配、电梯的调度、电梯的运行,所以各个类都有独立的任务。在对电梯、调度器的设计和线程安全的处理中,我真正地理解了面向对象编程的含义。
作业完成过程中,我将大约一半的时间完全用于设计构思,在草稿纸上画关系图状态图,当思路几乎完全清晰后,再上手代码。养成这样的习惯后,代码的编写速度提升了很多,也不会出现写到一半重构的状况了。
Unit3
前两个单元的设计过程,我都在草稿本上完成,杂乱的连线和潦草的标识虽然为我提供了思路,但隔夜之后,甚至半天过后,再次回看草稿本的时候,已不记得当时的想法,有需要花不少时间去回想。不考虑超时问题的话,JML编程作业尤其简单,仿佛英语的翻译题,但这一单元更多的是为我提供了一种存储想法的思路。在设计时用JML语言对方法进行描述,将整个框架搭好,再去实现、优化具体的方法细节,不仅是对个人任务,还是对团体合作任务,都有非常重要的意义。
Unit4
JML是对类具体方法的描述,而UML则是对整体流程、框架的描述。同JML一样,它解决了我设计草稿杂乱和思路记录的问题。代码作业难度主要来源于对mdj文件所包含的信息的总结归纳。
三、四个单元测试与实践演进
没有在测试上花费太多精力。测试方式主要还是手动构造数据测试,根据边界等条件,构造一些特殊数据来进行测试。第一单元使用过自动数据生成。第三单元尝试使用JUnit单元测试。最后一单元使用StarUml构造数据进行测试。
四、课程收获
- 学会使用java语言。java语言真的是一门非常好用的编程语言,有着C++的很多优点,面向对象编程,支持多线程,同时具有平台无关性,使用广泛。IDEA的自动补全功能也给编程带来了极大的便利。
- 理解面向对象的思想。尝试面向对象编程无疑是我代码学习的一次重要经历,改变了我对于程序设计的思考方式。在完成一项工作时,我不再笼统地进行构思,开始尝试将工作内容模块化,尝试着对工作模块进行抽象,每个模块独立地进行设计。这样的思想让我更加清晰地掌握整个工作的运行,及代码的完善,极大地提升了效率。
- 代码风格。OO课程对于代码风格的检查,说不上让人头疼,确实也挺繁琐的。但久而久之,养成了良好的代码风格后,培养出了好的习惯,有利于未来的发展。
- 实际问题的解决能力。在进行OO课程前,自认为代码能力仅仅处于“会写代码”这样一个阶段,要说到应用到实际,那就要打上一个问号了。OO课每一次作业都对应着一个问题背景,尤其是第二单元的电梯作业。学习完以后,真正体会到了从构思、设计到实现一个具体问题的整个过程,对自己代码的能力、信心都有着不小的提升。
五、改进建议
- 实验课答案或成绩可以查询,便于自我纠错,改正自己在实验中发现的问题
- 第四单元指导书可以再对class的type等内容做一个大致的归纳或者提示,刚拿到任务书的时候不知道从何下手
- 实验课的内容对于单元内容的理解和作业的设计有着非常大帮助,而且在较短的时间内就可以完成,这样的简单填空题的模式也可以增加在training部分