课程总结性Blog

面向对象程序设计课程总结性博客
一、前言
面向对象程序设计课程作为计算机相关专业的核心课程,在整个学期的学习中,通过 PTA 作业、实验、线上线下课程等多种教学环节,系统地培养了学生对面向对象编程思想的理解与实践能力。从课程内容来看,涵盖了 Java 语言基础、面向对象核心概念(封装、继承、多态)、高级特性(抽象类、接口、集合框架)、设计模式初步应用以及复杂业务逻辑实现等多个维度,形成了由浅入深、循序渐进的知识体系。
(一)作业与实验概况
PTA 作业作为课程的核心实践环节,共分为多个题目集,每个题目集包含 3-5 道难度梯度分明的题目。从题目集 1 到题目集 9,内容从基础的 Java 语法练习逐步过渡到复杂的系统设计。例如,题目集 1-4 侧重基础语法、数组操作及简单类设计;题目集 5-7 引入正则表达式应用、单部电梯调度等复杂逻辑;题目集 8-9 则深入抽象类、继承、多态及策略模式的综合运用。每次题目集的题量在 3-5 题之间,完成时间通常需要 8-12 小时,难度随着知识点的深入而显著提升,尤其是电梯调度、航空货运管理系统等题目,对逻辑严谨性和代码模块化提出了较高要求。

实验环节与 PTA 作业相辅相成,每周安排 2 课时的线下实验课,内容涵盖课堂知识点的验证性实验和扩展性实践。实验内容从简单的类定义与对象创建,到复杂的系统架构设计,如电梯调度系统的状态机实现、几何图形系统的多态应用等。实验课要求学生现场编写代码并调试,教师针对共性问题进行集中讲解,有效提升了学生的动手能力和问题解决能力。
(二)课程学习强度与难度
线上课程通过视频讲解和 PPT 演示,系统介绍了面向对象的理论知识,每个知识点配备相应的例题和练习。线下课程则以案例分析和互动讨论为主,深入剖析复杂问题的设计思路。课程的整体工作量较大,每周需要投入 15-20 小时用于听课、完成作业、调试代码及复习巩固。难度方面,初期的基础内容相对容易掌握,但随着面向对象高级特性和设计模式的引入,尤其是在处理多状态交互、复杂业务规则时,如电梯调度中的方向决策、航空货运中的计费策略,对逻辑思维和系统设计能力提出了严峻挑战。
(三)学习收获与挑战
通过整门课程的学习,不仅掌握了 Java 语言的核心语法和面向对象编程的基本思想,更重要的是培养了从问题分析到系统设计的完整思维流程。在解决 PTA 题目和实验项目的过程中,逐渐体会到面向对象设计的优势,如代码的可复用性、可维护性及可扩展性。然而,课程学习过程中也面临诸多挑战,如复杂业务逻辑的抽象、设计模式的灵活应用、代码复杂度的控制等,这些都需要通过持续的实践和反思来提升。
二、面向对象技术总结
(一)封装:数据与行为的统一
封装作为面向对象的基础特性,在课程初期的作业中就有深入实践。通过将数据(属性)和操作数据的方法(行为)封装在一个类中,实现了数据的隐藏和保护。例如,在题目集 5 的电梯调度系统中,Elevator类封装了当前楼层、运行方向、状态等属性,以及楼层校验、状态更新等方法,外部只能通过类提供的公共方法来访问和修改属性,避免了数据的非法操作。
在封装的实践中,深刻理解了访问修饰符(private、protected、public)的作用:
• private用于类内部属性的封装,确保数据只能通过类的方法访问;
• public用于暴露类的对外接口,实现与其他类的交互;
• protected在继承场景中实现子类对父类成员的有限访问。
然而,在初期的代码设计中,曾出现过属性过度暴露的问题,如将关键状态属性设为public,导致外部类直接修改,破坏了封装性。通过后续的代码重构和单元测试,逐渐养成了将属性设为private并提供getter/setter方法的良好习惯。
(二)继承与多态:代码复用与行为抽象
继承和多态是面向对象编程的核心特性,在课程的中后阶段作业中得到了充分应用。通过继承,可以创建子类复用父类的属性和方法,同时添加特有的功能;通过多态,父类引用可以指向子类对象,实现不同子类对象的统一处理。

  1. 继承的实践应用
    在题目集 8 的几何图形系统中,设计了抽象基类Element,定义了display()抽象方法,Point、Line、Plane等子类继承Element并实现各自的显示逻辑。这种设计使得系统能够以统一的方式处理不同类型的图形对象,提高了代码的复用性。例如:
    java
    Element element = new Point(1, 2);
    element.display(); // 调用Point的display方法
    element = new Line(new Point(0, 0), new Point(3, 4), "red");
    element.display(); // 调用Line的display方法
    在题目集 9 的航空货运管理系统中,Customer抽象类作为客户基类,定义了基本属性和getDiscountRate()抽象方法,IndividualCustomer和CorporateCustomer子类分别实现该方法,返回不同的折扣率。这种继承关系清晰地表达了 "客户" 的不同类型及其差异化行为。
  2. 多态的深度理解
    多态的实现依赖于继承、方法重写和父类引用指向子类对象。在货物计费系统中,Item抽象类定义了calculatePrice()方法,不同类型的货物(普通货物、危险货物、加急货物)子类重写该方法,实现不同的计费规则。当处理订单时,通过Item类型的引用调用calculatePrice()方法,实际执行的是对应子类的实现,体现了多态的动态绑定特性。
    然而,在继承的使用中也存在一些误区:
    • 过度使用继承导致类层次结构复杂,如在初期设计雨刷系统时,将多种功能混杂在一个继承体系中,导致代码难以维护;
    • 子类对父类方法的重写不符合里氏替换原则,导致程序运行时异常。通过学习设计模式中的组合替代继承原则(合成复用原则),逐渐学会在合适的场景使用组合关系替代继承,提升代码的灵活性。
    (三)抽象类与接口:行为契约的定义
    抽象类和接口是面向对象设计中定义 "契约" 的重要工具,二者在课程作业中均有广泛应用。
  3. 抽象类的应用
    抽象类通过包含抽象方法(未实现的方法)强制子类实现特定行为,同时可以提供部分方法的默认实现。在魔方计算系统中,Solid抽象类定义了getArea()和getVolume()抽象方法,RubikCube子类继承Solid并实现这些方法,计算不同类型魔方的表面积和体积。抽象类的使用使得系统在设计阶段就明确了子类必须实现的功能,提高了代码的规范性。
  4. 接口的实践
    接口是完全抽象的类型,只定义方法签名而不提供实现,实现接口的类必须实现所有接口方法。在题目集 9 的支付系统中,定义了PaymentStrategy接口:

