题目集8~9的总结

前言

(总结两次题目集的知识点、题量、难度等情况)

第八次题目集

本次题目集的题目分别为:
点线面问题重构(继承与多态)、雨刷程序功能扩展设计、航空货运管理系统(类设计)

1. 知识点

主要知识点有(1).继承与多态(2).类设计(3).抽象类与接口

2.题量

题量适中

3.难度

难度中等

第九次题目集

本次题目集的题目分别为:
魔方问题、点线面问题再重构(容器类)、航空货运管理系统(继承与多态)

1. 知识点

主要知识点有(1).容器类(2).继承与多态

2.题量

题量适中

3.难度

难度较难

设计与分析

(重点对题目的提交源码进行分析)

第八次题目集

题目:点线面问题重构(继承与多态)

image

image

SourceMonitor报表分析

度量指标

方法数量:每个类有合理数量的方法(3-6个)

继承深度:合理的单层继承结构

耦合度:Line类与Point类有合理耦合

方法复杂度:所有方法都很简单,复杂度低

注释率:代码缺乏注释,需要改进

关键指标

抽象类使用:正确使用了抽象类和抽象方法

多态应用:Main类中展示了良好的多态应用

封装性:所有属性都是private,通过getter/setter访问

image

类图分析

Element抽象类

作为所有图形元素的基类

定义了抽象的display()方法,强制子类实现

体现了"依赖倒置"原则,高层模块依赖于抽象

Point类

表示二维坐标系中的点

良好的封装:私有属性+公共访问方法

display()方法格式化输出坐标,保留两位小数

Line类

表示带颜色的线段

包含两个Point对象,演示了对象组合

getDistance()方法计算线段长度(两点间距离)

display()方法显示完整线段信息

Plane类

最简单的图形元素,只有颜色属性

演示了继承体系的扩展性

心得总结

这段代码很好地演示了面向对象编程的几个核心概念:

继承:通过Element抽象类建立继承体系

多态:Main类中统一处理不同类型的Element

封装:所有类都隐藏内部实现细节

抽象:Element类定义了高层抽象概念

在实际项目中,这种设计模式非常有用,特别是当系统需要处理多种类似但又有差异的对象时。通过抽象基类定义共同接口,可以大大简化客户端代码,提高系统的扩展性和维护性。

题目:雨刷程序功能扩展设计

image

image

SourceMonitor报表分析

度量指标

方法数量:每个类有合理数量的方法(3-8个)

继承深度:合理的单层继承结构

耦合度:Agent类与其他类耦合度较高,但这是设计需要

方法复杂度:calculateSpeed()方法复杂度较高,但可接受

注释率:代码缺乏注释,需要改进

关键设计指标

抽象工厂模式:通过WiperSystemFactory创建相关对象族

策略模式:SpeedStrategy封装了速度计算算法

多态应用:通过工厂创建不同类型的组件

封装性:所有属性都是private,通过方法访问

image

类图分析

工厂接口和实现

interface WiperSystemFactory {
Lever createLever();
Dial createDial();
SpeedStrategy createSpeedStrategy();
}

class BasicWiperSystemFactory implements WiperSystemFactory {
// 创建基本型组件
}

class AdvancedWiperSystemFactory implements WiperSystemFactory {
// 创建高级型组件
}
抽象工厂模式让系统可以创建一组相关对象

方便扩展新的雨刷系统类型

策略模式实现

interface SpeedStrategy {
int calculateSpeed(int leverPos, int dialPos);
}

class BasicSpeedStrategy implements SpeedStrategy {
// 基本型速度计算逻辑
}

class AdvancedSpeedStrategy implements SpeedStrategy {
// 高级型速度计算逻辑
}
将速度计算算法封装成独立策略

可以独立变化而不影响其他组件

控制组件实现

abstract class Lever {
// 公共控制杆逻辑
public abstract String getPositionName();
}

class BasicLever extends Lever {
// 基本型控制杆实现
}

class AdvancedLever extends Lever {
// 高级型控制杆实现
}
模板方法模式:抽象类定义骨架,子类实现细节

控制杆位置名称由具体子类决定

Agent协调类

java
class Agent {
private Lever lever;
private Dial dial;
private Brush brush;
private SpeedStrategy speedStrategy;
public void processOperation(int choice) {
// 处理用户操作
updateBrushSpeed();
}
}
作为系统的协调者,封装了核心业务逻辑

负责接收操作并更新系统状态

心得总结

这段代码展示了几个重要的设计模式在实际问题中的应用:

抽象工厂模式:优雅地创建相关对象族,支持多种雨刷系统配置

策略模式:封装变化点,使速度计算算法可以独立变化

模板方法模式:在Lever类中定义操作骨架,子类实现细节

这种设计的主要优势在于:

