BUAA_OO_第二单元作业总结

程序设计策略

第一次作业

第一次作业实现的是FAFS式傻瓜调度电梯,由于是第一次接触多线程,难度不是很大。在我的设计里,我借鉴了生产者消费者模式,设计了一个输入线程和一个电梯线程,控制器的设计使用了单例模式,维护了一个请求队列,作为托盘使用。在运行时,输入线程负责向请求队列提供请求,电梯线程负责拿取请求,并运行到指定楼层。这次作业的缺点是,我设计的控制器较为鸡肋,其实质只是一个存储调度指令的队列,我将具体的运行逻辑全写在了电梯里面。由于电梯是傻瓜式调度,这样的设计在正确性上没有出现问题,但是导致了扩展性很差,使得我在做第二次作业时不得不重写了电梯运行的逻辑和控制器的绝大部分内容。

第二次作业

这一次作业要求实现一个可稍带的ALS电梯。由于上述第一次设计的缺陷,我重构了控制器和电梯逻辑。调度策略方面采用了近似look的策略。线程个数保持不变,输入线程保持不变,电梯线程进行了较大的改动,我将所有的运行逻辑全部剥离,电梯只负责进行上人、下人、开门、关门、沿运动方向移动一层的原子操作,而控制器负责维护一个请求队列,负责所有的请求处理。即电梯每次上行或者下行一层都要向控制器发送自身状态,控制器获取状态后,遍历整个请求队列,选出同方向捎带的进入请求和到达请求给予电梯,同时控制器修改队列里的请求状态,将到站的请求删除。电梯获取请求后根据请求内容决定是否执行上人、下人、开门、关门、沿运动方向移动一层,到了下一层再获取新的请求。
为了实现以上逻辑,我电梯里新增了几个电梯状态参数:最远到达楼层、电梯运行方向、空闲位。每次电梯运送同方向的人时修改最远到达楼层。如果到了一次运行的最远到达楼层且没有同方向的可稍带请求,那么就将空闲位置位。控制器发现有空闲电梯时,就会使电梯向目前的请求队列的第一个请求移动。若当前请求队列为空,则使电梯静止空等。
这一次作业我认为设计的保证了正确性,实现了不同模块之间的独立性。性能上有待改进的是空闲时,可以让电梯运行,而非空等。

第三次作业

这一次作业要求多部多线程智能(SS)电梯的实现。有了第二次作业的架构设计,这一次作业的主要任务就是进行了限定人数、楼层、运行速度等新增要求的扩展,还有多线程运行时的线程安全问题。为了满足人数、楼层的要求,我又在电梯类里新增了电梯的楼层、当前人员序列,传给控制器获取请求时也增加了这两个成员。为了应对请求需要拆分成多部电梯的情况,我将人员请求设计成了一个类,每个请求在读入时,按照周转楼层最少的原则进行拆分,每个人员内部建立一个请求队列,人员再组成一个大的请求队列。控制器逻辑加入了楼层判断、人满判断,其余同上一次大致相同。同时在设计时还注意了从请求队列里遍历时,只能判断每个人员内部队列的第一个请求,这是保证人员必须完成第一个请求才能换乘电梯,防止出现时序问题。
这一次作业可优化的地方有不少,例如把根据电梯实际运行情况实时切分请求、根据电梯负载分配新请求等等。

程序度量分析

第一次作业

类图

1644090-20190424204626025-1831016299.png

类复杂度

1644090-20190424203921544-1657846474.png

方法复杂度

1644090-20190424203940981-568064036.png

时序图

1644090-20190424203958827-1629689924.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:几乎所有的调度逻辑全部丢给了电梯类,控制器几乎无作用。
  • OCP:由于电梯类包含了太多的运行逻辑,可扩展性较差,分配逻辑扩展起来很困难。
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:由于采用生产者消费者模式,输入和输出模块互不依赖。

第二次作业

类图

1644090-20190424205402179-277812705.png

类复杂度

1644090-20190424205419359-2073668493.png

方法复杂度

1644090-20190424205411698-858335698.png

