OO第四单元&课程总总结
OO第四单元&课程总总结
时刻提醒自己不能跑题
完结撒花
架构介绍
整体来看架构分为三个部分依次对应类图、状态图、顺序图
总体来看:
类图
主要就是按照类图的几个元素进行构建
这里我们将umlXXX包裹进MyXXX这样的好处是采用组合的方式实现了功能的继承
对于接口:一个接口有多个attribute, 还有多重继承的多个爸爸接口,
对于类:一个类有唯一的父类, 多个实现的接口, 多个Operation, 多个attribute
对于Operation: 一个Operation有多个parameter
顺序图
顺序图很简单,没有树形的递归结构, 只是浅浅的组合了一下
状态图
状态图需要模拟真实的图, 进行一个有向有环图的建立, MyState作为图的节点进行建图, 每个Mystate有nextState就建立起了一张邻接表
关于算法
总体上而言本次作业不需要用什么图论算法, 如果你要用其实也行, 比如tarjan求scc, 拓扑排序判换等等, 但是其实都可以通过dfs来简单暴力的解决
设计思维 与 OO理解演进
封装与解耦
面向对象最重要的就是把每个功能进行分解,然后减少耦合,进行模块化的改造,这样的好处就是
-
分解为子问题, 便于逐个击破
-
加强程序的鲁棒性, 同时提升可扩展性
一次次作业,从最开始抱头抓虾 ,一点不会, 草草写完,然后重构,变成了做好架构设计,
一次次作业, 我真的明白了架构设计的重要性, 如果说co是给你一个CPU的各个部件的功能设计,然后你去实现具体的CPU细节, 去体会封装解耦, 那么oo就是给你一个白纸, 然后你需要去自己构思自己想, 去分解问题的结构。这恐怕就是OO相比CO对于工程设计能力更进一步了吧。我的设计能力也得到了进一步的锻炼
设计模式
在学习oo的过程, 也是不断学习设计模式的过程, 从第一单元的工厂模式生产不同的表达式元素、单例模式, 到第二单元的生产者消费者模式、状态模式,策略模式、流水线模式, 第三单元的uml中课上讲到的迭代器模式, 第四单元的组合模式等等。其实写的时候并没有过多在意是什么模式, 但是现在回顾看来,开学初看起来迷迷糊糊的设计模式,都在潜移默化中有了更深刻的了解,也在一次次的作业中练习到了。
第一单元:表达式化简
-
第一次作业采用了递归下降+表达式树的方式奠定了基础
-
第二次作业在此基础上加入sin,cos,函数,sum, 加入了换树的方法,重写Hashcode Equals等方法,可惜时间不足bug有点多
-
第三次作业在此基础上优化了一点,同时加强了测试debug
体现出了层次化设计、增量开发的思想
第二单元:电梯单元 , 关键在于设计线程安全类, 通过线程安全类来保证各个线程的行为是安全的, 比如通过锁的方法保证互斥, 通过资源也同时完成了线程间的协作通信。 关键在于选取合适的临界区, 保证线程安全的情况下尽量小。三次作业基本是迭代的, 每次作业都在上次的作业上或是继承, 或是新增了一些功能, 较好的实现了代码复用
第三单元:整个单元学下来, 似乎所有的时间都用在读jml上了, 图论算法也不算难。还想说说测试, OpenJml 就是个jml语法检查器(bushi, Junit有点像Verilog的testbench样例还需要自己构造,如果能够有一个可以根据JML直接校验函数的工具就好了。剩下的日子里, 就都在写对拍机了。(允悲
第四单元:这一单元的重点在于阅读理解,主要是阅读第四单元的手册, 指导书, 如果能和指导书的理解保持一致, 同时注意测试对拍, 就可以较好的完成任务。
测试的理解和演进
第一单元:关于测试三次均采用了随机样例测试+边界数据自己构造,这次的从测评机比较容易构造,再加上有sympy验证也很好验证。 在后期我也对测评机数据生成进行多样的改造随机:测试不完全随机, 应带建立特殊数据池, 对一些边界情况进行更加自动化的测试。
第二单元:第二单元的测评机,主要是采用的随机生成 + 状态机验证的方法, 同时也可以构造极端的数据, 采用了linux的计时工具进行运行时间的测试, 支持多人一起测, 加快了测试速度
第三、四单元:主要以对拍为主, 第三单元的难点在于控制异常发生的频率以及提升测试覆盖率, 第四单元在于构建图, 在python下建立了不同的class, 同时要注意一些边界条件比如null, tle等等, 特别感谢岳哥哥的judge(社交网络有GNN那味er了https://distill.pub/2021/gnn-intro/
)
课程收获
课下作业
收获在于对于oop有了更深入的了解, 也培养了我对于模型设计的能力, 对将来的开发学习可以打下更好的基础, 同时多线程+oop让我了解实用软件是如何设计,编写的; 这个假期如果有机会, 我想随着oo课的脚步, 继续进一步学习一些开发知识, 为下学期的数据库等课程做好准备。确实很期待,很有意思(对我而言, 比单纯的刷算法题, 做出能用的产品还是更有成就感的)
课上测试
oo课的课上测试轻松愉快, 也是在课上测试中, 为我们的作业做足了铺垫,学到了不少面向对象java的知识, 感谢助教们用心的设计
三个建议
-
建议加强预习好吗!一周学完递归下降+coding有点困难, 完全可以加入预习内容中去。
UML和JML最后两个单元感觉完全可以减少一些比重, 或者压缩一点内容, 变成后两个单元每单元2周即可, 这样任务量会充实紧凑很多, 也足以完成两单元思想精华的学习,也不会把战线拖到OS烤漆, 烤漆爆炸。
-
减少谜语人, 讨论区的问答贴楼层实在太多了, 翻起来非常难检索到有用信息, 希望增加一个助教精选的功能, 对一些有用信息进行强提示
-
实验课希望不管怎么样,无论是学期末或者测试完,能大致给个情况