第二次Blog作业

一、前言:
本次项目的主题为模拟航空货运管理系统。基于面向对象设计原则及相关的技术设计。过对题目集08提供的项目说明进行分析,得到以下信息:从需求上看:需要计算货物的体积重量,并与实际重量比较,取较大值。对于得到的重量还需要依据价格段进行分段计费。同时要对客户的相关信息进行收集,生成一张货运订单,内容包括:客户信息(姓名,电话号码等)货物信息(货物名称,货物包装长、宽、高尺寸,货物重量等)运送信息(发件人姓名、电话、地址,收件人姓名、电话、地址,所选航班号,订单日期 支付方式(支付宝支付、微信支付)。而题目集09是在题目集08的基础上进行的迭代对于货运的物品新增了分类收费,分为危险物品,常规物品和加急物品,每一种分类的计价有所不同,在支付方式上添加了现金支付。新添了折扣率的说法(其中,折扣率是指不同的用户类型针对每个订单的运费可以享受相应的折扣,在本题中,用户分为个人用户和集团用户,其中个人用户可享受订单运费的 9折优惠,集团用户可享受订单运费的 8 折优惠)。此外,在设计方面,两次题目集均要求代码需要体现面向对象的设计原则(单一职责,里氏代换,开闭原则,合成复用,依赖倒转等)。题量上面,两次作业均是对前面所学 代码进行迭代,结合新的所学的面向对象设计原则。整体上题量不大。两次题目集均不涉及复杂的算法问题,相对前三次的难度和任务量降低。
二、设计与分析:


在题目集08中,我使用了四个类来实现功能(Cargo,Order,Customer,Flight)类与类之间存在关联,包含关系,但是并未实现抽象类,多态继承等关键要求。在当时对抽象类等并不熟悉的情况下集中注意力在实现功能的方面。在单一职责上也存在问题,比如将计算并没有单独拎出来,在迭代中需要重新返工,降低了效率,代码的质量也不高,通过SourceMonitor的分析,存在如下问题(Main类中高耦合,方法粒度过细(一行代码过多),存在高复杂度的方法,Main.main承担的职责过多,可拓展性差,代码易引发Bug等)

由于个人的问题,对代码无法在短时间类完成改进,将问题集中起来,等到下一次进行迭代。在第一次设计中,Cargo主要负责功能为:对货物的参考体积进行计算,以及依据参考体积计算运费。Order类主要负责对订单的信息进行收集,Customer类用于输入客户的信息,Flight类则是收集航班的信息。

在题目集09中,对上面存在的一些问题进行了迭代,通过对抽象类的学习,在09中使用了抽象类等技术,并将一些功能拆开,对代码可拓展性进行优化,耦合度等方面有了较大的改善。主要体现如下:

领域模型扩展
新增 DangerousCargo/ExpediteCargo/NormalCargo 子类,实现继承多态
区分 CorporateCustomer 和 IndividualCustomer,体现策略模式雏形
支付方式抽象出 WeChatPayment 类,符合开闭原则

复杂度控制优化
最大块深度从3降为2,减少嵌套层次
将集中式Cargo.rate()拆分为子类方法,初步解耦

架构清晰度提升
类数量从5增至11,体现单一职责原则
Main.main()调用次数从62骤降至未上榜,说明控制流拆分


依据需求,将Cargo设为抽象类,存在三个抽象子类,分别对应危险运输,加急运输,常规运输的计价方式体现了继承与多态的要求。同时增加现金支付,添加了客户的分类(个体与公司),将Main承担的职责减少等。通过这些操作,在一定程度上降低了代码的耦合度,提高了代码的可拓展性,可复用性,但依旧存在一些问题
如过度拆分,最大复杂度方法分散但并没有降低。同时,对一些设计原则和技术不太熟练,导致代码可能仍存在潜在的风险。从题目上看,对支付缺少的具体流程,对数据的检验以及其他的功能并没有要求,可能是未来拓展g改进的方向。
三、遇到的问题:
在第一次编码时,由于个人的疏忽,订单中客户的信息顺序与要求的存在差异导致未通过测试点,事后对样例仔细分析才发现对应的问题,此外,在计算参考重量时,我忽视了实际重量和体积重量取较大值作为参考重量的条件,导致代码不符合要求,直到回看说明才发现问题 。在第二次迭代中,依据提供的信息将对应的功能全部完成后,进行测试时发现呈现的结果始终不对,再三对计算的数据,计算公式验证后依旧未发现问题,直到结束后与同学交流才发现说明书中将加急与危险的费率对调了,即题目说明中加急对应的是危险的费率,危险对应的是加急的费率。在依据这个重新修改代码后,09的要求才全部完成实现,但PTA已经结束。这提醒我,在完成项目时要多于他人交流,对问题要及时进行探讨,不应闭门造车。同时,要深入理解需求,尽量避免可能出现的不符合要求的情况。
四、改进建议:
面向对象的最后是面向接口编程,而题目集08和09我均未做到该点,由于我对接口的学习较浅,目前还不能对代码进行改进,这是后面需要改进的一个问题。在代码的设计方面,需要对费率计算进行进一步的拆分改进,复杂度分散但并未降低的问题需要解决,该程序离现实生活中的航空货运管理系统有着不小的差距,后续仍可以做添加图形化界面,添加货物种类等深度改进,有很大的拓展空间。
五、总结:
通过本次项目设计,我初步掌握了里氏代换,开闭原则等面向对象设计原则,以及抽象类,继承与多态等面向对象关键技术。使用抽象类体现设计原则的意识得到了提升,对类设计中,本次题目集对类设计的较为灵活,虽整体上并不复杂,但仍需谨慎地分析与思考,在编码时,我的注释较少,后面也需要养成注释的习惯,否则代码放个两三天自己再去看需要重新推,极大的降低效率。在本次题目集中,开闭原则的重要性在可拓展性等方面有所体验,后面也需要深入了解其他的设计原则,并在后面的学习和工作将其灵活使用

posted @ 2025-05-26 11:41  西风吹不到马纬度  阅读(7)  评论(0)    收藏  举报