【BUAA-OO】第二单元作业总结

第二单元作业总结

——电梯恐惧症患者的极限自救

 

一、   第一次作业程序分析

1.     设计策略简略分析

线程:主线程、输入线程和电梯线程,另有一个持有请求队列的调度器,一个对输入进行处理的Request类,主要采用生产者-消费者模型。

分工:输入线程负责接收控制台输入,处理后存入调度器队列。

   电梯线程负责向调度器申请请求、运送请求,并输出相关状态信息,本次作业采用轮询方式进行等待。

   调度器负责对请求进行调度,在电梯申请请求时将队列内第一个请求发送给电梯。

   Request类负责处理输入,主要任务是将null输入改变成一个from=to的请求加入队列,以达到实现停止电梯的目的。

调度策略:FAFS。电梯内无请求时向调度器申请一个请求,若队列空则轮询等待,若得到请求则开始运送, 接收到特殊请求时结束。

2.     基于度量的程序结构分析

1)      类的度量

类的属性个数、方法个数如下:

 

类的代码规模如下:

由于本次作业较简单,代码规模均较小。

2)      方法度量

其中Elevator类的run方法复杂度较高,是因为本次作业将电梯所有运行逻辑全部在run中实现,没有单独的方法将其划分。

3)      类图及其分析

 

本次作业比较基础,完成基础上未做其他事情,暂不分析优缺点。

4)   Sequence Diagram

 

5)      SOLID设计检查

SRP符合,每个方法都只有一个明确的职责。

OCP符合,基本通过扩展来实现新功能。

LSP符合,无子类。

ISP符合,无接口。

DIP符合。

3.     bug分析

在前期出现诸如当前楼层未更新等低级错误,后期测试中暂未出现bug

 

二、   第二次作业程序分析

1.     设计策略简略分析

线程:未改变

分工: 电梯增加功能,在每一层向调度器询问是否有可捎带人员,内置主请求与捎带请求队列,改为wait等待。

        调度器增加功能,在电梯询问时根据电梯运行情况查询是否有可捎带人员,并返回给电梯。

        输入线程增加功能,接收到新请求后notify电梯。

调度策略:ALS。电梯内无请求时向调度器申请一个请求,若队列空则wait等待,若得到请求则开始运送,运送过程中在每一层查询捎带,主请求处理结束后更换主请求并继续处理,接收到特殊请求时结束。

2.     基于度量的程序结构分析

1)      类的度量

类的属性个数、方法个数如下:

 

类的代码规模如下:

与上次作业相比,这次主要的更改在调度器对捎带的查询和电梯的调度算法,因此这两个类的规模显著提升。

2)      方法度量

其中Elevator类的run方法、go方法以及QueuegetStatus方法复杂度较高。其中run方法承载了ALS调度的全部逻辑,所以较为复杂;go方法计算电梯的运行方向,没有仔细设计,实现比较随意;getStatus方法根据电梯状态计算捎带队列,实现比较复杂,应当拆分。

3)      类图及其分析

  

优点:线程和锁较少,不容易出现线程安全问题。

缺点:调度器内部结构复杂,容易出错。

4)   Sequence Diagram

5)      SOLID设计检查

SRP符合,每个方法都只有一个明确的职责。

OCP基本符合,除一些在现有条件下完全无用的方法被重写外,其他已有方法均通过扩展来实现新功能。

LSP符合,无子类。

ISP符合,无接口。

DIP符合。

3.     bug分析

在前期出现由于设计考虑不周全在主请求上出现一些错误,后期测试中暂未出现bug

 

三、   第三次作业程序分析

1.     设计策略简略分析

线程:电梯线程改为三个,额外增加一个输出类,以保证线程安全。

分工:Request类新增标记位,区分换乘人员与直达人员。

   电梯更改功能,只在可到达层向调度器询问是否有可捎带人员;增加功能,将换乘人员重新加入调度器队列。

       调度器更改功能,主请求选择规则为可直达优先,不选择其他电梯可直达的请求作为主请求;捎带规则改为只捎带可直达人员;增加换乘队列,

调度策略:电梯内策略不变,调度器调度策略更改,在换乘楼层特别处理。

2.     基于度量的程序结构分析

1)      类的度量

类的属性个数、方法个数如下:

 

 

类的代码规模如下:

与上次作业相比,这次主要的更改依旧主要是调度器和电梯的调度算法,而Request类中则增加了equels方法。

2)      方法度量

其中Elevator类的run方法、go方法以及QueuegetStatus方法复杂度同上次作业一样较高,本次QueuegetMain方法由于主请求选择较复杂而复杂度也较高。

3)      类图及其分析

 

优点:简单,可扩展性好。

缺点:调度器内部调度太复杂,容易出错。线程增多,易出现线程安全问题

4)   Sequence Diagram

5)      SOLID设计检查

SRP符合,每个方法都只有一个明确的职责。

OCP基本符合,新增一些方法,其他已有方法均通过扩展来实现新功能。

LSP符合,只有一个输出子类,后续使用均为子类。

ISP符合,无接口。

DIP符合,电梯统一建模。

3.     bug分析

线程安全问题:三部电梯在等待结束信号时出现notify丢失导致RTLE

 

四、   Bug寻找策略

人工看代码,手动写样例。

我要是能找到bug我就不会在第三次死的这么惨了……

 

五、   心得与体会

1.      前期需要先规划好每个线程的作用,明确分工,努力实现低耦合,这样后期写码会容易很多。

2.      密切注意线程安全问题,密切注意线程安全问题,密切注意线程安全问题,不然会死的不明不白。

 

 

猜你喜欢

转载自www.cnblogs.com/junzy/p/10758764.html