系统结构清晰,各组件职责明确

扩展新类型雨刷系统非常方便

算法变化不会影响其他组件

客户端代码(Agent)与具体实现解耦

在实际的汽车电子系统开发中,这种设计模式非常适用,因为它:

支持不同车型的配置变化

便于维护和升级

组件可测试性强

适应需求变化的灵活性高

题目:航空货运管理系统(类设计)

(重点分析)
image

image

SourceMonitor报表分析

度量指标

方法数量:各类方法数量适中(3-10个)

继承深度:合理的单层继承结构

耦合度:Agent类与其他类耦合度较高

方法复杂度:huowuxingxi中的计费计算方法复杂度较高

注释率:代码完全缺乏注释,严重影响可读性

关键指标

继承结构:合理使用抽象基类xingxi

组合关系:yunsongxingxi包含huowuxingxi列表

接口应用:支付方式使用接口定义

业务逻辑:运费计算和载重检查逻辑完整
image

类图分析

核心类分析
xingxi抽象类

abstract class xingxi {
private String bianhao;
// ...getter/setter...
abstract void display();
}
作为所有信息类的基类

定义了编号属性和显示抽象方法

体现了模板方法模式

huowuxingxi类

class huowuxingxi extends xingxi {
// 多种货物属性
double tijizhongliang = changdukuandugaodu/6000; // 体积重量计算
// 复杂的运费计算方法...
}
包含完整的货物信息和运费计算逻辑

计算体积重量和实际重量的较大值作为计费重量

根据重量区间计算费率

yunsongxingxi类

class yunsongxingxi extends xingxi {
private ArrayList List;
// 管理货物列表和计算总运费
}
核心业务类,管理订单信息

包含发件人和收件人信息

计算订单总重量和总金额

支付系统

interface zhifufangshi {
void zhifujiner();
}

class weixinzhifu implements zhifufangshi {
// 微信支付实现
}
简单但可扩展的支付接口设计

目前只实现了微信支付

Agent协调类

class Agent {
// 组合客户、航班和运输信息
Boolean shifoukeyizhuangxia() {
return hangbanxingxi2.getzaizhongliang() >= yunsongxingxi2.getzongzongliang();
}
// 显示完整订单信息
}
系统的协调中心

检查航班载重能力

显示完整订单信息

心得总结

这段代码展示了一个完整的航空货运业务系统,具有以下特点:

业务逻辑复杂但完整:

体积重量与实际重量比较

分段费率计算

航班载重检查

面向对象特性应用:

继承用于信息类统一管理

组合用于订单与货物关系

接口用于支付系统扩展

实际应用价值:

系统设计符合实际货运业务需求

核心计算逻辑具有商业实用性

数据结构设计合理

主要问题在于代码可读性和可维护性:

拼音命名严重影响代码理解

缺乏注释增加维护难度

部分类职责过重(如huowuxingxi)

改进方向:

首先解决命名问题,使用英文专业术语

添加全面注释,特别是业务逻辑部分

重构复杂类,分解职责

增强系统健壮性,添加异常处理

第九次题目集

题目:魔方问题

image

image

SourceMonitor报表分析

度量指标

方法数量:每个类有3-5个方法,数量适中

继承深度:合理的两层继承结构

耦合度:RubikCube与Solid耦合合理

方法复杂度:所有方法都很简单,复杂度低

注释率:代码完全缺乏注释

关键指标

抽象类使用:正确使用了抽象类和抽象方法

多态应用:Main类中通过抽象类引用调用具体实现

封装性:所有属性都是private/protected,通过方法访问

image

类图分析

核心类分析
Solid抽象类

abstract class Solid {
protected double side;
abstract double getSide();
abstract void setSide(double side);
abstract double getArea();
abstract double getVolume();
}
作为所有几何体的基类

定义了边长属性和基本操作方法

使用protected修饰side,允许子类直接访问

具体几何体类

class Cube extends Solid {
// 实现立方体的面积和体积计算
}

class RegularPyramid extends Solid {
// 实现正四面体的面积和体积计算
}
各自实现了几何计算的具体逻辑

公式正确:立方体V=a³,正四面体V=a³√2/12

RubikCube抽象类

abstract class RubikCube {
private String color;
private int layer;
private Solid solid;
// 抽象方法
abstract double getArea();
abstract double getVolume();
}
表示多层魔方的抽象概念

包含颜色、层数和基本几何体

定义了计算面积和体积的抽象方法

具体魔方类

class SquareCube extends RubikCube {
// 实现立方体魔方的计算
}

class RegularPyramidCube extends RubikCube {
// 实现四面体魔方的计算
}
计算考虑了层数的影响:面积与层数平方成正比,体积与层数立方成正比

公式正确反映了魔方的几何特性

Main类分析

