第四单元及课程总结
本单元三次作业设计架构
这次作业架构设计看上去很复杂,分出来的类特别多,但实际上自己设计的架构很多时候与要解析的架构对应度很高,设计起来并不复杂。
第一次作业:
在写这次作业时我偷了懒,虽然看出来了可以分成UMLClass类、Interface类处理会清晰一些,但我还是都写在了一个类里。虽然都在一个类里,但用了一堆以Class作为索引的map,实现起来和封装后其实差不多。
(啥也没有的结构...)
第二次作业:
写完第一次作业后我深感不安,担心自己的垃圾设计对后续有影响。还好第二次作业时影响还未体现。
我把第一单元部分移到MyUmlClassModelInteraction,并分别针对顺序图和状态转移图创建了MyUmlCollaborationInteraction,MyUmlStateChartInteraction进行管理,内部分别实现了接口类和状态机类进一步管理。然后我把这三个类都在MyUmlGeneralInteraction实现一遍。这三部分操作没有交互,耦合性很低,管理起来很方便。
第三次作业:
第一次作业偷的懒还回来了...面对第一次写的不知所云的码,我整理理解了很久。这告诉我一定不能偷懒,要做好设计。
这次的码主要增加了代码检查内容,总体上看结构变动并不大,我增加了一个Mybuild类,用于MyUmlClassModelInteraction的初始化,只因这个类太长,代码风格过不了。
总的来看,这单元代码的框架是比较清晰的,设计可以参考提供的源码,设计难度并不大。
四个单元中架构设计及OO方法理解的演进
第一单元
这个单位我觉得是最复杂的一个单元。可能是因为当时Java使用还不熟练,加之本单元设计设计递归,有效性检验,字符串拆解等,使问题的复杂性很高,花了很长时间。
架构设计主要是先判断字符串正确性,然后针对括号和运算符将字符串拆解成不同的表达式、项、因子的组合,再对其进行求导,最后进行表达式的化简。
我认为这单元的设计难度比较大,因为结构设计在本单元比较重要,而且较为抽象,需要分析递归现象。
我在第一单元中重构了很多,第一二次的结构还能支持化简,第三次作业的设计已经无法顾及化简了,不过第三次作业我的正确性也没能得到保证,没有因为化简问题丢失很多分数......
第二单元
第二单元是我觉得难度很大的一个单元,主要困难在多线程的理解使用,写第一次作业写了很久很久,后来了解多线程后就没这么难了。(甚至看到啥都在想这需不需要多线程...)
单部电梯时我设计了一个控制器控制人的上上下下,和运行的电梯进行交互,告诉彼此什么时候上人下人运行。
多部电梯时我每个电梯里面都有一个控制器,还有一个总控制器。总控制器负责分配什么人上什么电梯,把人加到对应电梯的等待队列里。电梯内控制器负责满足等待该电梯和电梯内的人的需求。遇到换乘情况时,就让人出来,把人重新塞到总控制器那里分配。
第三单元
第三单元我觉得较为简单,根据JML要求写代码要求对JML说明有很好的理解。虽然说JML不能代替架构设计,但我感觉我也没进行多少架构设计,主要还是针对说明来,按说明办。
第四单元
这一单元在理解UML图中元素时稍微有一点困难,了解属性含义后就没什么了。框架设计可以抄原本的设计,比如有UMLClass,就可以写一个MyUMLClass,写自己的接口,类,等等。学习这单元让我很好的复习了数据结构的相关知识,加深了对很多图算法的理解。
四个单元中测试理解与实践的演进
第一单元我主要采用手动构造数据进行测试,构造边界数据,判断中提及的数据等等。这种方法检查较慢,但比较有针对性,然后成功在第三次作业时翻车。
第二单元我采用构造特殊数据加随机生成数据并用测评机检查是否有非法输出,测评机写了好久...测评机的锅比码的锅少一些,这让我很开心。
第三单元我主要采用随机生成数据加对拍,感觉效果还不错。
第四单元我主要采用放弃测试测试法(不是...),测了提供的样例,自己随手画了几个,还好没有大锅...
感觉互测一开始有热情,后来随着码量增加逐渐放弃...
课程收获
OO课程对代码能力的提升是很显著的,学完OO感觉之前都没怎么写过代码,更不会接触到这种接近工程的编码方式。
1、开始注重代码性能。
之前学代码复杂度的时候基本上就是理论上听听,大概理解下,真正写码时并不会重视。OO为了防超时,我开始注重代码效率。
2、开始注重代码风格。
虽然开始对风格进行要求时感觉很多都好死好没意义,但习惯了之后看着整洁的码心情是真的好。很多没注意到的细节在代码风格较好时也更容易被发现。
3、分层设计
这一块我做的不够好,后两个单元有些类分离出来会比较清晰,但由于我的犯懒,还是很多时候直接写在一个类里,导致后来迭代时吃了苦头。
但总的来说,分层分类意识能力比我开始学习时提升了很多。
4、开始尝试一些很实用的编码工具。
比如Git、IDEA、StarUML等等。
5、了解了一些工程化的方法。
6、学了Java语言
之前没接触过,现在java大概是我最熟悉的一个编程语言了。
具体改进建议
1、希望课程能简单展示一个真正的工程实例、或者人员分工方式之类的。OO课程上学习了很多工程化的方法,但很多都是学到哪说哪在工程上很重要,总体描述也有些抽象,不太容易理解真正工程情况。
2、希望能提高一点中测难度,中测过的太容易,但强测的分太令人伤心了......
3、希望能公布实验课成绩,每次不知道做的怎么样心很虚......
线上学习oo课程的体会
感觉oo和计组很像,都是很注重作业练习的,线上线下学习没太大差别,主要都是写码+测试。
感谢老师助教!!!每次出作业都能感觉到你们的辛苦~~虽然OO难度不小,但学完真是收获满满。