BID considera urgente inversiones para infraestructura en América Latina Spanish.xinhuanet.com
一、前言
作为一名计算机专业的学生,Java语言的学习贯穿了我整个学期的编程课程。回顾这一学期的Java学习历程,从最初的困惑迷茫到如今的渐入佳境,我深刻体会到了"量变引起质变"的学习规律。学习初期,面对抽象晦涩的面向对象概念,我常感到力不从心,例如对类与对象、继承与多态等。在结合线上线下课程的笔记和PTA作业的练习后,我逐渐理解其意义和用法,学习状态也逐步进入正轨。在准备翻转课堂学习JavaFX时,看到自己设计的交互界面能够流畅运行所产生的成就感让我对编程产生了前所未有的热情,也让我真正体会到了编程的乐趣和创造力。
二、学习方式
1、线上线下课程结合学习:
学堂在线的系统化课程为我搭建了完整的Java知识框架。通过视频讲解和配套练习,我能够在线下课前提前了解课程相关知识点,对于线下未能理解的困难概念可以在线上课程反复观看学习。而部分章节后附带的选择题和判断题,有助于我及时检验学习效果,发现知识盲点。
在线下课堂中,老师的现场讲解往往能够深入浅出地剖析复杂概念。而后期的"翻转课堂"形式,我们小组负责讲解JavaFX中的Scrollbar组件,而我具体承担了图片轮播的代码实现工作,不仅要知道如何使用组件,还要理解其背后的设计原理。准备讲解材料的过程极大地锻炼了我的知识整合能力和表达能力。
2、PTA作业
PTA平台的编程作业贯穿了整个学习过程,按照难度和重点可以分为三个递进阶段。第一阶段着重培养Java语法和程序结构的掌握,通过大量练习熟悉控制流程、数组操作等基本要素。这一阶段虽然题目简单,但为后续学习打下了坚实基础。
第二阶段是转折点,作业要求从过程式思维转向对象式思维,但该阶段更多的是考察算法设计的能力。这一阶段的作业让我深刻体会到面向对象编程的威力,在不断学习各种算法的同时,也开始关注代码的组织结构和设计原则。
第三阶段涉及接口、泛型、集合框架等复杂概念,重点考察了类设计的能力,设计合理的类结构、把握对象间的交互关系成为重点。通过第二、三两个阶段的磨练,我的编程能力得到提升,基本能够设计并实现较为复杂的应用程序。
3、五次实验迭代
五次实验项目是对理论知识的全方位检验。从最初的控制结构实验到最后的JavaFX图形界面开发,每个实验都针对特定知识点设计了实践场景。特别是"大象装冰箱"系列实验,通过不断迭代升级,让我亲身体验了软件开发的演进过程。从简单的类设计到引入继承多态,再到抽象类和接口的应用,最后实现可视化界面,这一系列实验生动展示了面向对象编程的各个层面。
实验过程中遇到的种种问题也促使我不断思考和探索。比如在动物排序功能的实现中,最初的做法简单粗暴,随着需求变化不得不重构代码。最开始排序方法sort()在Eletric中实现,然后将其封装为Sort类,最后取消Sort类,使用Comparator、Comparable接口实现排序,这让我深刻理解了设计灵活性的重要性。而在JavaFX实验中,动画效果的卡顿问题又引导我研究性能优化的各种技巧。
4、Blog总结
撰写三次阶段性Blog总结是极有价值的反思过程。通过系统梳理学习内容、分析代码质量、总结经验教训,我得以从更高视角审视自己的学习轨迹。第一次Blog聚焦电梯调度问题的三次迭代,我详细比较了不同设计方案的优劣,认识到单一职责原则对软件可维护性的关键影响。第二次Blog分析航空货运系统时,我对多态和接口的应用有了更深理解。这些总结不仅巩固了已学知识,更重要的是培养了批判性思维和自我评估能力。通过客观分析自己的代码,找出设计缺陷和优化空间,我的编程思维日趋成熟,而Blog写作过程也锻炼了我的技术表达能力。
三、知识的总结
1、七大编程原则(SOLID+2个拓展)
七大编程原则作为编程重要原则,在实际编程中有着极为重要的作用。在这一学期的学习中,我多次因为未遵守七大原则而踩坑踩雷,也因此不断在实际应用中加深对这七大原则的理解和应用。
(1)迪米特法则(Law of Demeter):不要和陌生人说话(不要调用其他类中的方法,尽量不与其他类产生关系);只和直接朋友联系通信(可以调用直接关系类中的方法);最少知识原则(调用方法时尽量少)。例如在电梯调度系统中,将Controller类作为中介,减少了Elevator与RequestQueue的直接交互。
(2)单一职责原则(SRP):一个类应该只有一个引起变化的原因。这一原则改变了我的类设计理念。从最初将所有功能堆砌在一个类中,到学会识别和分离封装,这个过程让我体会到高内聚设计的价值。每个类专注于单一功能的实现,不仅提高了代码可读性,也大大简化了后续维护工作。例如在第三次电梯迭代中,将原来的Elevator类拆分为Elevator、Passenger和Controller三个类,各自职责明确。
(3)里氏替换原则(LSP):若对每个类型为S的对象,o1都有类型为T的对象,使得以T定义的所有程序P在所有的对象o1中都替换o2时,程序P的行为没有变化,那么类型S是类型T的子类型;子类必须能够替换它们的父类。例如在航空货运系统中,各种Payment子类都能无缝替换父类,不影响系统行为。
(4)接口隔离原则(ISP):客户端不应该依赖它不需要的方法(接口太大时需将其分割成一些更细小的接口;使用接口客户端时仅需知道与其相关的方法;每个接口承担一种相对独立的角色)。该原则指导我设计高度专注的接口。避免创建"全能接口",而是根据客户端需求定义特定功能的接口,这一转变显著提高了代码的灵活性和可维护性。例如在实验四中设计的Attackable接口只包含getAttackPower()方法,非常专注。
(5)依赖倒转原则(DIP):高层模块不应依赖低层模块,二者都应依赖抽象。例如在支付系统中,Order类依赖Payment接口而非具体实现。
(6)开闭原则(OCP):对扩展开放,对修改关闭。例如在几次实验迭代中通过继承和重写扩展了Animal类而不修改原有代码。
(7)合成复用原则(CRP):优先使用对象组合而非继承。例如在电器系统中使用ArrayList组合管理动物集合,而非通过继承。
2、类与类之间的关系
(1)依赖关系是最基础也是最普遍的类间连接,如Controller依赖Elevator执行操作。我学会了在方法参数和局部变量中合理使用依赖,保持关系的临时性和松散性。这种短暂的联系特别适合那些不需要持久保持的对象交互。
(2)关联关系表达了对象间更持久的联系。通过实践,我掌握了双向关联和单向关联的应用场景,理解了导航方向对设计的影响。电器与动物之间的包含关系就是典型的关联实例。
依赖与关联类似,但是关联的耦合度比依赖更高,所以可以使用依赖时尽量不使用关联。
(3)聚集关系分为组合与聚合。其中组合意味着更强的所有权和生命周期绑定,整体消亡,部分也随之消亡(唇亡齿寒),其代码表现类似于关联。如动物与它吃掉的动物之间的关系;聚合则是相对松散的集合关系,如电器中的动物列表。准确把握这些关系对设计清晰的类结构至关重要。如Animal包含eatenAnimals列表,是典型的组合关系。
3、封装
封装是面向对象的基石,这种信息隐藏不仅提高了代码安全性,还简化了外部使用方式。而良好的封装也带来了意外的维护优势。当需要修改内部实现时,只要保持接口不变,就不会影响依赖该类的其他代码。这种隔离变化的能力在项目迭代过程中显得尤为宝贵。
4、继承
继承实现了代码复用和层次化设计,但是一个子类只能有一个父类,同时耦合度高。继承不仅仅实现了代码复用,更重要的是为代码提供了可拓展性,这对于后续代码的优化迭代奠定了基础。
5、多态
多态特性赋予程序极大的灵活性。通过统一的接口操作不同类型的对象,使系统更易于扩展和维护。例如在“将动物放入冰箱”实验中,通过父类引用调用子类特有的bark方法。而多态与继承的结合使用尤其强大。当新动物类型需要加入系统时,只需扩展类层次而无需修改现有代码,这种开闭原则的实现极大提高了系统的可扩展性。
6、抽象类
抽象类定义通用行为而将部分实现留给子类。例如实验中Animal抽象类规定了所有动物必须实现bark()方法。这种设计既避免了代码重复,又保持了足够的灵活性。
7、接口
接口定义契约而不关心实现。通过定义精确定义的接口,可以创建出高度模块化的系统,其中各个组件可以独立发展和替换。例如在实验四中通过Attackable接口标记有攻击性的动物。
对于抽象类与接口的选择:当需要为派生类提供共同的基础实现时,抽象类是更合适的选择;而当只需要定义行为契约时,接口则更为轻量和灵活。
8、ArrayList/List和Comparator/Comparable接口(集合框架)
ArrayList和List接口是管理对象集合的得力工具。动态数组的特性解决了固定大小数组的限制,而丰富的API则大大简化了集合操作。
Comparator和Comparable接口提供了灵活的排序机制。通过实现自定义比较逻辑,可以按照各种需求对对象集合进行排序。例如在实验四的动物排序功能中,基于攻击性和体重的复杂比较逻辑就是通过这些接口实现的。
9、JavaFX
JavaFX从基本控件的布局到事件处理机制,再到动画效果的实现,可以创建丰富的图形界面。在翻转课堂中负责Scrollbar组件和图片轮播的实现,加深了我对UI组件的交互机制的理解。
10、异常处理
异常处理机制从语法要求发展为健壮性设计的重要组成部分,这也是我下一步需要改进的问题,例如如何合理使用try-catch-finally结构防止程序崩溃。
四、踩坑心得
1、初期类设计的不合理给我上了宝贵的一课,尤其是第二阶段的PTA作业,让我深刻认识到事先做好良好的设计可能比实际编程中优良的算法更为重要。同时类设计必须遵循单一职责原则,合理划分功能模块。也要合理运用继承、抽象类和接口,便于代码的修改和迭代。
2、命名规范的重要性在实践中凸显。早期的随意命名如"function1""a1"等,不仅降低可读性,还给后期再次阅读代码带来困难。通过不断改进,我形成了系统的命名规则:类名使用名词短语,方法名使用动词短语,变量名反映用途和类型,同时可以添加适当的注释注明。
五、改进建议和总结
在编码前先绘制类图,明确各类职责和关系,遵守单一职责原则。然后要坚持良好的命名习惯,添加适量注释,提高可读性。
Java作为一门强大的面向对象语言,其丰富的特性和生态系统为我打开了编程世界的大门。一个学期的Java学习只是基础,更重要的是培养了面向对象的思维方式,养成正确有效的学习方法。从最初的语法学习到后来的设计模式应用,从控制台程序到图形界面开发,每一步都让我受益匪浅。特别是通过PTA作业和五次实验的实践,我深刻理解了理论知识与实际应用的关系。
学习Java的历程让我明白,编程不仅是技术,更是一种思维方式和创造力的表达。每当看到自己攻关克难设计的程序顺利运行,那种成就感是无可替代的。软件工程的学习之路还很长,但我已经准备好迎接更多挑战。