时序图

1644090-20190424205426260-1841740810.png

1644090-20190424205434369-1137726169.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:调度器仅负责调度,电梯仅运行进行运行的原子操作,职责划分明确。
  • OCP:由于将所有运行控制部分从电梯里抽离,所以新增功能时可以轻松地扩展属性、增添调度逻辑
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:输入和输出模块互不依赖,但控制器调度需要获取电梯属性,依赖电梯的具体状态。

第三次作业

类图

1644090-20190424211225726-1049736765.png

类复杂度

1644090-20190424211247780-596360745.png

方法复杂度

1644090-20190424211238362-573455448.png

时序图

1644090-20190424211301559-1246989443.png

1644090-20190424211304687-883765956.png

SOLID设计原则评价:

SOLID原则分析

  • SRP:调度器仅负责调度,各个电梯仅运行运行的原子操作,职责划分明确,互不影响。
  • OCP:由于电梯参数在构造方法时传入,所以支持新增电梯或者属性的扩展。
  • LSP:没有使用继承
  • ISP:未实现接口类
  • DIP:输入和输出模块互不依赖,各个电梯互相不知道彼此存在,调度器通过一个消息类抽象与电梯通信。

bug相关

个人bug

在这个单元作业中,由于前两次的调度策略较简单,也没有较大的线程安全问题,我前两次作业都没有出现正确性问题。但第三次作业中,我在强测时出现了线程安全问题。举例说明我的问题:处理请求999-FROM-3-TO-2时,先拆分成999-FROM-3-TO-1以及999-FROM-1-TO-2。由于存在同步问题,可能导致在1楼换乘时,先输出IN-999-1-B再输出OUT-999-1-C的错误。这说明问题在于输出和修改人员状态的不同步。在原来的设计中,我实现的方法是在调度器修改人员状态(在哪部电梯上),同时将进电梯和出电梯的人员以列表形式传给电梯,由电梯进行输出In和out信息。这就可能导致在一个线程对一个人员状态进行修改后还未来得及输出,另一个线程就进行了下一次操作。
修改措施是增加了修改状态的判断,控制器在修改人员状态时,会判断人员是否在电梯内。若人员已不在电梯内,则证明已经输出了out,可以修改状态;否则不修改。

hack相关

第一次作业较简单,同组都是满分,没有正确性问题。第二次作业开始,除了随机生成数据以外,我hack别人时采用的策略主要来自于个人写程序时出现的问题,有以下几点:1.一层重复开关门问题,这类问题往往是判断是否转向运行时容易出现的,因此构造1-2-1这样的反复转向数据。2.开关门的间隔上人问题,这类问题主要出现在可能设计出了开关门的0.4秒不能上人的问题,针对这一点可以构造【0.0】n条请求,【0.4】n条请求这类数据,若没有在边界时间带人,很容易就会超时。但由于取消了T_max限制 ,hack他人时,基本也没出现正确性问题,倒是随机生成的简单至[0.0]1-FROM-1-TO--1这样的数据hack到了人。
第三次作业则是hack的重灾区,不幸中的万幸是我没有被hack出来强测的错误,这可能是由于相关样例不好构造的缘故。由于这次作业完成的时间紧张,我主要时随机生成数据,生成结果后再交给检查程序检查。在查看他人代码时,我发现电梯调度策略多种多样,问题也出现的各种各样,理清一个人的思路已实属不易,找出程序运行的逻辑更是难,所以我只着重查看了两个方面,一个是调度队列的同步问题,另一个是TimableOutput线程不安全问题。

这一单元与第一单元的测试策略相比,着重点从边界数据转移到了线程安全问题上,构造一些针对线程安全的数据(例如请求拆分、队列加锁、输出安全等)更容易得分。

总结

