面向对象第四单元总结

总结本单元作业的架构设计

处理本单元作业, 是将已经碎片化的UML要素重新组织起来, 并能满足后续一系列查询和验证指令的过程。由于课程组已提供好解耦的数据和工具,因此程序在实际组织、存放时,我们更多做的是将数据组织成UML结构。

整体架构
  • 由于最终三次作业中涉及到三类UML图,因此将具体操作封装为对应三种diagram对象,便于管理的同时也分散了代码长度,在对应diagram对象中进行具体的解析(两种UML图间的交叉访问可以通过额外判断识别并避免)

 

  • diagram对象则承担了同名UML图相关的解析、查询和检查工作。在解析过程中,diagram对象按实际UML图的逻辑结构,在无序的UmlElements按层次组织起响应的类图、顺序图或时序图对象。

    例如,在类图中,先将UmlElementsUmlClassUmlInterface构建完毕,再具体分配给类(UmlClass)和接口(UmlInterface)所属的操作(UmlOperation)和属性(UmlAttribute),最终处理具体操作的参数(UmlParameter)和操作间的关联关系(UmlAssociationUmlAssociationEnd

  • 除解析外,查询过程也是本次实现的一个难点。在查询过程中,diagram对象被调用者(UmlGeneralInteraction)调用相关方法处理具体指令内容。

    由于CPU时间充分,因此只要关注指令的逻辑细节即可,如重名的处理、异常的抛出等等。

  • 检查工作仅在第三次作业中有所体现。由于检查在解析完成之后、指令查询之前,因此对前两次作业的架构不会产生较大影响。根据查询要求注意实现细节即可。

  • 值得提到的是,前两次作业因为没有考虑处理三个UML造成的代码行数溢出的问题,因此导致第三次作业才将具体操作封装为对应三种diagram对象,不过幸好只是代码的复制粘贴,没有造成太大影响。


总结自己在四个单元中架构设计及OO方法理解的演进

四个单元作业,我在架构设计上所花的时间是逐渐降低的(或者说三单元最低哈哈)。这里面肯定有一部分是因为作业难度逐渐降低(摸鱼时间增加),另一部分可能是因为代码能力架构设计能力逐渐提升的结果。

我认为前者占比更大,不过这里主要谈谈后者。

第一单元花了很多时间在架构设计上。主要研究了递归下降的解析方法,最后采用全局变量导致只能提供一次性解析服务,整体架构不甚令人满意,有相当大的改进空间,写了评测机但懒得卷性能优化(有着时间不得多摸会鱼)。

第二单元在架构上的思考就成熟了很多,杜绝了重构甚至重写的可能(俺第一单元还每次都重写来着),也杜绝了线程安全问题的发生,就是遗憾因此失去了处理线程安全问题的训练。

第三单元着重理解JML需求及其对应实现,除了性能上的考量,三单元并不需要架构上花太大功夫(不过细节没处理好的雪崩还是令人遗憾)。

最终第四单元注重于UML图的理解,整体代码架构也是参考UML图中元素的相应关系建立起来的。不过此时已经明显发现在实现过程,代码能力确实有所提升,也更加擅长idea的卸载安装等相关操作了。


总结自己在四个单元中测试理解与实践的演进

回想起第一单元的测试思路,现在确实测试起来更具条理和逻辑了。

  • 边写边测

    边写边测是个很好的习惯,可以消灭很大一部分逻辑上的bug。因为测试时只需考虑当下正在实现的模块,功能、边界、逻辑更加清晰可控,测试完成之后的安全感也更强烈,整体代码比写完再测肯定是要更加健壮的(虽然小项目开发也许会多花时间,不过更大项目中是值得的)

  • 单元测试

    单元测试也是采用了分割问题逐步消灭的思路,和上一条一样,代码量小时看不见优势,甚至还不如走查和瞪眼法效率高,但在更大项目中绝对是追求安全感和甩锅的利器。

  • 黑箱和白箱

    有时候面对自己写的代码,假装成用户进行黑箱测试还挺难的。另外P社《白箱》这部动漫真还挺好看的,电影就一般

  • 自动化测试

    这个其实也不是课程重点训练的目标,说实话由于作业体量较小,因此自动化测试的帮助也有限。不过从另外一些角度——构造数据(随机或大规模)、完善测试流程等等——来说还是有意义的。

    不过第一单元的评测机还真帮我测出来个bug,可能正好因为第一单元对随机数据有一定需求吧。


总结自己的课程收获

我知道一定有人要玩“收获了面向对象的方法,但没收获对象”这种烂梗。

但其实这根本不怪面向对象,只是没学到家。面向对象当然是种开发方式,但更根本的,它是种哲学思想的具体体现,那就是系统抽象

抽象很好理解,面向对象就是干这事的,当我们充分具有某类事物的信息和知识材料,就有能力通过经验和思考提取出这类事物的共性特征,也就是某种事物的观念,实践中可以表达为UML图(当然更多的UML其实没法表达,这是维特根斯坦说的)。

有了如此之多的抽象,就需要采用系统的观点加以分类整理,系统作为一个整体可以拆分成若干子系统,而这些子系统之间有具有各色关系——系统论就诞生了,这玩意可是个屠龙之技,比搬砖、写代码、摸鱼这些具体技能可高了不止一个层次,因为不仅仅涉及到具体的某件事情,系统能力不仅仅会在计算机专业内发挥作用,它也许会成为一个人行走世间总的方法论的一部分,那可就厉害了——这比闷头光知道干,钻牛角尖死扣细节的就高很多。

 

当然,有人会问,如果真能修炼到如此境界,对象,还算个事吗。

这个嘛,维特根斯坦就说了:对于不可言说之物,我们应当保持沉默


立足于自己的体会给课程提三个具体改进建议

  1. 每单元第一次作业坡度过大,相比上届作业整体难度提高

    个人还能接受,

  2. 试述我国如何应对当今复杂的国际战略环境和战略格局(不超过3000字)

  3. 优化指导书,明确任务总需求

    OO作业整体体验非常良好,但是每单元完成作业时,有很多不必要的时间被浪费了——每次都需要了解这单元究竟要干啥,指导书在这里又惜字如金,每次就只用开头一句话交代作业总任务,搞得同学需要花大量没必要的时间去弄明白“这次作业究竟想让我干啥?”

    这不是说我们不想花功夫研究任务需求,而是本能几句话讲清楚的事实——我们究竟需要直接面对的是什么——被消解到长长的指导书和官方包中了,这无疑增加所有同学的负担(你浪费每个人一分钟,一共要浪费我们计算机学院学生200分钟!(¬︿̫̿¬☆)哼哼)

  4. flybitch并不是好的教育理念,或者说,OO需要更高更科学的教育理念

    中国整体的高等教育思路更像美国和苏联的杂交——有点培养精英的味,但更像流水化生产产品:来了,加工,走了。工具属性、实用性、效率仍是第一位的,这在OO课等诸多6系的课程中也能体现出来,你来了?这是作业,那是指导书,做去吧,go ahead and fly bitch!

    固然可以说自学能力是重要的、OO知识太多教不过来等等——不过我说的不是这些,而是,不论课程还是学院还是培养,更多还是“以人为本”。往低了说,学生不仅仅是完成作业的工具,比起“看指导书去”,教育理念指导下更优化的课程学习体验更能让人具有学习热情。

    往高了说(这是个人对学院的一厢情愿),产业内的竞争只需要特定专业教育下的熟练工(就算我们能竞争过培训班出身,本质上也是一种熟练工),更优秀的人本身就不容易受到单一专业训练的局限。

    OO在人情味上做的很出色了,能感觉到助教团队的热情和投入,以上的吐槽也并不是一门OO课、一所计算机学院就能简单做到的,但是我们至少要意识到,教育最终的目的是培养人,任何训练的出发点和目的地都是“以人为本”。

posted @ 2021-06-22 23:07  AsaBaka  阅读(116)  评论(0)    收藏  举报