BUAA_OO_Unit2总结

BUAA_OO_Unit2总结

       面向对象教学第二单元马上结束了,在这单元的学习里,加深了对“对象”概念的理解,学习了JVM的基本机理,最为主要的是学习使用“线程”解决一些并发行为模式的问题,主要从动态的并发行为入手解决。

 

       下面横向比较自己的三次作业,分析设计策略和程序结构。

首次电梯作业中,训练要点主要是让刚接触“线程”的我们学会线程有关设计的基本架构,理解并发行为。在课上老师给出的建议架构中,我选择了前者,及调度器作为共享对象的设计架构。原因一是本次作业无特殊调度要求,该架构易实现且满足功能需求;另一方面是因为对另一个架构我没有理解调度器作为线程是如何进行工作的,这也导致后面两次作业在第一次作业基础上进行重构的代价很大,也是自己能力问题,没有进行优化措施等。

 

 

Figure 1 调度器作为共享对象

 

 

Figure 2 调度器作为线程

       第一次电梯作业的实现完全模仿“生产者-消费者”模式,请求线程作为生产者,向请求队列中添加请求,电梯作为消费者,从请求队列中取出请求并做出相应动作。采用“先进先出”的调度方式,所以调度器直观的使用了“队列”的结构,添加请求到队尾,取出请求从队首。

       程序结构也是很简单,主线程创建请求队列的实例,并将其作为参数传入新建的输入请求、电梯队列中。上锁的方式也是模仿“生产者-消费者”模式的生产、消费两个方法锁。

 

 

Figure 3 elevator1.uml

       第二次电梯作业是完成单部电梯的可稍带调度模式。我的想法也很简单,在第一次的基础上,进行电梯与请求队列的交互,具体为:在电梯到达每一层时,检查请求队列中有无可稍带乘客,有则捎带,无则跳过。这样基本完成了作业的需求,没有想到可优化的方面和策略。

       框架如下,相比第一次的框架有改进的是,将“电梯”作为一个类从“电梯运作线程”中重构出来,另外增加了电梯中的“乘客队列”。(电梯状态的查询本也是重构时,打算添加的部分,想着如果有能力的情况下,进行优化肯定是要用到的,结果果然是想多了)

 

 

Figure 4 elevator2.uml

       第三次作业是多部属性不同电梯的运作,这次作业我做的很差,完全“hard-coding”。在电梯属性的设置上几乎没有留出可编码的地方。在之前作业的框架上,将请求队列中分出三部电梯的子请求队列,而子队列请求的确定也是很粗暴:根据楼层的可达性确定。这里应该是可以优化的地方,比如两部电梯都可达应该选择哪一部。另外一个难点是在不可直达请求的分解,我的想法是从检查第一部电梯的乘客,然后再将该请求的第二步加入它的请求队列中。

       架构如下,参考了《图解java多线程设计模式》中“work-thread“模式的框架,与前两次作业相比,架构上除了必须的子队列的添加等,变化的是Channel类中”creates and pools“三个电梯线程实例。我认为这种逻辑上的线程池也是需要学习的地方,本次作业中只是有了这个东西,并没有利用到其功用。

 

 

Figure 5《图解java多线程设计模式》中“work-thread“模式示例程序类图

 

 

Figure 6 elevator3.uml

       从SLOID设计原则上回头看自己的三次作业,设计上还是很差的,虽然勉强从第一次的作业改造到第三次作业没有全局的变动,但是很难进行优化,线程的交互方面也很差。依次看看这五条原则,SRP原则是相对容易满足的,但是说能满足也不太确定,不清楚某个功能是不是确实单一了。OCP原则实现得很差,基本是通过修改而满足下一次的功能需求。LSP没怎么用到,前面也说了电梯的属性设置没用采用继承的方法。ISP原则应没有很好的体现,三次作业的框架还是较小,耦合程度的作用没那么明显。DIP原则我理解的不是很好,这几次作业中也不是很理解高层组件与底层组件的关系。

 

       关于分析自己与他人程序bug方面,我并没有什么有效的方法,整体就是根据需求的种类,每种枚举出一些例子进行验证。在对自己程序进行修复的时候,主要是后两次作业,我在设计时考虑问题总是试图全局解决、较为浅显,在很多细节地方做的很差,特殊情况处理几乎没有考虑。比如第二次捎带电梯,同一楼层捎带多人的情况,第一次实现时每上一个乘客电梯都会开关门一次。这种方式值得我反思,怎样才能考虑的更全面,进行一次功能完善的代码编写后,对其设计原则方面再进行合理重构。

       本单元与第一单元的测试最大的不同之处就是“交互性“,但是我仍然没有掌握住固定时间输入指令的方式,在我测试的过程中,简单的将输入流改为文件输出,相当于初始时输入多条指令,相比于定时输入测试的情况少了许多。

 

       心得体会:线程安全刚开始考虑的很少,没有养成“线程安全类“的设计方式,我还是从功能需求方面入手进行程序设计,在大体完成后,才考虑加锁等关于线程安全的设计。设计原则也是考虑的很少,不过大体上有一些基本原则潜意识地使用,比如功能单一、局部化原则等。线程是我们必须掌握的知识点,这单元练习还是相对较少,以后在一些并发模式设计上要尝试线程的使用,熟悉线程的操作。

转载于:https://www.cnblogs.com/JunHaoo/p/10763932.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值