272
社区成员




经过了九个星期的《面向对象编程先导》的学习,我学习到了许多大一时的《程序设计基础》和《数据结构与算法》中不曾了解到的知识,更重要的是学习到了以为所不关注的一些编程的思想与实践经验。尽管学习的过程不算轻松,花费大量时间在迭代作业上,但整体来说,还是获益匪浅。
迭代作业共有4次:2、3、4、6,每次添加一些新的功能。
总体来说,我的架构变化不大,并且在后续复杂迭代作业中均没有在强测中掉过测试点,我个人还是挺满意的。
MAIN.java
提供程序入口
AdventurerManager.java
管理冒险者列表
Adventurer.java
有关冒险者的所有指令的具体实现
ItemManager.java
物品管理类,物品栏、背包的实现方式
Item.java
物品接口
Bottle.java
各种药水瓶
HpBottle.java
AtkBottle.java
DefBottle.java
Equipment.java
各种武器
Axe.java
Blade.java
Sword.java
FragmentManager.java
碎片管理类
Fragment.java
AdventureGame.java
冒险游戏类
Guard.java
Treasure.java
Input.java
接受标准输入
AnalyzeAndAct.java
解析标准输入,并执行指令
基本思路就是,每次新增一类对象,便设置一个对象管理类来进行管理,层层递进。
这门课中对Junit的使用其实和《计算机组成原理》中编写Verilog
程序的testbench仿真调试时差不多,大概就是在一个测试的程序中调用需要测试的类和方法,利用断言机制进行debug。
在《面向对象编程先导》课中,我对于Junit的使用有着明显缺陷,我是直接调用AnalyzeAndAct.java
类来测试全局的,大部分时候都不是逐个类,逐个方法测试。但是在某几次debug中还是利用了Junit进行逐个方法的试错,对我的迭代作业有一定的帮助。
使用Junit过程中的还是总结了一些经验:
对于小类含有的小方法,可以只用一个测试方法一并测试。
对于大类的复杂方法,既要分开测试方法测试,也要有一个更大的测试方法测试复杂方法之间的互相影响。
对于接口和继承类,需要重点测试,防止在使用过程中乱套。
进行分块测试后最好也要进行更高层级的大块测试,但不能忽视小块测试的重要性。
重视断言的同时也可以考虑使用重定向标准输入输出进行自动化测评(当然课程中无法使用)。
对程序入口的重新理解
在初次接触作业时,我还是基于《程序设计基础》课程的思路来面向过程编程。把主类尽量简化,并分离出:输入、管理、解析执行几个模块,是我学到的第一份面向对象思想。
树状的数据结构
对于我一个初学者来说,学到的一个有用的技巧是,合理的设置对象管理类来进行管理,这样可以减少繁多的各种容器以及对容器的复杂管理,可以使得对象管理更加直观。
方法的细分
如果一个方法的内容可以分为几个明显的部分,或者某一部分可以复用某一个方法,那么更直观的是把他们细分为多个方法,不仅仅是为了通过代码风格设计,更是方便以后添加新功能,或者给旧功能添加新分支时,更方便迭代。
继承与接口
对于持有面向过程思想的我,使用继承和接口是十分难以理解的,但是经过学习后,我逐渐理解并愿意使用这两个重要的面向对象概念了。
容器选择和从容器中获取
java语言为使用者提供了众多的功能强大的容器,重要收获就是理解了各种场景需要什么容器。遍历容器获取对象也是非常重要的,如果某一个对象同时具有使用id获取和使用name获取的需求,那么如何优雅地设置映射关系就十分关键了。
public
类和没有public
的类
在最后一次迭代作业中,我注意到一些小类,比如冒险游戏中的守卫、宝物、宝物工厂这些小类都只在冒险游戏这一个类中被使用,于是没有必要全部分开不同的类文件,在同一文件下即可。
对于java
语言的基本性质介绍不够清楚。第一节课主要介绍了面向对象思想的基本思路,但刚开始完全不会java时很不解。建议第一节课可以着重讲讲java为了实现面向对象性质,和C语言有什么区别。
课程工具链:git、Junit、checkstyle
的自学过程比较痛苦,希望课程组可以统合一些好用的博客附在教程里,节省自己上网找资源的困苦。