OO第四单元作业总结

第四单元作业总结

一、架构设计

  • 层次图

    根据UML语言的层次化结构画出,方便依据此,分层解析和分层存储。

  • 关于模型正确性检查

    为每种图增设checker属性,用于监测该图是否正确。

  • 控制方法和类的复杂度

    宏观上进行分层隐藏细节,分类分而治之;微观上将同质方法抽象提取成private方法进行调用。

二、四个单元中架构设计及OO方法理解的演进

1、第一单元——表达式求导

作业题目是表达式求导,实践目的在于利用继承和接口来分层解析和求导,很容易抽象出对象进行操作。

难点在于表达式的化简,也就是从性能上考虑,需要一个全局的map来储存表达式。

这个单元是很典型的面向对象编程,表达式、项、因子、幂函数、三角函数、常函数等类之间的继承组合关 系是需要嘻细细考量的。

作为初学者,这个单元三次作业,我基本上进行了三次重写。

第一次作业面向过程编程,只针对当前问题和解决当前问题来设计,未从问题的的本质去解析和分解问题, 因此扩展性差。

第二次作业开始面向对象编程的尝试,将表达式层层剖析,解析内部关系,封装成对象进行编程,但没有考 虑性能,因此扩展性尚佳,性能很低。

第三次作业由于需要判断合法性,需要更加层次化处理,涉及到当前层次的化简。但未从全局角度考虑化简,按理说应该站在顶层去递归化简来显著提升性能。

2、第二单元——多线程电梯

作业要求实现一个多线程电梯来完成楼内人的请求,实践目的在于掌握多线程编程的基本方法——共享变量 和互斥访问。

本质来说这个单元并不难,只要你不去卷很高的性能,但是我仍然第一次作业挂了且过程并不愉快,原因在 于我犯了一个很基本很严重的错误:没有事先厘清我的宏观架构——究竟是去中心化的自由竞争,还是中心 化的(分级)调度。

这个错误发生的动机在于对一步到位的奢求:希望一开始的结构就兼具性能和正确性,但其实应该这样做: 在出现性能问题之前不要去考虑性能问题,即正确性永远优先。

回到正题,我的架构是既有宏观调度,也有自由竞争,这样的弊端有:共享变量难以设置和一起操作,出现 了组合和互斥的矛盾,组合方便一起操作却不利于互斥访问;架构复杂,我hold不住,耗大量时间空想架 构关系。所以结论是优先正确性,想清架构,不怕重构。

3、第三单元——JML规格

这真的是最简单的一个单元,没有之一。本单元作业的目的不在于编程,而非在于测试。JML语言是验证正 确性的最有力方法。验证正确性的简单方法就是全覆盖测试,因此要做好测试,做好测试,做好测试。

本单元还有一些惊喜“小彩蛋”,需要学习一些简单策略:并查集、维护中间变量、堆排序等,基本上一次作 业一个“彩蛋”,我就一次作业踩一次坑。这里的教训是一定要把算法和策略搞懂,不要一知半解似懂非懂, 否则后果很严重。

4、第四单元——UML语言

UML语言是描述项目结构的语言,包括类图、顺序图、状态图,学到这个语言也算是不小的收获。

本单元作业是一个UML文档的解析,就需要能够理解简单的UML语言,把UML语言画成UML图直观显现。

这轮作业大概是我扩展性最好的一次作业,虽然三次作业都有结构的改动,但基本上就是加个父类、新类、 接口然后复制粘贴,算是迭代性不错,对象性比较突出。

这次作业的工作量在于方法超多,也不一定好写,十分考察C语言功底,各种递归循环,遍历标记等,总之 十分考察基本功。

最后,吐个槽,作业文档里面的方法要求好模糊,真就讨论区才是真正的作业文档。

三、四个单元中测试理解与实践的演进

1、第一单元

按样例和手捏数据进行测试,再借助舍友都评测机生成样例进行对拍。

在互测中仍然被hack,主要由于层次化之间的信息传递问题,测试中没有涉及到。实际上我在写代码过程 犹豫过这个问题,作为教训,以后写代码时犹豫的问题要记下来,写完代码后测试。

2、第二单元

基本按照评测机数据来测试,由于本单元写得比较糟糕,没有进行很多测试。

3、第三单元

测试很重要,尤其是按照方法规格的测试,可以检测你有没有“自由发挥”,违背规格。

4、第四单元

讨论区测试大法祝我过中测(逃)。

最尴尬在于,前面测试的经验教训似乎很少在后面的作业中发挥作用,但是感觉自己得OO思维越来越熟练。

四、课程收获

从表层来看:java的基本语法和编程,多线程编程的简单实践,JML规格(离散数学)的学习,UML语言的学习。

从深层来看:面向对象的思维对解决问题十分有用,简单,可拓展性强。测试的重要性很大,,帮助自己解决很多降智错误。

五、课程改进建议

  • pre一定要鞭策着写,pre对java入门好重要。我寒假并没有意识到问题的严重性,导致开学一周狂肝pre,终于写完,黑暗第一周TAT。建议把开学的作业安排等明确告知学生,pre占一定的分数,提高学生重视程度,为自己好。

  • 研讨课感觉收获不大,要么很简单,讲架构之类的就一般般;要么离自己很远,自动评测机之类的,不会Python,全程大雾。建议鼓励讲一些设计模式,这些很简单却也很实用。

  • UML的单元作业说明太草率,举例来说:”UMLCollaboration“的存在与否未明确,课程组的简化UML模型对我而言是个黑箱,对分层解析UML图带来困难。建议能够i提供一个简化UML图的示例,方便按此解析。

  •  

posted @ 2021-06-26 11:55  depool  阅读(49)  评论(0编辑  收藏  举报