public class Main {
public static void main(String[] args) {
// 输入处理
RubikCube cube1 = new SquareCube(...);
RubikCube cube2 = new RegularPyramidCube(...);
display(cube1);
display(cube2);
}
static void display(RubikCube cube) {
// 统一显示魔方信息
}
}
良好的多态应用:通过RubikCube抽象类处理不同具体魔方

显示方法格式化输出,保留两位小数

心得总结

这段代码展示了面向对象设计在几何计算中的应用,主要特点包括:

良好的抽象:通过Solid和RubikCube抽象类定义共同接口

多态威力:Main类无需关心具体魔方类型

数学正确性:几何计算公式准确

扩展性强:可以轻松添加新的几何体和魔方类型

主要改进空间:

工程实践方面:注释、命名、输入验证等

数学常量可以缓存以提高性能

可以考虑使用设计模式进一步解耦

这种类型的系统在CAD建模、游戏开发等领域有实际应用价值。良好的设计可以使系统更容易维护和扩展,特别是当需要支持更多几何类型时。

核心设计思想值得借鉴:

将不变的部分(几何计算)与可变的部分(魔方特性)分离

通过抽象层降低耦合度

利用多态简化客户端代码

题目:点线面问题再重构(容器类)

image

image

SourceMonitor报表分析

度量指标

方法数量:每个类有3-8个方法,数量适中

继承深度:合理的单层继承结构

耦合度:GeometryObject与Element耦合合理

方法复杂度:Main类的while循环复杂度较高

注释率:代码完全缺乏注释

关键指标

抽象类使用:正确使用Element抽象类

多态应用:通过Element抽象类处理不同几何对象

封装性:所有属性都是private,通过方法访问

image

类图分析

核心类分析
Element抽象类

abstract class Element {
abstract void display();
}
作为所有几何元素的基类

定义了display()抽象方法,强制子类实现

简单但有效的抽象设计

具体几何元素类

class Point extends Element {
// 点坐标和显示实现
}

class Line extends Element {
// 线段(两点+颜色)和显示实现
// 包含计算线段长度的方法
}

class Plane extends Element {
// 平面(颜色)和显示实现
}
各自实现了特定的几何元素

Line类包含业务逻辑(计算长度)

显示格式统一保留两位小数

GeometryObject管理类

class GeometryObject {
private ArrayList list;
// 添加、删除和获取元素列表的方法
}
核心管理类,维护几何对象集合

提供简单的CRUD操作

索引处理需要注意(remove(index-1))

Main类分析

public class Main {
public static void main(String[] args) {
// 菜单式交互处理
while(choice != 0) {
switch(choice) {
// 处理各种操作
}
}
// 显示所有几何对象
for(Element e:geome.getList()) {
e.display();
}
}
}
采用简单的控制台菜单交互

输入验证确保坐标在(0,200]范围内

利用多态统一处理各种几何对象

缺乏错误恢复机制(直接System.exit)

心得总结

这段代码展示了面向对象设计在几何图形管理中的应用,主要特点包括:

良好的抽象:通过Element抽象类统一几何对象接口

多态威力:统一管理不同类型的几何对象

封装性:隐藏实现细节,暴露必要接口

实用功能:包含基本的几何计算(线段长度)

主要改进空间:

工程实践方面:注释、错误处理、交互设计

功能完整性:缺乏编辑和持久化功能

健壮性:输入处理可以更完善

这种类型的系统在CAD软件、图形编辑工具中有实际应用价值。当前设计具有良好的扩展性,可以方便地添加新的几何类型(如圆形、多边形等)。

值得借鉴的设计思想:

抽象基类定义共同接口

集合管理配合多态处理

业务逻辑与显示分离

题目:航空货运管理系统(继承与多态)

(重点分析)
image
image

SourceMonitor报表分析

度量指标

方法数量:核心类有5-10个方法,数量适中

继承深度:合理的两层继承结构

耦合度:Agent类与其他类耦合度较高(设计需要)

方法复杂度:运费计算方法复杂度中等

注释率:代码完全缺乏注释

关键指标

抽象类使用:正确使用抽象类定义核心接口

多态应用:通过抽象类处理不同客户/货物类型

封装性:属性私有,通过方法访问

单一职责:各类职责划分明确

image

类图分析

核心类分析
客户体系(kehu)

abstract class kehu {
// 客户基本信息
abstract double getzhekoulv();
}
支持个人客户(9折)和企业客户(8折)

折扣率作为抽象方法由子类实现

货物体系(huowu)

abstract class huowu {
// 计算体积重量和实际重量的较大值
double getjifeizhongliang() {
return max(体积重量, 实际重量);
}
abstract double getfeilv(); // 费率计算
abstract double getyunfei(); // 运费计算
}
支持普通、加急和危险品三种货物