java
interface PaymentStrategy {
String getPaymentMethod();
}

AlipayStrategy、WechatPayStrategy、CashStrategy等类实现该接口,提供不同的支付方式。Order类通过持有PaymentStrategy接口引用,实现支付方式的动态切换,这是策略模式的典型应用,体现了接口在解耦系统组件中的重要作用。

在抽象类和接口的选择上,初期存在混淆:
• 当需要为一组相关类提供公共实现时,应使用抽象类;
• 当需要定义组件的行为契约,不关心实现细节时,应使用接口。

通过实践,逐渐掌握了二者的适用场景,如在几何图形系统中使用抽象类定义公共属性和部分方法,在支付系统中使用接口定义策略行为。
(四)集合框架:数据结构的高效应用
Java 集合框架在课程作业中用于处理各种数据集合,如请求队列、图形对象容器等。常用的集合类包括:

  1. List 接口及其实现类
    在电梯调度系统中,使用LinkedList存储内外请求队列,利用其高效的插入和删除操作特性:
    java
    private LinkedList externalRequests; // 外部请求队列
    private List internalRequests; // 内部请求列表

在几何图形容器中,使用ArrayList存储图形元素,便于通过索引快速访问:
java
private ArrayList elements = new ArrayList<>(); // 图形元素集合
2. Set 接口及其实现类
在请求去重处理中,使用HashSet确保请求的唯一性:
// 优化后的请求队列,使用HashSet去重
private Set uniqueExternalRequests = new HashSet<>();
这种方式比手动去重更高效,且代码更简洁。
3. Map 接口及其实现类
在复杂业务场景中,使用Map存储键值对数据,如客户信息映射、货物类型与费率的对应关系等。