这一单元的重点是多线程相关问题,包括线程安全、线程同步设计等。重中之重就是线程安全的确保,在这一单元自己写出的bug无一不是线程安全导致的时序同步问题。相比第一单元,算法部分减少了,但多线程并发的问题更加棘手。另外的难点是调试部分,一行行print输出确实很考验人的耐心。电梯控制逻辑嵌套也很多,把所有情况分析全面很困难。总之,这一单元充满了挑战,也让我收获不少。希望在之后的面向对象课程学习里,我能继续努力,考虑更加全面,保证程序的正确性。

转载于:https://www.cnblogs.com/codearning/p/10760479.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/483593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 回文日期

模拟 n int(input())def check(x):m int(x[:2])d int(x[2:4])x int(x)if 1<m<12:if m 2:if (x%40 and x%100!0) or x%4000:if d<29:return Trueelse:return Falseelse: if d<28:return Trueelse:return Falseif m in [1,3,5,7,8,10,12]:if d<31:return Tr…

因果推断研究获2021诺贝尔经济学奖

来源&#xff1a;集智俱乐部 北京时间2021 年 10 月 11 日 17 时许&#xff0c;2021 年诺贝尔经济学奖&#xff0c;授予了三位经济学家——David Card因为对“对劳动经济学的实证研究贡献”而获得一半奖金&#xff0c;Joshua D. Angrist和Guido W. Imbens因“对因果关系分析的方…

【计算机网络复习】1.1.1 概念、组成、功能和分类

概念、组成、功能和分类二、功能三、组成四、分类计算机网络&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 计算机网络是互连的、自治的计算机集合。 互连 — 互…

因果表征学习最新综述:连接因果科学和机器学习的桥梁

来源&#xff1a;集智俱乐部作者&#xff1a;蔡心宇审校&#xff1a;龚鹤扬、陆超超编辑&#xff1a;邓一雪论文题目&#xff1a;Towards Causal Representation Learning论文地址&#xff1a;https://arxiv.org/abs/2102.11107这篇名为Towards Causal Representation Learning…

这种记忆技术在弯曲时更好?

A new kind of flexible phase change memory is tested while bent around a 4-millimeter-diameter rod. A.I. KHAN AND A. DAUS来源&#xff1a;IEEE电气电子工程师新的相变存储器需要更少的能量&#xff0c;部分原因是它是建立在塑料上的&#xff1f;要想让粘贴式显示器、…

接口与内部类

1.什么是接口(B) 接口是一种引用数据类型&#xff0c;用interface声明&#xff1b;当出现interface便可判断为接口。 形式&#xff1a;【修饰符】 interface 接口名称(public interface Pepar{ }) 接口可声明属性&#xff0c;且属性都默认为static final 1 public interface Pa…

深度学习为何泛化的那么好?秘密或许隐藏在内核机中

来源&#xff1a;AI科技评论编译&#xff1a;杏花编辑 &#xff1a;青暮在机器学习领域&#xff0c;人工神经网络逐年扩大规模&#xff0c;并取得了巨大成功&#xff0c;但同时它也制造了一个概念性难题。当一个名为 AlexNet网络在2012年赢得年度图像识别比赛时&#xff0c;大约…

【计算机网络复习】1.1.4 时延、时延带宽积、RRT和利用率

时延、时延带宽积、RRT和利用率一、时延二、时延带宽积三、往返时延RTT一、时延 传输时延&#xff08;发送时延&#xff09;&#xff1a;数据从结点发送到链路上的时间 传输时延 数据长度/网络带宽&#xff0c;由网络带宽、数据长度决定 传播时延&#xff1a;信号从链路的一端…

华为汪涛:无线网络未来十年十大趋势

来源&#xff1a;通信产业网2021全球移动宽带论坛&#xff08;Global MBB Forum&#xff09;期间&#xff0c;华为常务董事、ICT基础设施业务管理委员会主任汪涛发表了题为“走向智能世界2030&#xff0c;无线网络未来十年十大趋势”的主题演讲。华为常务董事、ICT基础设施业务…

【计算机网络复习】1.2.1 分层结构、协议、接口、服务

分层结构、协议、接口、服务一、 分层结构一、 分层结构 分层的基本原则 1、各层之间相互独立&#xff0c;每层只实现一种相对独立的功能。 2、每层之间界面自然清晰&#xff0c;易于理解&#xff0c;相互交流尽可能少。 3、结构上可分隔开。每层都采用最合适的技术来实现。…

