面向对象课程总结

一.本单元架构设计

因第二次作业完全囊括了第一次的功能,我扩展时也没有修改之前自己定义好的几个类,所以这里直接介绍第二次的架构。

以下是类图:

 

MyUmlInteraction类继承了官方接口,各个查询操作的顶层实现均在此类中。

Umlele是我自己定义的储存UmlElemement的类(其实就是在UmlElement外包一层包装,再自行定义若干函数)。

ClsInter类继承了Umlele,因为我认为类和接口有相似性,所以ClsInter作为了Interele(接口)和Classele(类)的父类,抽象出了它们的一些共同属性和方法。

Operationele继承Umlele,储存类或接口中的函数。

StateMach类储存状态图,Myumlstate储存状态。

Interact类储存交互图,MyUmlLifeline储存交互对象(生命线)。

Circle数据结构储存环,用于记录循环继承的环路。

从类图上也可以看出来这次作业还是比较复杂的,由于查询指令比较多,为了减小运算开销,要善于利用中间数据,而且uml图是静态的,这无疑为计算和使用中间数据提供了很大的方便。每个元素存储时我用了两个map,一个idmapid-对象的映射,一个namemapname-对象映射,每次存的时候查一查有没有重名的情况,有的话把名字存在一个badnameset中,这样后来再用这个名字查的时候就报重名错误。

另外一个印象深刻的地方就是编程时大量使用了递归(比如统计环、实现的包括继承自父类的接口等),我是在ClsInter类中定义了递归函数及每次递归中应该执行的操作,然后在ClasseleInterele重写每次递归中的操作。

另外,为了方便统计,对于相关联的类、接口或状态,应该用树形结构储存。

二.四个单元架构和方法的演进

一开始接触oo我甚至在为代码风格操心,根本没有考虑方法,更别提架构了——只要实现了代码功能就好,什么高内聚低耦合完全就没有这个概念。实践证明,这种思想在代码迭代时会造成大麻烦——第一个求导项目,每周更新需求我都要重新开始写代码,之前的成果几乎可以说是完全用不上。

于是后来我痛定思痛,开始在拿到需求之初对它进行抽象,通过继承、接口等方式给自己的程序留下足够拓展空间,甚至开始猜测下一次的需求走向,从而编码时预留出相关函数。

此外我也更加注意边界条件和特殊值处理了,之前我的程序一直只是对正确的输入产生正确的结果,后来我意识到这只是对一个程序最低最基本的要求,我的程序应该能应付各种不合法输入而不崩溃,同时也要考虑一些平时不太可能遇到的特殊情况,比如大整数,我比较两个整数时直接将它们相减然后返回,这就会导致两个都在整数范围内的数比较时越界从而返回错误结果。

我对面向对象的理解也在这个过程中逐渐加深,回看我在这门课的第一个程序,直接在一个类中定义了一系列静态方法,然后在其他类中调用,这就是披着面向对象外皮的面向过程,而现在我的程序各个对象有条不紊地进行自己的工作,有分工也有合作地拼凑成一个复杂的程序,我还是很欣慰的。

拿到代码风格要求后,我对属性只能是私有的这一要求很不解,可是现在我真的十分赞同和感激这一要求。有时候为了扩展代码功能,我需要改变类的数据结构(比如set变为map),这时我只需要在这个类文件修改相关访问属性的方法,而试想如果这个属性是public的,其他类直接拿来用了,那只要用过这个属性的所有类都要做出修改,这是及其可怕的工作量。现在想想,属性私有化很好地约束和规范了调用者和被调用者的行为——调用者只需要要求拿到想要的数据而不用操心被调用者内部的数据结构及实现方法,而被调用者只需要返回相应格式的正确数据而不用担心自己的数据被外部修改。

三.对测试的理解与实践的演进

测试可以不够复杂,但一定要全面,要覆盖所有代码及可能的分支,尤其是对于手工编写的测试程序,太过复杂的测试往往会花费更多的精力而成效不明显,事实上编写几个简单的测试边界及各基本情况的测试用例已经足够了,而且对于多线程程序,一步步debug是行不通的,更简单和有效的方法是在适当的地方print一些信息;junit也是一个不错的测试工具,还有openjml的一些形式化验证工具,和jml结合进行测试往往有事半功倍的效果,我在第三单元的博客中也提到了自己对它的使用:https://www.cnblogs.com/jiadongstar/p/10905150.html最后一点测试心得就是测试要伴随代码的成长,而不是在整个工程都结束后再进行测试——这样往往要画时间准确定位bug,而在取得某些阶段性成果后就进行测试可以较为容易地找出和修改bug,也可以保证bug不向后传播,甚至通过测试可以发现自己在设计上的不足从而及时修改架构。

四.课程收获

这门课首先使我熟练地掌握了java语言,已经可以用java编写多线程这种较为复杂的程序,比较大的代码量也大大提示了我的编程能力(以及debug能力);其二,它使我充分接受和理解了面向对象思想,我之前还都是面向过程式的编程,对面向对象一头雾水,现在我觉得已经可以像模像样地用面向对象编程解决一个实际问题了,这是很大的进步;其三,这么课极大地锻炼了我的架构能力和抽象思想,我拿到一个问题不是急于去写代码,而式认真分析架构,自上向下进行设计;最后,这门课对代码风格、jml等的要求和学习也使我初步体会了业界开发时的严谨和规范。

五.建议及意见

1.每个过程的三个阶段要求迭代上升本来是很好的训练方法,可是由于一开始只给出了最简单的需求,往往不能准确猜测后续需求的变更,以致不能设计出很好的架构,往往要在需求变更后对自己的设计进行调整,如果时间不足甚至会放弃重构精致的代码,而是草草加一些新代码满足变更。如果一开始就给出最后的要求作为参考,然后每一阶段实现这个要求的一部分,这样应该对设计帮助更大。

2.作业发布后评论区一番讨论往往引起要求的变更,希望能减少这种不稳定因素。

3.如果实验的目的不是考验现学现用能力,将实验所需的前置知识提前发布,这样也可以充分学习相关知识点而不是在实验时敷衍了事。

转载于:https://www.cnblogs.com/jiadongstar/p/11074561.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值