集合框架的使用极大地提高了代码的效率和可读性,但在初期也存在一些问题:

• 未根据业务需求选择合适的集合类型,如在需要频繁插入删除的场景使用ArrayList,导致性能低下;
• 忽略集合的泛型类型,使用原始类型(raw type),导致类型安全问题。通过学习集合框架的特性和使用场景,逐渐能够根据具体需求选择合适的集合实现类,并正确使用泛型。
(五)异常处理:程序健壮性的保障
异常处理机制在课程作业中用于处理程序运行时的错误情况,如输入数据非法、资源访问失败等。在题目集 5 的输入校验中,使用try-catch块处理无效输入:
try {
int floor = Integer.parseInt(input);
// 校验楼层有效性
} catch (NumberFormatException e) {
System.out.println("输入格式错误,请重新输入");
}

在航空货运系统中,处理航班载重不足的异常情况:
if (cargoWeight > flight.getMaxCapacity()) {
throw new IllegalStateException("货物重量超过航班最大载重");
}

然而,异常处理的实践中存在以下不足:

• 过度捕获Exception基类,掩盖了具体的异常类型,不利于问题定位;
• 使用System.exit()直接退出程序,而非抛出异常让调用者处理;
• 未正确关闭资源,如文件输入流的关闭。通过学习异常处理的最佳实践,逐渐养成了定义特定异常类型、合理传播异常、使用try-with-resources处理资源关闭的良好习惯。
(六)JavaFX:图形界面的初步探索
课程后期涉及 JavaFX 的基础知识,用于实现简单的图形界面。在几何图形绘制作业中,使用 JavaFX 创建图形窗口,绘制点、线、平面等图形元素:

java
@Override
public void display() {
Group root = new Group();
Scene scene = new Scene(root, 800, 600);
// 创建图形节点并添加到场景中
Circle point = new Circle(x, y, 5);
root.getChildren().add(point);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
}

JavaFX 的学习拓展了编程视野,了解了图形界面开发的基本流程,但由于课时有限,仅停留在基础应用层面,对于复杂界面布局、事件处理机制等深入内容掌握不足,需要在后续学习中进一步加强。
(七)技术掌握情况总结
通过整门课程的学习,对面向对象核心技术的掌握程度如下:

• 封装:能够熟练运用访问修饰符封装类的属性和方法,理解封装对代码可维护性的重要性;
• 继承与多态:掌握继承的使用场景和多态的实现机制,能够在设计中运用继承实现代码复用,通过多态实现灵活的行为扩展;
• 抽象类与接口:理解二者的区别与联系,能够根据需求选择合适的抽象方式定义系统契约;
• 集合框架:熟悉常用集合类的特性和使用场景,能够根据业务需求选择高效的数据结构;
• 异常处理:掌握异常处理的基本机制,能够合理处理程序运行时的错误情况;
• JavaFX:了解 JavaFX 的基本概念和简单应用,具备开发简单图形界面的能力。

然而,仍有以下技术点需要进一步提升:

• 设计模式的深入应用:目前仅掌握策略模式、工厂模式等少数设计模式的基本应用,对于模板方法、观察者模式等复杂模式理解不够深入;
• 集合框架的高级特性:如Comparator、Stream API等高级功能的使用不够熟练;
• 异常处理的最佳实践:对于异常的分类、传播和处理策略缺乏系统理解;
• JavaFX 的高级功能:如 FXML 布局、动画效果、数据绑定等内容有待深入学习。
三、采坑心得
(一)代码结构设计的误区与改进

  1. 方法复杂度失控
    在题目集 6 的电梯调度系统中,Elevator.action()方法的复杂度高达 37,多层if-else嵌套导致逻辑混乱,可读性极差。该方法同时处理方向判断、请求队列管理、状态更新等多个职责,违反了单一职责原则。

改进措施:

• 将复杂方法拆分为多个小方法,如determineDirection()、processInnerRequests()、processOuterRequests()等;
• 采用状态模式重构电梯状态管理逻辑,将不同状态的处理逻辑封装在独立的状态类中。
2. 类职责不清晰
在早期的航空货运系统设计中,InformationForm类同时承担数据聚合和信息展示的职责,导致代码耦合度高。当需要修改展示方式时,不得不修改数据聚合逻辑,违反了单一职责原则。

改进措施:

• 引入独立的展示层,创建OrderView类负责信息展示;
• InformationForm类专注于数据聚合和业务逻辑处理,实现层间解耦。
(二)业务逻辑处理的常见错误

  1. 请求去重机制不完善
    在题目集 5 的电梯调度中,请求队列未实现有效去重,导致重复处理相同请求,影响电梯运行效率。例如,连续添加楼层 3 的内部请求时,代码未进行去重处理。

改进措施:

• 使用HashSet替代LinkedList存储请求,利用集合的唯一性特性自动去重;
• 重写请求类的equals和hashCode方法,确保相同请求被视为同一个对象。
2. 计费逻辑计算错误
在航空货运系统中,初期错误地使用实际重量而非计费重量(体积重量与实际重量的较大值)进行载重校验,导致航班超载判断不准确。

改进措施:

• 明确计费重量的计算规则,在ItemInformation类中添加getBillingWeight()方法;
• 在载重校验时,调用getBillingWeight()获取计费重量,确保逻辑正确性。
(三)输入校验与异常处理的不足

  1. 输入合法性校验缺失
    在多个题目集中,未对用户输入进行充分校验,如几何图形系统中未检查坐标值是否在有效范围(0 < x/y ≤ 200),导致程序接收非法数据后异常崩溃。

改进措施:

• 在输入处理环节添加严格的合法性校验,如使用正则表达式验证输入格式;
• 对非法输入给出明确的错误提示,引导用户重新输入。
2. 异常处理不规范
初期代码中存在直接使用System.exit()处理错误、捕获异常后不做任何处理等问题,导致程序健壮性差。

改进措施:

• 定义业务特定的异常类,如InvalidInputException、OverloadException等;
• 使用try-catch块合理处理异常,或向上抛出异常让调用者处理;
• 使用finally块或try-with-resources确保资源正确关闭。
(四)测试覆盖不足的问题
在代码开发过程中,初期忽视单元测试,仅通过手动输入测试用例,导致一些边界情况和异常场景未被覆盖。例如,电梯调度中未测试同时存在内外请求且方向冲突的场景,导致程序在该场景下运行逻辑错误。

改进措施:

• 学习使用 JUnit 框架进行单元测试,针对关键方法和业务逻辑编写测试用例;
• 设计全面的测试用例,覆盖正常场景、边界情况和异常场景;
• 在代码提交前执行测试,确保功能正确性。
(五)设计模式应用的生硬与优化
在题目集 9 的支付系统中,初期对策略模式的应用不够灵活,硬编码支付方式的选择逻辑,未实现真正的动态切换。

改进措施:

• 使用反射机制动态加载支付策略类,避免硬编码;
• 设计支付策略工厂类,根据用户输入创建对应的支付策略对象;
• 编写配置文件管理可用的支付策略,提高系统的可扩展性。
(六)经验教训总结
通过课程学习中的各种 "踩坑" 经历,深刻认识到以下几点:

  1. 设计先行的重要性:在编写代码前,应先进行系统设计,绘制类图和流程图,明确类的职责和交互关系,避免边写边改;
  2. 单一职责原则的贯彻:每个类和方法应专注于完成一个明确的职责,这有助于提高代码的可读性和可维护性;
  3. 测试驱动开发的价值:先编写测试用例,再实现功能代码,能够确保代码的正确性和可测试性;
  4. 代码重构的必要性:定期对代码进行重构,优化结构和逻辑,避免代码随着功能增加而变得臃肿混乱;
  5. 设计模式的灵活运用:设计模式是解决常见问题的最佳实践,但需根据实际需求灵活应用,避免为了使用模式而使用模式。
    四、改进建议及总结
    (一)课程内容与安排的改进建议
  6. 加强代码规范与设计原则的教学
    目前课程中对代码规范(如命名规则、代码格式)和设计原则(如单一职责、开闭原则)的讲解不够系统,导致学生代码风格各异,设计质量参差不齐。建议:

• 在课程初期引入 Java 代码规范(如 Google Java Style),并在作业中强调规范的重要性;
• 结合具体案例讲解 SOLID 设计原则,引导学生在设计中应用这些原则;
• 提供优秀代码示例,通过对比分析让学生理解良好设计的优势。
2. 增加设计模式的实践案例
设计模式是面向对象编程的高级内容,目前课程中仅涉及策略模式等少数模式,且案例较为简单。建议:

• 增加工厂模式、模板方法模式、观察者模式等常用设计模式的教学;
• 通过实际项目案例演示设计模式的应用场景和实现方式;
• 在作业中设置设计模式应用的题目,如使用工厂模式创建不同类型的图形对象。
3. 强化异常处理与性能优化的内容
异常处理和性能优化是软件开发的重要方面,目前课程中涉及较少。建议:

• 系统讲解 Java 异常处理机制,包括异常分类、传播策略和最佳实践;
• 引入性能分析工具(如 JProfiler),讲解集合框架的性能特性和优化方法;
• 在作业中设置性能优化的要求,如要求电梯调度算法的时间复杂度控制在合理范围内。
4. 拓展 JavaFX 与实战项目的内容
JavaFX 作为 Java 的图形界面框架,目前课程中仅涉及基础内容,建议:

• 增加 JavaFX 的高级功能教学,如 FXML 布局、数据绑定、动画效果等;
• 安排小型实战项目,如开发一个简单的图形编辑器或电梯监控系统,综合应用所学知识;
• 引入 MVC 架构思想,讲解界面、业务逻辑和数据模型的分离设计。
(二)教学方式与互动的改进建议

  1. 加强实验课的互动与指导
    实验课是学生动手实践的重要环节,建议:

• 增加实验课的互动环节,如分组讨论、代码互评;
• 教师针对实验中常见的错误和问题进行集中讲解和演示;
• 提供实验案例的多种解决方案,引导学生思考不同方案的优劣。
2. 完善线上学习资源
线上课程是课堂教学的重要补充,建议:

• 录制更多的知识点讲解视频,覆盖作业中的难点问题;
• 建立在线讨论区,方便学生提问和交流;
• 提供拓展学习资源,如优秀的技术博客、开源项目案例等。
3. 优化作业的反馈机制
PTA 作业的自动评分机制虽然高效,但缺乏详细的错误分析和改进建议。建议:

• 在 PTA 系统中添加更详细的错误提示,如指出代码中的语法错误或逻辑问题;
• 对复杂题目提供参考设计思路和代码框架,引导学生正确思考;
• 定期进行作业总结,讲解典型问题和优秀解决方案。
(三)个人学习总结与展望
通过整门课程的学习,从最初对面向对象概念的模糊理解,到能够独立设计和实现复杂的系统(如电梯调度、航空货运管理),在编程技能和思维方式上都有了显著提升。深刻体会到面向对象编程不仅仅是一种技术,更是一种解决复杂问题的思维方式,通过封装、抽象、继承、多态等特性,能够将现实世界的问题映射为计算机系统的设计。

然而,也清楚地认识到自己的不足:在系统设计的深度、设计模式的灵活应用、代码性能优化等方面还有很大的提升空间。未来的学习计划如下:

  1. 深入学习设计模式,阅读《设计模式:可复用面向对象软件的基础》等经典书籍,通过实战项目应用各种模式;
  2. 学习 Java 的高级特性,如并发编程、反射机制、函数式接口等,提升代码的灵活性和效率;
  3. 参与开源项目,学习优秀的代码设计和架构思想,拓宽编程视野;
  4. 加强算法和数据结构的学习,提高解决复杂问题的能力;
  5. 学习前端开发技术,如 JavaFX、Web 前端等,实现完整的全栈应用。
    面向对象程序设计课程不仅传授了知识和技能,更培养了计算思维和问题解决能力,这些将成为未来学习和工作中的宝贵财富。感谢课程老师的悉心指导和同学们的互助学习,未来将继续保持学习热情,不断提升自己的编程水平。
posted @ 2025-06-18 19:26  徐程浩  阅读(31)  评论(0)    收藏  举报