270
社区成员
发帖
与我相关
我的任务
分享# 面向对象学习心得
## 作业最终的架构设计, 在迭代中的架构调整及考虑
### 1架构
|-Scr
|---Advenuure
|---Bottle
|---Equipment
|---Item
|---Solver
|---mainClass
|---Lexer
|---Parser
|---Bag
|---Sppell
|---Factory
|---Subordinary
|---Superior
|-Test
|---mainclassTest
最终架构可以分为:1,实体,如Spell,Bottle,Adventurer;2,mainClass以及skover这两个用来输入输出的;3,Paserer,Lexer,这两个感觉像为用来处理特定输入的而创建的类。
### 2调整
我只做了一次大的调整,就是将mainClass中的对输入进行处理输出的全部挪到一个叫solver的类中(就是按照DeBug作业中),这样就能够避开checkstyle中关于main函数行数的限制,同时仿照DeBug作业中的在solver中创建方法来处理输出,这样一可以简化代码,二是方便迭代,每次只用在solver添加相应的方法。
## 使用JUNIT的心得体会
### 1,不用对每一个方法,每一行代码都进行测试
可以使用对自己的顶层代码进行测试,如要测试使用药水(useBottle),可以通过调用更上层的方法use来调用useBottle
### 2,覆盖率可以映射出代码的使用率
显然,在方法、类的覆盖率达到饱和时,从分支、行覆盖率就可以看出来自己代码的使用情况。在运行完JUNIT后打开代码,代码旁边的色块表示代码的命中率,绿色的表示命中高,红色表示没用命中,这时候可以看:1,自己的测试是否涵盖了所有情况,2代码是否冗余


### 3,发现的一个能轻松搞定(逃课)覆盖率的方法
#### 1.捏一个测试数据(只用搬样例也行)
example:
String input6 ="18\n" +
"aa King\n" +
"aa Knight\n" +
"aa Archer\n" +
"aa Rogue\n" +
"aa Mage\n" +
"ls Knight HealWave HealSpell 5 100\n" +
"ls Archer FirstAid HealSpell 3 80\n" +
"ls Mage ManaShield HealSpell 4 90\n" +
"lr King(Knight(Archer),Rogue)\n" +
"ae Mage Staff Sword 250\n" +
"ti Mage Staff\n" +
"fight Mage 1 King\n" +
"use Knight HealWave King\n" +
"rr King Rogue\n" +
"fight Rogue 1 King\n" +
"lr Archer(Rogue)\n" +
"use Archer FirstAid Rogue\n" +
"fight Knight 1 King";
### 2.Then
InputStream in6 = new ByteArrayInputStream(input6.getBytes());
Scanner scanner6 = new Scanner(in6);
Solver solver6 = new Solver(scanner6);
@Test
public void mainTest6(){
solver6.solve();
}
### 3.有啦

P.S.似乎这样确实是有覆盖率了,但没有达到测试的目的,只能用来逃课:(
## 学习OOPre的心得体会(包括但不限于从面向过程编程过渡到面向对象编程的体会)
### 1弱侧真的很弱
比如在第六次作业中我的代码其实是有大问题的,包括但不限于1:所有伤害都是真伤(全部无视防御);2,魔法书造成物理伤害;3,用伤害咒语kill后不给钱;4,法术伤害输出格式错了;但是,弱测居然全过了,最后强侧只过了五个点。看来不能相信弱侧,最好还是自己进行深而广的测试。
### 2最初的架构一定要考虑周到
最初的架构越清爽,迭代的难度就越小,或者觉得自己已经在堆石时就赶紧重构,因为迭代次数越多,重构难度越大,难度越大就越不想重构,最终的代码就会可读性很低,冗余量大
### 3面向过程与面向对象
大一我学的就像是在面向过程的编译,对一个问题的求解倾向于从方法、从求解过程出发,以用最简的过程解决问题为首要目标,这种变成跟想是基础的方法论证,我必须先证明方法存在并且有可行性才能进行解答;而面向对象则截然不同,同一道题,面向对象的方法是先对对象进行行为功能作用之类的分析,然后是利用字节分析的结果来串联出解题过程与答案。简而言之,就是面面相过程是专注于黑盒内的运行情况,通过把黑盒完全解剖来解题,而面向对象则采用了不同的方法,通过解析出黑盒的性质,对黑盒进行抽象化来解题。或者用CO来说,面向过程就是直接连线,线连得精确无误,题才算作对,而面向对象则是我抽象出了ALU这些模块并且解释了模块的功能,然后我并不需要知道模块里是什么样的,只用将各个模块行为描述正确,最后通过调用这些模块来解题。
## 对OOPre课程的简单建议
感觉很不错,每次的学习目的都十分清晰。
(最后迭代的制作能不能实体化QAQ)