Java兩次航空貨運管理系統blog
一、前言
在兩次題目集的設計與實現中,我們完成了“航空貨運管理系統”的基礎版與擴展版開發。題目集從簡單訂單管理逐步升級為支持多類型貨物、客戶分類及支付方式的復雜系統,涉及知識點包括面向對象設計、集合框架應用、策略模式實現、輸入輸出處理等。以下從設計與分析、采坑心得、改進建議等方面展開詳細探討。
二、設計與分析
- 系統架構演進
題目集1(基礎版):
核心類:Client(客戶)、Air(航班)、Deal(訂單)、Goods(貨物)、Display(展示類)。
功能邏輯:
輸入客戶信息、貨物列表、航班信息,校驗航班載重能力。
貨物計費邏輯:基于體積與重量的最大值計算計費重量,固定費率規則。
題目集2(擴展版):
新增特性:
貨物分類:普通(Normal)、危險品(Dangerous)、加急(Expedite)。
客戶類型:個人(Individual)與企業(Corporate),享受不同折扣。
支付方式:微信、支付寶、現金。
架構調整:
Goods類新增kindP(客戶類型)和kindG(貨物類型)屬性。
Rate和Price類引入策略模式,動態計算費率與價格。
Display類增加支付方式字段,輸出邏輯更復雜。
- 類圖與模塊交互
通過類圖可見:
![]()
核心模塊:
數據實體:Air管理航班信息,Goods存儲貨物屬性,Deal關聯訂單與客戶。
策略接口:Rateget(費率計算)、Priceget(價格計算)實現業務規則解耦。
展示層:Display聚合所有數據,負責格式化輸出。

- 復雜度分析(基于截圖數據)
題目集1復雜度(圖2):
方法平均復雜度:2.1
最大深度:4
方法數/類:3.5
問題點:Goods.rateWeight()和Air.canHold()方法邏輯簡單,但Display.display()因多數據聚合輸出導致圈復雜度較高(值為5)。

題目集2復雜度(圖3):
方法平均復雜度:3.8(↑80%)
最大深度:6(↑50%)
方法數/類:4.2(↑20%)
問題點:
Rate.rateGet()方法因多層switch-case分支,圈復雜度達8(圖3中Max Complexity=8)。
Price.priceGet()需處理客戶類型與貨物類型組合,邏輯耦合度高。
- 關鍵代碼解析
題目集2的動態費率計算:
java
class Rate implements Rateget {
@Override
public double rateGet(Goods good) {
double weight = good.rateWeight();
switch (good.getKindG()) {
case "Normal":
if (weight < 20) return 35;
else if (weight < 50) return 30;
else if (weight < 100) return 25;
else return 15;
case "Dangerous":
// 危險品費率規則
case "Expedite":
// 加急貨物費率規則
default:
throw new IllegalArgumentException("Invalid goods type");
}
}
}
通過策略模式將費率規則與貨物類型解耦,符合開閉原則。
題目集2的價格折扣邏輯:
java
class Price implements Priceget {
@Override
public double priceGet(Goods good, double rate) {
double discount = 1;
switch (good.getKindP()) {
case "Individual": discount = 0.9; break;
case "Corporate": discount = 0.8; break;
}
return rate * discount * good.rateWeight();
}
}
優化方向:
折扣策略可進一步抽象為DiscountStrategy接口,支持動態擴展。
三、采坑心得
- 輸入順序與參數傳遞錯誤
問題:在擴展版中,Main類輸入kindP(客戶類型)和kindG(貨物類型)時,順序與Goods構造函數參數不匹配,導致類型賦值錯誤。
解決:通過單元測試發現構造參數順序應為kindP在前,調整輸入代碼:
java
Goods goods = new Goods(..., kindP, kindG); // 修正參數順序
2. 接口設計冗余
問題:題目集1的Priceget接口僅支持priceGet(double, double),擴展版需傳遞Goods對象,導致接口方法爆炸(新增priceIGet())。
解決:重構接口為單一方法:
java
interface Priceget {
double calculatePrice(Goods good, double rate);
}
3. 數值精度丟失
問題:使用double存儲電話號碼(如13812345678)時,因浮點數精度丟失導致輸出異常。
解決:將Client.phone和Deal.number改為String類型。
四、改進建議
使用策略模式解耦費率計算
問題:Rate.rateGet()方法包含多層分支,維護困難。
方案:為每類貨物定義獨立策略類:
java
interface RateStrategy {
double calculateRate(double weight);
}
class NormalRate implements RateStrategy {
public double calculateRate(double weight) { /* 普通費率邏輯 */ }
}
增強輸入校驗
問題:未校驗支付方式輸入合法性。
方案:在Main類中增加正則匹配:
java
if (!p.matches("Wechat|ALiPay|Cash")) {
throw new InputMismatchException("Invalid payment type: " + p);
}
模塊化展示邏輯
問題:Display.display()方法過長(40+行),圈復雜度高。
方案:拆分為OrderHeaderPrinter、GoodsDetailPrinter等子模塊。
五、總結
- 學習收獲
設計模式應用:通過策略模式、接口隔離原則,提升了代碼擴展性。
調試能力:通過單元測試與邊界條件覆蓋,顯著減少運行時錯誤。
代碼質量意識:復雜度分析工具的使用幫助識別高風險代碼。
結語
兩次題目集的開發實踐,我不僅鞏固了Java編程基礎,更深刻體會到系統設計的重要性。從基礎版到擴展版的開發,像是搭積木變造房子。一開始簡單明了,后來加入貨物分類、折扣和支付方式,挑戰倍增。踩過輸入順序顛倒、數值精度丟失的坑,也學會了用模塊化設計讓代碼更靈活。
posted on 2025-05-23 12:51 UnKn0wN__XD 閱讀(33) 評論(0) 收藏 舉報

浙公網安備 33010602011771號