每种货物有不同费率标准

计算逻辑考虑了体积重量和实际重量

航班管理(hangban)

class hangban {
// 航班基本信息+最大载重限制
}
记录航班起降信息和载重限制

用于检查货物总重量是否超限

订单管理(dingdan)

class dingdan {
// 订单基本信息+收发件人信息
}
记录订单核心信息

关联发货人和收货人数据

支付系统(zhifu)

abstract class zhifu {
abstract String gettype();
}
支持微信、支付宝和现金支付

简单但可扩展的设计

货物容器(huowurongqi)

class huowurongqi {
private ArrayList list;
// 管理货物列表并计算总重量和总运费
}
核心业务类,管理订单中的货物集合

提供总重量和总运费计算

协调者(Agent)

class Agent {
// 协调各组件工作
void display() {
// 显示完整订单信息
// 检查载重限制
}
}
系统的核心协调者

负责业务流程控制和信息展示

包含业务规则验证(载重检查)

心得总结

这段代码展示了一个完整的业务系统设计,主要特点包括:
完善的业务建模:

准确反映了航空货运的业务规则

体积重量与实际重量比较

分段费率计算

客户折扣体系

良好的OO设计:

抽象类定义核心接口

多态处理业务变化

合理的类职责划分

实际应用价值:

系统设计符合行业实际需求

核心计算逻辑具有商业价值

数据结构设计合理

主要改进空间:

工程实践:命名、注释、异常处理

用户体验:交互提示和错误恢复

性能考虑:大量货物时的计算效率

这种类型的系统在物流行业有广泛应用,良好的设计可以:

降低维护成本

提高扩展灵活性

保证业务规则一致性

提升代码可读性和可测试性

采坑心得

(对源码的提交过程中出现的问题及心得进行总结)

提交过程中遇到的典型问题

1.命名规范问题

  • 大量使用拼音命名(如kehu、huowu等),降低了代码可读性

  • 解决方案:改用英文专业术语(如Customer、Cargo),采用驼峰命名法

2.代码注释缺失

  • 整个代码库几乎没有注释

  • 解决方案:添加完整的Javadoc注释,关键算法添加行内注释

3.异常处理不足

  • 多处直接使用System.exit(0),缺乏友好的错误恢复机制

  • 解决方案:引入自定义异常类,实现优雅的错误处理流程

4.设计模式应用不充分

  • 虽然使用了继承,但工厂模式、策略模式等应用不够

  • 解决方案:将费率计算等业务逻辑提取为策略模式

5.输入验证缺失

  • 对用户输入缺乏全面验证

  • 解决方案:添加边界检查、格式验证等

技术层面的心得体会

1.面向对象设计

  • 抽象类和多态的使用是亮点,但可以进一步优化:

  • 将变化点(如折扣率、费率)提取为接口

  • 考虑使用组合替代继承的部分场景

2.业务逻辑封装

  • 运费计算等核心业务逻辑封装良好

  • 建议:将业务规则(如重量分段)配置化,提高灵活性

3.模块化设计

  • 各组件职责划分基本清晰

  • 改进点:可以按功能模块分包(如customer、cargo、payment等)

工程实践方面的收获

1.版本控制经验

  • 频繁的小步提交比大改动后一次性提交更安全

  • 有意义的commit message非常重要

2.代码审查意识

  • 通过审查发现了很多命名和设计问题

  • 建立代码规范文档非常必要

3.测试驱动开发

  • 缺乏单元测试导致修改时缺乏信心

  • 体会:应该先写测试再开发功能

项目管理方面的启示

1.需求分析

  • 前期需求理解不深导致部分设计不合理

  • 教训:应该先完善需求文档再编码

2.进度把控

  • 功能开发时间预估不准确

  • 改进:拆解任务,使用敏捷开发方法

3.文档建设

  • 系统缺乏设计文档和使用说明

  • 经验:文档应与代码同步更新

改进建议

(对相应题目的编码改进给出自己的见解,做到可持续改进)

  1. 架构优化
  • 引入分层架构(表现层、业务层、持久层)

  • 考虑微服务化改造

2.性能优化

  • 大数据量下的计算性能需要关注

  • 引入缓存机制

3.安全加固

  • 添加敏感数据加密

  • 完善权限控制

4.DevOps实践

  • 建立CI/CD流水线

  • 引入代码质量扫描工具

总结

(对本阶段两次题目集的综合性总结)
通过本次项目开发,深刻体会到:

1.良好的编码习惯比实现功能更重要

2.设计阶段多花时间能大幅减少后期修改成本

3.文档和测试不是可选项,而是必选项

4.代码评审是提高质量的有效手段

5.保持持续重构的意识至关重要

posted @ 2025-05-18 14:59  良穗  阅读(26)  评论(0)    收藏  举报