软件构造lab2

3.1 Poetic Walks
根据规约设计测试用例,然后根据测试用例编写方法并进行测试,测试文件要覆盖全部的情况与分支,分别用可变类与不可变类建立图,从而充分理解mutable和immutable的区别。继续用泛型来表示标签,并进行测试。测试其他类型的标签,如Integer和Character。
利用图结构进行Poetic walks的任务。这个任务就是在句子中根据词库添加单词。
3.1.1 Get the code and prepare Git repository
从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
获取代码
git clone xxx
3.1.2 Problem 1: Test Graph
在抽象方法GraphInstanceTest中,编写测试方法,每个测试方法都尽量满足全部的要求,具体的要求可以参照Graph.java中客户端(client)的要求。
由于这是个抽象类,不是具体的测试文件,所以暂时不能实现,测试结果在后续的内容中进行介绍。
3.1.3 Problem 2: Implement Graph
3.1.3.1 Implement ConcreteEdgesGraph
这个问题是根据边类建立图,边类的成员需要包含source、target、weight;分别代表边的起点,目标点,权值。Edge必须为不可变:
private final String source;
private final String target;
private final int weight;
3.1.3.2 Implement ConcreteVerticesGraph
用List vertices = new ArrayList<>();存储图,Vertex类中有成员变量:
String nameString;
Map<String, Integer> edgeMap;
其中,nameString为该点的名称,edgeMap记录该点的所有指向的点与相应的权值。由于这个类是可变的,所以不需要防御性拷贝。
3.1.4 Problem 3: Implement generic Graph<>
3.1.4.1 Make the implementations generic
本实验的目的就是将problem2所写的图扩展到L上,使用泛型。
具体改法举例:
public class ConcreteEdgesGraph implements Graph
private final Set vertices = new HashSet<>();
class Edge{……}
private final L source;
private final L target;
private final int weight;
3.1.4.2 Implement Graph.empty()
我选取方法ConcreteEdgesGraph()
3.1.5 Problem 4: Poetic walks
由于GraphPoet是抛出异常的方法,所以需要在try……catch中进行调用
根据mit网站上的corpus进行测试
Corpus:To explore strange new worlds
To seek out new life and new civilizations
Input:Seek to explore new and exciting synergies!
Output:Seek to explore strange new life and exciting synergies!
图中出现了环状结构。
对于边的权值不为1的测试
Corpus: You are my best friend.
My dear dear friend
Input:my friend
Output:my dear friend
由于dear出现两次,所以dear到friend的边的权值为2,大于best的1,所以在处理时选取最大的桥。
3.1.5.2 Implement GraphPoet
(一)文件读入
用到InputStreamReader、BufferedReader、方法readLine()进行文件的读取,将文件中的句子逐行读入。
(二)生成图
1.用split进行分割得到单词的数组;
2.遍历单词数组,从第一个开始,如果在图中vertices不包含该点,计入一个点。
3.从第二个开始,与前一个单词做比较,如果相同,那么就需要将权值加1,以便于后续的建立;直至出现不同,加入这个不同的点,并建立边;
二、public String poem(String input)
(一)将输入进行分割
(二)分情况
1.当图中不含有该单词,则直接将该单词放入输入;
2.含有该单词,利用方法targets找到是否存在bridge(在这个过程中将不同的bridge权值进行比较);
3.1.5.3 Graph poetry slam
更新main.java,在同目录下增加cool.txt:
3.2 Re-implement the Social Network in Lab1
这个实验是在实验1中Social Network的基础上进行改动,也就是利用图进行关系的建立与处理,并且能够通过测试。
3.3 Playing Chess
在这里插入图片描述
扩展围棋的自动提子功能
感受:
(1)面向ADT的编程,类是它的主要特点,程序执行过程中,先由主函数进入,定义一些类,根据需要,执行类的成员函数,过程的概念被淡化了。各种方法知识类的一个属性。
而直接面向应用场景编程,是以函数为核心的编程,通过主函数来调用一个个子函数。
我认为这两者有很大的区别,首先编写方法过程是不同的,前一种易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护,但是性能较另一种较低。
(2)通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),因为您可以重用数据处理算法,而无须复制类型特定的代码(可重用)。
(3)在规约之后就编写测试用例,可以让根据规约确定全部的情况,从而使测试用例,尽可能的全面,这样的测试方法,可以确保程序能够满足客户的需求,而不是在编写主程序后再写测试用例,出现测试不足的情况。这是对pre-condition的限定。对于这种方法,我正在逐渐适应。
(4)这样会减少大量编写重复代码的时间,也是代码更加简单、易于理解,这也考验代码的可扩展性与复用性。
(5)不是很适应这种方式,在各类中也存在一些混淆,模块化不够明显,使得可扩展性不高,同时浪费了一些时间编写相同代码。
(6)使得编写者在编写程序的过程中时刻注意到要求,不会犯一些愚蠢的错误,并且在这个过程中利用Repcheck进行检查,防止在后期出现隐秘的错误。愿意在以后的编程过程中保留这种习惯。
(7)本次实验的工作量很大,难度也有点难,好在能在deadline之前完成,但有很多编写不完善的地方。
(8)这是一门需要大量实践的课程,课上将的东西往往没有具体的印象,但在实践中往往是深刻的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值