第二次Blog作业
- 前言
1.1 题目集概况
本次题目集8和9围绕"航空货运管理系统"展开,题目集8包含3道题目,题目集9包含3道题目。整体难度呈递增趋势,从基础的数据管理到复杂的业务规则实现,逐步深入。
1.2 知识点分布
知识点 题目集8 题目集9
类与对象
继承与多态
接口与抽象类
集合框架
异常处理
文件I/O
设计模式
1.3 难度分析
题目集8平均难度:
题目集9平均难度:
最具挑战性题目:题目集9的航空货运业务规则实现
- 设计与分析
2.1 题目集8航空货运管理系统
2.1.1 类图设计
![]()
![]()
class Cargo {
-String id
-String name
-double weight
+getId(): String
+getName(): String
+getWeight(): double
+setWeight(double): void
}
class Flight {
-String flightId
-String departure
-String destination
-List
+addCargo(Cargo): boolean
+removeCargo(String): boolean
+calculateTotalWeight(): double
}
class CargoManagementSystem {
-List
+addFlight(Flight): void
+removeFlight(String): boolean
+findFlightById(String): Flight
+loadCargoData(String): void
+saveCargoData(String): void
}
Cargo "0.." -- "1" Flight
Flight "0.." -- "1" CargoManagementSystem
@enduml
2.1.2 核心代码分析
SourceMontor指标:
方法平均复杂度:2.1
最大复杂度:5(calculateTotalWeight)
代码行数:287
注释率:35%
关键方法:
航班货物添加方法:
java
public boolean addCargo(Cargo cargo) {
if (cargo == null || cargo.getWeight() <= 0) {
return false;
}
if (calculateTotalWeight() + cargo.getWeight() > MAX_CAPACITY) {
return false;
}
return cargoList.add(cargo);
}
复杂度:3,主要处理空值检查和容量验证
数据加载方法:
java
public void loadCargoData(String filename) throws CargoDataException {
try (Scanner scanner = new Scanner(new File(filename))) {
while (scanner.hasNextLine()) {
String[] data = scanner.nextLine().split(",");
if (data.length != 4) continue;
Flight flight = findFlightById(data[0]);
if (flight != null) {
Cargo cargo = new Cargo(data[1], data[2], Double.parseDouble(data[3]));
flight.addCargo(cargo);
}
}
} catch (FileNotFoundException e) {
throw new CargoDataException("File not found: " + filename);
} catch (NumberFormatException e) {
throw new CargoDataException("Invalid weight format");
}
}
复杂度:4,处理文件读取和多种异常情况
2.2 题目集9航空货运管理系统
2.2.1 类图设计
plantuml
@startuml
interface CargoValidator {
+validate(Cargo): boolean
}
class WeightValidator {
+validate(Cargo): boolean
}
class HazardousValidator {
+validate(Cargo): boolean
}
class TemperatureValidator {
+validate(Cargo): boolean
}
class Cargo {
<
#String id
#String name
#double weight
+getTotalWeight(): double
}
class StandardCargo {
+getTotalWeight(): double
}
class SpecialCargo {
-boolean hazardous
-boolean perishable
-double temperature
+getTotalWeight(): double
}
class Flight {
-List
-List
+addValidator(CargoValidator): void
+validateCargo(Cargo): boolean
}
Cargo <|-- StandardCargo
Cargo <|-- SpecialCargo
Flight *-- CargoValidator
CargoValidator <|.. WeightValidator
CargoValidator <|.. HazardousValidator
CargoValidator <|.. TemperatureValidator
@enduml
2.2.2 核心代码分析
SourceMontor指标:
方法平均复杂度:1.8
最大复杂度:4(validateCargo)
代码行数:423
注释率:42%
关键改进:
验证器接口设计:
java
public interface CargoValidator {
boolean validate(Cargo cargo);
}
public class TemperatureValidator implements CargoValidator {
@Override
public boolean validate(Cargo cargo) {
if (!(cargo instanceof SpecialCargo)) return true;
SpecialCargo sc = (SpecialCargo) cargo;
return sc.getTemperature() >= -20 && sc.getTemperature() <= 25;
}
}
航班验证逻辑:
java
public class Flight {
private List
public boolean validateCargo(Cargo cargo) {
return validators.stream()
.allMatch(validator -> validator.validate(cargo));
}
}
3. 采坑心得
3.1 题目集8经验总结
集合修改异常:
问题:在遍历时直接删除元素导致ConcurrentModificationException
测试数据:当航班有3个以上货物时执行删除操作
解决方案:
java
// 错误方式
for (Cargo cargo : cargoList) {
if (cargo.getId().equals(id)) {
cargoList.remove(cargo); // 抛出异常
}
}
// 正确方式
Iterator
while (it.hasNext()) {
if (it.next().getId().equals(id)) {
it.remove();
}
}
重量计算精度问题:
问题:直接使用double计算导致精度丢失
测试用例:添加10个重量为0.1的货物,总和应为1.0但得到0.999...
改进方案:
java
// 使用BigDecimal进行计算
BigDecimal total = BigDecimal.ZERO;
for (Cargo cargo : cargoList) {
total = total.add(BigDecimal.valueOf(cargo.getWeight()));
}
return total.doubleValue();
3.2 题目集9经验总结
验证逻辑扩展问题:
初始设计:将验证规则硬编码在Flight类中
问题:新增验证规则需要修改Flight类
重构方案:采用策略模式
java
// 重构前
public boolean validate(Cargo cargo) {
// 多个if-else判断
}
// 重构后
public void addValidator(CargoValidator validator) {
validators.add(validator);
}
继承体系设计:
错误设计:SpecialCargo直接继承Cargo并覆盖getWeight()
问题:违反LSP原则
UML对比:
plantuml
' 错误设计
class Cargo {
+getWeight(): double
}
class SpecialCargo {
+getWeight(): double {return super.getWeight()*1.2;}
}
' 正确设计
class Cargo {
<
+getTotalWeight(): double
}
class SpecialCargo {
+getTotalWeight(): double {return weight*1.2;}
}
4. 改进建议
4.1 设计模式应用
工厂模式创建对象:
java
public class CargoFactory {
public static Cargo createCargo(String type, String... params) {
switch (type) {
case "SPECIAL":
return new SpecialCargo(params[0], params[1],
Double.parseDouble(params[2]),
Boolean.parseBoolean(params[3]));
default:
return new StandardCargo(params[0], params[1],
Double.parseDouble(params[2]));
}
}
}
4.2 代码质量提升
引入日志框架:
java
private static final Logger logger = LoggerFactory.getLogger(Flight.class);
public boolean addCargo(Cargo cargo) {
if (cargo == null) {
logger.error("Attempt to add null cargo");
return false;
}
// ...
}
单元测试示例:
java
@Test
public void testOverweightCargo() {
Flight flight = new Flight("FL001", 1000);
Cargo cargo = new StandardCargo("C001", "Heavy", 1500);
assertFalse(flight.addCargo(cargo));
}
5. 总结
5.1 学习收获
掌握了面向对象设计的基本原则(SOLID)
理解了设计模式在实际项目中的应用价值
提高了异常处理和边界条件考虑的严谨性
学会了使用工具分析代码质量(SourceMontor)
5.2 后续学习方向
深入研究更多设计模式
学习使用JUnit进行单元测试
掌握代码重构技巧
学习使用持续集成工具



浙公网安备 33010602011771号