OOPre学习总结
总体架构
实现过程
在整个的实现过程中,经历多番调整修改,形成了最终结构。如下图所示。
其中Main是顶层架构,接受输入后,将所有业务交给Methods类去分类执行,在Methods中调用其余类,完成指令的要求。 Commodity是所有价值体的接口,Employer和Employee是作为接口,要求雇佣者和被雇佣者所要实现的方法。
对于Bottle与Equipment,其作为父类,每个下面继承三个子类。
Store作为单例模式,提供整个的商店功能。
反思总结
-
FightLog可以作为只实例化一次,而后实现所有的功能,也可以将其变为单例模式
-
在Adventurer类以及Store类中,对于Food,Bottle,Equipment的部分方法相似度很高,如对于三者的删除(卖给商店),或许可以将此三者统筹于一个抽象类下,将代码合并简化。
-
在Methods类中,使用Consumer类,将所有的指令打包放入一个ArrayList中,通过下标即可访问对应的方法,省去
switch-case
语句,简化业务类,使其不超过60行。 -
将解析与处理数据分开,使得业务更加清晰。
Juint
合适的测试可以很好的发现代码中的bug
为什么要说合适的测试呢,因为过于简单的测试数据,没有办法测出问题。而过于复杂的测试数据,则会在找到bug修复bug的时候遇到很多困难。所以,要选择合适的测试方式。
-
在测试的过程中要尽可能的覆盖所有情况,也要多调整前后顺序,测试,是否会因为先后的逻辑而出现问题。
-
尝试使用断言来判断是否正确,虽然juint好像对assert的覆盖率会和本地不同
-
不要总是依赖于测评机中所给的数据,尝试自己捏!!!
-
测试的过程是也是个反复迭代的过程,在自己捏完数据测完后,先跑一遍,根据没有覆盖到的方法、分支,进行新一轮数据的捏造。循环往复,以达到测试的目的。
OO学习心得
面向对象
相较于面向过程,面向对象更多是从问题出发,看想要实现问题要求,需要什么样的对象,这个对象有什么性质需要这个对象有什么操作,从而去设计这个对象,以及对象的操作。从某种意义上来说,面向对象的过程相当于是c语言中的struct + function
的结合。具体来说,令我感到最大的不同的是以下两点
关于值的修改
-
c语言中,只要是在这个变量的定义域内,便可以以任意合法的方法去调用、修改这个值。
-
在面向对象的语言中,所有的变量值,都是封装在这个对象中的,是装在一个箱子中的,并不是对外开放,可以任意访问修改的。
操作方法/函数的“所属”
-
在c中,一个函数属于整个文件,整个文件都可以去调用它
-
而在面向对象的语言中,能够调用方法的,只有对象或者是类
迭代过程
在写代码前,一定要对要实现的对象和方法的大体内容与功能有一个整体的了解,并且由此确定合适的架构,如单例、工厂、观察者等模式。
然后再将要实现的功能清楚的划分给不同的类(可以有不同的划分方式,但是逻辑上要合理,应用起来要方便)。比如我在设计的过程中,单独拎出来了一个Methods类,来专门处理输入输出,再调用下面的其他类的方法。
oo建议
问题:对于bug修复的整个流程不太清楚。
或许可以在进行像第一次和第五次那种debug的题目时,可以采取修复bug的形式进行提交,顺便熟悉修复bug的流程。(不过可能对于系统和助教不太友好)