HIT软件构造复习 lab篇

这里集中以下lab中犯的错误

lab1

印象中这个实验是最简单的,主要是熟悉java编程和junit

幻方那个,写的挺恶心的,因为可能出现空格 tab 浮点数等一系列问题,所以需要对每种情况做处理…………记得助教验收的时候还改了我的测试数据,幸亏是能跑起来,处理的不错

之后是那个小乌龟,因为之前大一暑假小学期选过java课所以对这个还算比较熟悉,写起来还行

然后是写一个图上的最短路,因为我本身就是搞算法竞赛的,所以这玩意写的很熟,但是还是被java坑了,因为忘记了equals要自己重写不然自动调用 == …………然后这里就写的比较坑,但还是写出来了

最后是写一个tweet的统计,数据每天都会更新,所以时不时跑一跑会有有趣的结果。这个写的东西如果搞得很强大还是有点厉害的,我写的就是单纯的转发 at 还有内容重复的时候会认为两个人有较为紧密的关系,虽然限制比较弱但是还是能看出来一些社交网络。尤其是一些大流量账号,粉丝数是前列的。

总的说lab1还是没啥东西

lab2

此时开始要求规范,比如对每个类写ADT RI之类的,并且要写test
这里首先要写一个图类,用泛型,泛型之后我会另写博客这里就不讲了。然后用实现的图类写一个写诗的东西,这其实也是在用java的基本操作,还有一些库里提供的类(Map,Set之类的)

之后要写一个模拟下象棋和下围棋,此时事情就复杂了。
首先有一个客户端,接受用户的输入,负责解析命令和执行操作,这个就不说了。
之后设计了一堆类来实现功能,实验报告里写的很详细。

其实这里最让我费解的是Action类,我之前理解的一个类是要有对象的,而对于一系列看似没有对象(也就是抽象)的类,只认为它是放在那里用来继承的(就是提供接口,比如interface和abstract class),然后发现也可以用一个类来封装一些函数,而它的对象没有意义(这个东西之前写c++的时候是直接写在main外面的,大概是对于java这种以类为单元的编程语言不太习惯吧)
理解了这个类,对之后的lab设计也有很大帮助。

其他的设计就没啥讲的意思了

lab3

到了重头戏,3~5都要基于这个东西写。曾经想一口气写完lab5,后来因为ACM训练耽误了,一直用lab3差点没写完,肝了好几个通宵…………

这里是要自己设计ADT了,但是指导书上也给了很多提示。

首先有一个抽象类来提供接口,之后实现该类的具体类,和lab2一样
之后对于三个应用,继承并完善其内部功能……完了
其实没这么轻松……问题在于设计。而很多需求会对设计提出较高的要求。
比如说,我要支持在轨道上添加物品,如果轨道是可变的显然可以,但如果采用更安全的不可变该怎么实现?这里我就在实现类里写了个Map来实现,这样只会让轨道系统是可变的,安全性更高。

对于轨道的半径,有时是整数有时是浮点数,怎么办?显然可以搞一个抽象类然后实现两个具体类,但后来我觉得这么写有点小题大做了,因为一个轨道其实只有半径这一个参数,我让他是Number类型不就好了。

对于每个电子,它们都是一样的,这里如果直接放多个电子上去内存占用会比较高,这里就可以用到Flyweight设计模式来降低内存占用(虽然到lab5才用到)

当时为了实现给行星加卫星的操作,使用了decorator设计模式。只修改了三个地方(读入卫星信息,加个实现decorator设计模式的类,GUI的显示)就完成了这个操作,深刻体会到设计模式的重要性

中间还有个小插曲。因为图省事写的HashMap,后来发现要对Track从小到大遍历,这意味着要对Track排序,那么就不能HashMap了。幸亏当初定义的是Map类,所以改动特别少(大概几B的字符吧,又对Track实现了个比较器就没了),这也说明泛型编程有多么方便。

顺便一提,实现关系网用到了代码级复用——lab2写的graph可以直接用

因为实现的比较好,所以大数据也跑得动,就很开心。

lab4

这个实验也比较轻松,我唯一出现问题的地方就是logger的设计。因为不想修改太多的代码,只想添加代码,所以专门写了个logger类用来记录产生的日志信息,并自动输出到文件中。之后只需要在类中加入这个成员,然后在每个操作时直接记录log即可。

lab5

这个做的真的顺风顺水,我发现我的程序内存规模始终是输入规模,并没有太大的浮动,所以更多的是在研究各种工具咋用

lab6

接触了多线程。其实在lab3中的行星GUI也用到了多线程,因为在GUI中让它转起来,显然是要重写那个多线程函数的

其实写lab的时候就发现了,这东西其实是一个CPU的任务分配,每个猴子相当于一个任务……所以猴子之间不知道任何信息就很显然了

这里比较坑的是猴子的状态输出,如果要记录它的状态那么在它内部就要记录很多东西。对于每个梯子,也要记录它上面有多少个猴子。

这里很容易出现线程打架的情况,我就被这个坑了,代码边跑边报错…就好像明明知道自己软件构造要考挂还在刻苦复习的我一样……处理办法是对梯子的访问加锁(每次只有一个猴子访问梯子和梯子上的猴子)就可以了

多线程这个东西真的挺坑的,有机会可以多说说

你可能感兴趣的:(====其它===)