一、总结本单元两次作业的架构设计
- 两次作业我都选择了使用模拟的方法来组织设计代码逻辑。具体来说,有关Class,我相对UMLElement设计了MyClass, MyOperation, MyInterface, MyAttribute等,其内部逻辑也均满足正常的设定。对于第二次的状态图和设计图,我也相对应的设计了MyState, MyLifeline等类。
- 这样的实现方式和架构能够使代码逻辑更清晰简单,在第一次作业的基础上完成第二次作业,我几乎没有对上次作业的代码有任何改动,有优秀的可扩展性。
二、oo作业四个单元的架构设计及面向对象构造的演进
多项式求导单元:
初次接触java这门编程语言,对其尚感陌生,因此这一次作业难度并不大。主要涉及到正则表达式、java常用的数据结构(如ArrayList、HashMap)的运用。相比于面向过程的c语言,java这类面向对象的语言更强调封装。比如正则表达式就是封装好的工具,你只需要拟好匹配字符串对应的正则,就能自动帮你识别别按一定规则进行分割,而在C语言中对字符串的识别和分割是个老大难的问题。这样程序员不用再去手写有限状态机而头疼,转而能将注意力集中在解决问题的算法上,极大降低了编程难度。
多线程电梯单元:
引入了多线程之后就带来了数据一致性的问题,为了确保临界区资源数据一致性的问题,又引入了锁的概念。在这一系列的作业中,临界区资源就是请求队列,我采用了单例模式,将之实例化为一个对象,存入各电梯中,再由电梯和请求队列交互进行请求的分发,总之就是要注意保证线程的安全问题。
JML规格单元:
本系列作业对性能的要求更高了些,个人感觉考察数据结构的意味更浓。你需要采用合适的数据结构去存储整张图,方便后续的查询,并需要在更改图进行信息的更新保存,之后再查询就不用重新计算,降低总的运行时间
UML单元:
UML是非常崭新的单元,让我了解了这门统一建模语言是如何用特定的数据结构去描述一张图,以及这张图又是如何描述你的模型。这一单元主要是采用hashmap建立id和类、接口的映射,通过记忆化搜素的方式在类、接口的继承链上回溯。
三、OO作业四个单元的测试方法与实践
1. 第一单元
第一单元主要考察了对不合法数据的判断和正常数据的优化。在测试中,针对正确性主要判断不合法数据,通过语法树等方法来构建全面的非法数据格式,并采用随机生成组合的方法对程序进行大量的测试。针对效率,通过数学方法的简化等运用搜索等方法来简化表达式,通过数值验证的方式来判断简化后表达式的正确性。
2. 第二单元
第二单元主要考察多线程。多线程的程序很容易出现线程安全的问题,而线程安全的问题并不能保证每次测试都出现,所以为了避免这类的错误,要进行多次重复的测试。针对效率,要根据不同的优化方法统计比较优化的效率,并选择较优的解法。由于没有一种优化方法能保证对任何数据最优,所以要格外注意对优化方法的选择,使其能够在大部分情况下表现优秀。
3. 第三单元
第三单元将算法与面向对象结合。难度相比第二次作业简单不少,主要的测试方法仍然为生成大量的测试数据来和别人的程序对拍比较答案。在测试中也要格外注意生成边界数据,生成满足数据限制内的极限数据,来保证程序的可靠性。
4. 第四单元
第四单元主要为对UML各种图的理解和实现。由于这一单元的测试数据较难生成,主要依靠了单元测试和肉眼debug的方法,没有通过数据来判断正确性。这一单元要格外注意实现方法的正确性,手动构造各种反例来保证方法的可靠。
四、总结自己的课程收获
- 首先毫无疑问,从原来的Java小白,到可以自然顺利地完成Java比较大的工程,对Java这门语言有了更深地认识和体会,真正的学习了一门新的语言。
- 对面向对象有了一定的理解。从之前的完全以解决问题为目的编写代码,到考虑架构,可扩展性,阅读性等等的问题,用老师的话说就是实现了从普通码农到正规大学生的蜕变。
- 对设计模式有了一定的了解,在课程中和作业中,接触了一些设计模式的知识,例如工厂模式,观察者模式等等,能够更好的解读和设计代码。
- 感受到了测试的重要性。在其中两次作业,都是因为测试不充分,导致强测成绩大翻车,非常影响成绩,而导致bug的错误往往非常小。全面完整的测试对于保证代码质量有重要的作用和影响。
五、立足体会提出三点建议
- 实验课程体验急需改善,实验课程设计有些让人搞不清在干什么,没有明确的目标导向和评测方法,希望之后可以加强。
- 部分课程作业设计不合理,如前几次的WF问题,和最后一个单元作业,代码量不小,但却没什么难度,只是通过写代码作业这样的方式学习了状态图和时序图。
- 理论课可以对作业进行适当的总结和提升。