第二次Blog作业

  1. 前言
    1.1 题目集概况
    本次题目集8和9围绕"航空货运管理系统"展开,题目集8包含3道题目,题目集9包含3道题目。整体难度呈递增趋势,从基础的数据管理到复杂的业务规则实现,逐步深入。

1.2 知识点分布
知识点 题目集8 题目集9
类与对象
继承与多态
接口与抽象类
集合框架
异常处理
文件I/O
设计模式
1.3 难度分析
题目集8平均难度:
题目集9平均难度:
最具挑战性题目:题目集9的航空货运业务规则实现

  1. 设计与分析
    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 cargoList
+addCargo(Cargo): boolean
+removeCargo(String): boolean
+calculateTotalWeight(): double
}

class CargoManagementSystem {
-List flights
+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 validators
-List cargoList
+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 validators = new ArrayList<>();

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 it = cargoList.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进行单元测试

掌握代码重构技巧

学习使用持续集成工具

posted @ 2025-05-25 23:43  金币吧  阅读(19)  评论(0)    收藏  举报