目录
(1)方法过于集中在在Adventurer类和Manager类。
一、学习心得
1、代码初期框架
本人代码框架:
在搭建过程中
Main主要用于顶层输入的处理,较为简单
AllDiary用于负责保管所有人的日志
Manager是核心部分,包含冒险者的容器和所有战斗日志的容器,用于管理增加冒险者,读取日志,查找日志以及题目要求的各种处理,同时根据Main中传入的读入通过switch()函数进行不同处理
Case23Buy没有任何意义(规划不当的产物),由于Manager规划不当导致行数超过了500行被迫产生的类,用于实现从商店买入的功能实现
Store类负责处理冒险者购买与出售物品
Commodity类作为价值体的抽象类,负责价值体种类价值功能
剩余类为根据题意创建
2、课后评估:
虽然在大体框架上在历次迭代中没有大的修改但是一直受限于代码风格的困扰(单个方法不能超过60行以及单个类不能超过500行),其中多出的很突兀的Case23Buy类就是由于Manager类中放不下了。通过课下分析,代码有如下问题
(1)方法过于集中在在Adventurer类和Manager类。
如在Adventurer类中,同时定义了如下大量的容器,携带功能等都在其中实现
private int id; private String name; private int hitPoint; private int level; private int maxBottle; private long price; private long money; //看作库 private ArrayList<Bottle> bottles = new ArrayList<Bottle>(); private ArrayList<Equipment> equipments = new ArrayList<Equipment>(); private ArrayList<Food> foods = new ArrayList<Food>(); //看作背包 private TreeSet<Bottle> packBottles = new TreeSet<Bottle>(); private HashSet<Equipment> packEquipments = new HashSet<Equipment>(); private TreeSet<Food> packFoods = new TreeSet<Food>(); private ArrayList<FightDiary> fightDiaries = new ArrayList<FightDiary>(); private HashSet<Adventurer> employees = new HashSet<Adventurer>()
解决方案:增添背包类和仓库类,同时背包和仓库类下面都有Bottle、Equipment、Food三个类,背包类和仓库类且有共同操作,可以增加接口。这样在Adventurer类下创建背包类和仓库类,既将储存和携带功能部分分离,又不会过于臃肿。
(2)Manager类由于风格限制大量使用switch()
public void SwitchFunction1(int type, String[] a, Adventurer adventurer){} public void SwitchFunctionInFight(int type, String[] a,Scanner scanner, ArrayList<Adventurer> adventurers,ArrayList<AllDiary> allDiaries){} public void SwitchFunction2(int type, String[] ari, Adventurer adventurer){}
看了示例代码和相关学习,我意识可以定义了一个Commandlist,其中包含了一系列的函数引用。每个函数引用对应一个操作,用于执行不同的功能 :
List<Runnable> commandList = new ArrayList<>();
commandList.add(this::AddAdventurer);
commandList.add(this::AddBottle);
//运行
commandList.get(0).run(); // 执行索引为0的动作
(3)调整后框架
3、使用Junit的心得体会
1.对于底层方法,不必要都测试,可以测试更高层次的方法(该方法调用了某个底层方法),这样也能达到相关目的。
2.对单例模式进行测试时,测试完记得进行销毁(运用返回一个new + 类的方法)。
3.避免使用交互式测试。
4.Alt + insert可以快速生成测试,没必要写
5.Junit对于一些小错误真的很有帮助,可以在写Junit增加一些奇怪数据,同时检查输出是否会少空格这些不起眼的错误。
4、OO pre课程体会
1.面向对象和面向过程的区别,在学习C语言和数据结构中,我们要进行大量的算法研究,进行的是小规模代码的书写,而在OO pre课上,我们重视的是代码的整体框架,一个好的代码,一定有一个好的框架,从可扩展性,代码风格上,封装做到高内聚低耦合;对培养提高代码风格有很大的作用。
2.Java语言相对C语言的方便之处,Java中提供大量的库函数以及容器进行增删改查的功能,较为便捷。
3.第一次接触到多态,认识到了父类子类以及接口对函数顶层底层联系的重要性
4.通过这次课我也积累了一些小经验,在OO课时,我在迭代时,要尽量避免写一次性代码,增强代码可扩展性,为代码预留好充足扩展空间,同时书写之前,可以提前规划好整体结构,对着结构进行书写代码。
二、课程建议
每次结束是否可以提供一些好的框架设计供反思,因为有时真的不知道怎么评价自己的代码是好是坏。