(1)前言:
本篇文章總體分析PTA中題目集8-題目集9:
<1> 題目集8總共3道題目,前2道均為簡單題,主要分別考察對NCHU_點線面問題和NCHU_雨刷問題的擴展繼承和多態(tài);第三道題為中等題,考察對NCHU_航空貨運管理系統(tǒng)的類設(shè)計,以及類間關(guān)系設(shè)計。
<2> 題目集9總共3道題,前兩道均為簡單題,NCHU_魔方問題考核抽象類的繼承和多態(tài),實現(xiàn)程序的擴展;NCHU_點線面問題(容器類)考核對容器的使用(ArrayList和LinkedList)實現(xiàn)對點,線和面對象的增刪改查和遍歷操作;第三道為中等題,為題目集8的NCHU_航空貨運管理系統(tǒng)程序的后續(xù)重構(gòu)以及繼承和多態(tài)的設(shè)計,重點實現(xiàn)對客戶類型(Customer),支付方式(PayMethod)和貨物類型(Cargo)的泛化處理。
(2)設(shè)計與分析
1. 題目集8 NCHU_航空貨運管理系統(tǒng)(類設(shè)計):
題目分析:
點擊查看輸入輸出格式:
**輸入格式:**
客戶編號
客戶姓名
客戶電話
客戶地址
運送貨物數(shù)量
[貨物編號
貨物名稱
貨物寬度
貨物長度
貨物高度
貨物重量
]//[]內(nèi)的內(nèi)容輸入次數(shù)取決于“運送貨物數(shù)量”,輸入不包含“[]”
航班號
航班起飛機場
航班降落機場
航班日期(格式為YYYY-MM-DD)
航班最大載重量
訂單編號
訂單日期(格式為YYYY-MM-DD)
發(fā)件人地址
發(fā)件人姓名
發(fā)件人電話
收件人地址
收件人姓名
收件人電話
**輸出格式:**
**① 如果訂單中貨物重量超過航班剩余載重量**,
程序輸出The flight with flight number:航班號has exceeded its load capacity and cannot carry the order. ,程序終止運行。
**② 如果航班載重量可以承接該訂單**,輸出如下:
客戶:姓名(電話)訂單信息如下:
-----------------------------------------
航班號:
訂單號:
訂單日期:
發(fā)件人姓名:
發(fā)件人電話:
發(fā)件人地址:
收件人姓名:
收件人電話:
收件人地址:
訂單總重量(kg):(貨物計費重量總和)(非實際總重量)
微信支付金額:
貨物明細如下:
-----------------------------------------
明細編號 貨物名稱 計費重量 計費費率 應(yīng)交運費
1 ...
2 ...
點擊查看輸入輸出樣例1:
**輸入樣例1:**
C002
張偉
13712345678
北京市朝陽區(qū)
4
P001
電子產(chǎn)品
50
30
20
2
P002
辦公文具
40
25
15
5
F005
實驗器材
30
40
50
12
E003
防護包裝
60
60
60
32
CA1501
北京市首都國際機場
上海浦東國際機場
2025-05-10
100
ORD20250424-006
2025-04-24
北京市海淀區(qū)中關(guān)村
李強
13987654321
上海浦東新區(qū)
王芳
15823456789
**輸出樣例1:**
客戶:張偉(13712345678)訂單信息如下:
-----------------------------------------
航班號:CA1501
訂單號:ORD20250424-006
訂單日期:2025-04-24
發(fā)件人姓名:李強
發(fā)件人電話:13987654321
發(fā)件人地址:北京市海淀區(qū)中關(guān)村
收件人姓名:王芳
收件人電話:15823456789
收件人地址:上海浦東新區(qū)
訂單總重量(kg):58.0
微信支付金額:1850.0
貨物明細如下:
-----------------------------------------
明細編號 貨物名稱 計費重量 計費費率 應(yīng)交運費
1 電子產(chǎn)品 5.0 35.0 175.0
2 辦公文具 5.0 35.0 175.0
3 實驗器材 12.0 35.0 420.0
4 防護包裝 36.0 30.0 1080.0
設(shè)計類圖:

SouceMonitor分析圖:




對源碼的分析:
高復(fù)雜度模塊??:
Cargo.java的??MaxComplexity達到6??,表明存在高度復(fù)雜的代碼邏輯(如深層嵌套、多重條件分支)。應(yīng)該對該文件中的高復(fù)雜度方法進行重構(gòu),采用策略模式或分解為多個單一職責(zé)的方法。
??平均復(fù)雜度??:
多數(shù)文件的AvgComplexity在1.0-1.67之間,整體復(fù)雜度可控,但需關(guān)注Calculate.java(Avg 1.67)中可能存在的冗余邏輯。
??分支覆蓋率低下??:
Calculate.java分支覆蓋率僅11.1%,Customer.java和Flight.java為0%,表明對條件分支(如if/else、switch)的測試嚴重缺失。需補充測試用例。
注釋比例偏低??:
除IllegalOverweight.java(42.9%)和Information.java(33.3%)外,其他文件注釋比例均低于25.7%(如Customer.java僅2%)。建議在關(guān)鍵算法、復(fù)雜邏輯處增加文檔注釋(如Javadoc),提升可讀性。
2. 題目集9 NCHU_航空貨運管理系統(tǒng)(繼承與多態(tài)):
點擊查看輸入輸出格式:
**輸入格式:**
客戶類型[可輸入項:Individual/Corporate]
客戶編號
客戶姓名
客戶電話
客戶地址
貨物類型[可輸入項:Normal/Expedite/Dangerous]
運送貨物數(shù)量
[貨物編號
貨物名稱
貨物寬度
貨物長度
貨物高度
貨物重量
]//[]內(nèi)的內(nèi)容輸入次數(shù)取決于“運送貨物數(shù)量”,輸入不包含“[]”
航班號
航班起飛機場
航班降落機場
航班日期(格式為YYYY-MM-DD)
航班最大載重量
訂單編號
訂單日期(格式為YYYY-MM-DD)
發(fā)件人地址
發(fā)件人姓名
發(fā)件人電話
收件人地址
收件人姓名
收件人電話
支付方式[可輸入項:Wechat/ALiPay/Cash]
**輸出格式:**
客戶:姓名(電話)訂單信息如下:
-----------------------------------------
航班號:
訂單號:
訂單日期:
發(fā)件人姓名:
發(fā)件人電話:
發(fā)件人地址:
收件人姓名:
收件人電話:
收件人地址:
訂單總重量(kg):
[微信/支付寶/現(xiàn)金]支付金額:
貨物明細如下:
-----------------------------------------
明細編號 貨物名稱 計費重量 計費費率 應(yīng)交運費
1 ...
2 ...
點擊查看輸入輸出樣例1:
**輸入樣例1:**
Individual
C004
陳明
19676543210
廣州市天河區(qū)
Dangerous
7
E001
精密儀器
60
80
100
110
E002
實驗器材
30
40
50
12
E003
防護包裝
60
60
60
32
J001
電子產(chǎn)品
30
40
20
2.5
J002
機械配件
55
75
40
28
J003
辦公設(shè)備
60
80
100
72
J004
宣傳資料
25
35
5
0.7
MU5302
廣州白云國際機場
成都雙流國際機場
2025-05-12
3000
ORD20250412-003
2025-04-12
廣州市越秀區(qū)環(huán)市東路368號
趙敏
13766523212
成都市武侯區(qū)人民南路四段1號
周濤
15478965432
Wechat
**輸出樣例1:**
客戶:陳明(19676543210)訂單信息如下:
-----------------------------------------
航班號:MU5302
訂單號:ORD20250412-003
訂單日期:2025-04-12
發(fā)件人姓名:趙敏
發(fā)件人電話:13766523212
發(fā)件人地址:廣州市越秀區(qū)環(huán)市東路368號
收件人姓名:周濤
收件人電話:15478965432
收件人地址:成都市武侯區(qū)人民南路四段1號
訂單總重量(kg):270.7
微信支付金額:8224.5
貨物明細如下:
-----------------------------------------
明細編號 貨物名稱 計費重量 計費費率 應(yīng)交運費
1 精密儀器 110.0 20.0 2200.0
2 實驗器材 12.0 80.0 960.0
3 防護包裝 36.0 50.0 1800.0
4 電子產(chǎn)品 4.0 80.0 320.0
5 機械配件 28.0 50.0 1400.0
6 辦公設(shè)備 80.0 30.0 2400.0
7 宣傳資料 0.7 80.0 58.3
設(shè)計類圖:

設(shè)計類圖分析:
在上一次題目集8的基礎(chǔ)上,將客戶類型(Customer),支付方式(PayMethod)和貨物類型(Cargo)進行泛化處理為抽象類,不同類型的子類繼承它們并重寫方法,實現(xiàn)多態(tài)。
SouceMonitor分析圖:


對源碼的分析:
截圖中Kiviat圖顯示:
??平均復(fù)雜度異常:??
??Calculate.java??(AvgSymptess=0.79)平均符號復(fù)雜度較低,但AvgStmts/Method=3.73表明方法內(nèi)語句數(shù)較多,可能存在冗余計算或過長方法。
最大復(fù)雜度(11)和平均復(fù)雜度(11)嚴重偏離中心
平均塊深度(2.58)接近合理范圍上限
注釋覆蓋率(31.5%)和分支比例(21.7%)指標需要優(yōu)化
塊直方圖顯示深度3-5的代碼塊占比顯著(紅色柱狀),需要優(yōu)先重構(gòu)這些區(qū)域的代碼。
(3)采坑心得
1. 題目集8 NCHU_航空貨運管理系統(tǒng)(類設(shè)計):
出現(xiàn)的問題:

對應(yīng)提交的錯誤源碼:
點擊查看代碼
//訂單總質(zhì)量
public double totalMass() {
double totalmass = 0.0;
for(Cargo weight : cargos) {
totalmass += weight.getWeight();
}
return totalmass;
}
改進后提交的正確源碼:
點擊查看代碼
//訂單總質(zhì)量(計費)
public double totalChargeMass() {
double totalmass = 0.0;
for(Cargo weight : cargos) {
totalmass += weight.chargeWeight();
}
return totalmass;
}
采坑心得體會:
① 第一次計算“訂單總重量”時加和的是實際的貨物重量,而正確的邏輯應(yīng)為加和計費的貨物重量。
2. 題目集9 NCHU_點線面問題再重構(gòu)(容器類):
出現(xiàn)的問題:

對應(yīng)提交的錯誤代碼:
點擊查看代碼
public void remove(int index) {
if(index < list.size())
list.remove(index - 1);
else
return;
}
改進提交后正確代碼:
點擊查看代碼
public void remove(int index) {
if(index <= list.size())
list.remove(index - 1);
}
采坑心得體會:
① 未考慮移除最后添加的元素,即 index == list.size() 的情況成立。
(4)改進建議
1.重構(gòu)高復(fù)雜度模塊??:
優(yōu)先重構(gòu)Cargo.java和Calculate.java,簡化條件分支。
2.??增強測試覆蓋??:
針對分支覆蓋率低于20%的文件補充單元測試。
??3.完善注釋規(guī)范??:
為關(guān)鍵類/方法添加文檔注釋,明確輸入輸出、異常類型。
??4.職責(zé)拆分??:
將Main.java的啟動邏輯與業(yè)務(wù)邏輯分離,拆分大文件為獨立服務(wù)類。
5.使用??策略模式??或??狀態(tài)模式??替代條件分支。
6.將長方法拆分為多個單一職責(zé)的小方法。
7.提取重復(fù)代碼為獨立方法,例如將運費計算邏輯封裝到工具類中.
(5)總結(jié)
通過題目集8-9的迭代設(shè)計,NCHU_航空貨運管理系統(tǒng)在以下層面實現(xiàn)提升:
1.從面向過程的類設(shè)計演進到基于抽象與多態(tài)的擴展架構(gòu)。
2.通過邊界條件測試、復(fù)雜度治理降低運行時風(fēng)險。
3.規(guī)范化注釋與模塊拆分,提升可維護性。
浙公網(wǎng)安備 33010602011771號