22000字深入研究消费电子光学传感器行业

来源&#xff1a;华创证券、驭势资本研究所消费电子是传感器最重要的应用市场&#xff0c;据研究机构的调研数据显示&#xff0c;占传感器50%左右份额。本文主要基于3D光学传感器产业研究&#xff0c;同时涉及TOF飞行时间传感器、红外传感器等应用于消费电子设备上的光学传感器…

【计算机网络复习】1.2.2 OSI参考模型

OSI参考模型一、七层OSI参考模型&#xff08;法定标准&#xff09;1.1 ISO/OSI参考模型 —— 怎么来的&#xff1f;1.2 ISO/OSI参考模型1.2.1 通信过程1.2.2 数据封装一、七层OSI参考模型&#xff08;法定标准&#xff09; 1.1 ISO/OSI参考模型 —— 怎么来的&#xff1f; 为…

当世界模型被用于sim2real:机器人通过视觉想象和交互尝试来学习

来源&#xff1a;AI科技评论 编译&#xff1a;杏花编辑&#xff1a;青暮人类是如何掌握这么多技能的呢&#xff1f;好吧&#xff0c;最初我们并非如此&#xff0c;但从婴儿时期开始&#xff0c;我们通过自监督发觉并练习越来越复杂的技能。但这种自监督并不是随机的——儿童发展…

【计算机网络复习】1.2.4 TCP/IP参考模型和5层参考模型

TCP/IP参考模型和5层参考模型一、OSI参考模型与TCP/IP参考模型二、5层参考模型一、OSI参考模型与TCP/IP参考模型 相同点&#xff1a; 1、都分层 2、基于独立的协议栈的概念 3、可以实现异构网络互联 不同点 1、OSI定义三点&#xff1a;服务、协议、接口 2、OSI先出现&…

量子物理学家:如果宇宙中所有物体突然消失,会剩下一个「空宇宙」吗?

文章来源&#xff1a;TNW如果量子物理学家能够证明现实世界的一切都是不真实的&#xff0c;会发生什么&#xff1f;你愿意接受这个假设吗&#xff1f;如果说&#xff0c;此时此刻你正在看的这篇文章&#xff0c;其实并不存在&#xff0c;你会不会觉得这句话是在胡说&#xff1f…

为什么数学的用途这么大?

来源&#xff1a;遇见数学翻译&#xff1a;萧福坤译自 Science Digest, August 1985原文:http://210.60.224.4/ct/content/1986/00050197/0008.htm我的父亲是一位物理学家&#xff0c;所以我从小耳濡目染&#xff0c;当他与同事讨论问题时&#xff0c;我坐在桌旁&#xff0c;「…

【计算机网络复习 物理层】2.1.2 数据通信基础知识

数据通信基础知识一、典型的数据通信模型二、数据通信相关术语三、三种通信方式四、两种数据传输方式一、典型的数据通信模型 二、数据通信相关术语 通信的目的是传送消息。 数据&#xff1a;传送信息的实体&#xff0c;通常是有意义的符号序列。 信号&#xff1a;数据的电气…

无线网络未来十年十大产业趋势

来源:华为编辑:蒲蒲5G的发展速度非常之快&#xff0c;截止2021年9月&#xff0c;全球已经部署了有176张5G商用网络&#xff0c;超过150万5G站点。5.2亿5G用户的感官体验&#xff0c;也迎来全面升级焕新&#xff1a;高清视频的时长占比提升到了80%&#xff1b;流行的短视频APP已…

git入门(廖雪峰老师)

根据廖雪峰老师的git教程进行学习总结&#xff1b; 1、之前上班用的都是svn进行管理&#xff0c;那么svn和git有什么区别呢&#xff1f; svn是集中式的版本控制系统&#xff0c;而git是分布式版本控制系统&#xff0c;那么集中式和分布式版本控制系统有什么区别呢&#xff1f; …