2021年春季学期
计算学部《软件构造》课程

Lab 2实验报告

姓名 王雨宁
学号 1190201118
班号 1903006
电子邮件 1756840811@qq.com

手机号码 15953147100

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 2
3.1 Poetic Walks 2
3.1.1 Get the code and prepare Git repository 2
3.1.2 Problem 1: Test Graph 2
3.1.3 Problem 2: Implement Graph 2
3.1.3.1 Implement ConcreteEdgesGraph 2
3.1.3.2 Implement ConcreteVerticesGraph 5
3.1.4 Problem 3: Implement generic Graph 6
3.1.4.1 Make the implementations generic 6
3.1.4.2 Implement Graph.empty() 6
3.1.5 Problem 4: Poetic walks 7
3.1.5.1 Test GraphPoet 7
3.1.5.2 Implement GraphPoet 7
3.1.5.3 Graph poetry slam 8
3.1.6 使用Eclemma检查测试的代码覆盖度 9
3.1.7 Before you’re done 9
3.2 Re-implement the Social Network in Lab1 10
3.2.1 FriendshipGraph类 10
3.2.2 Person类 11
3.2.3 客户端main() 12
3.2.4 测试用例 12
3.2.5 提交至Git仓库 13
4 实验进度记录 13
5 实验过程中遇到的困难与解决途径 14
6 实验过程中收获的经验、教训、感想 14
6.1 实验过程中收获的经验和教训 14
6.2 针对以下方面的感受 14

1 实验目标概述
本次实验训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现ADT。具体来说:
针对给定的应用问题,从问题描述中识别所需的ADT
设计ADT规约(pre-condition、post-condition)并评估规约的质量
根据ADT的规约设计测试用例;
ADT的泛型化;
根据规约设计ADT的多种不同的实现针对每种实现,设计其表示(representation)、表示不变性(rep invariant)、抽象过程(abstraction function)
使用OOP实现ADT,并判定表示不变性是否违反、各实现是否存在表示泄露(rep exposure)
测试ADT的实现并评估测试的覆盖度;
使用ADT及其实现,为应用问题开发程序;
在测试代码中,能够写出testing strategy并据此设计测试用例。
2 实验环境配置
创建实验仓库后,在本地使用git clone将仓库下载到本地,然后在本地,使用
git branch master
git checkout master
切换到master分支

在这里给出你的GitHub Lab2仓库的URL地址(Lab2-学号)。
https://github.com/ComputerScienceHIT/HIT-Lab2-1190201118
3 实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1 Poetic Walks
在这里简要概述你对该任务的理解。
练习编写泛型类,联系编写ADT,注意其中的抽象函数,表示不变性,表示泄露。练习写规约。
3.1.1 Get the code and prepare Git repository
如何从GitHub获取该任务的代码、在本地创建git仓库、使用git管理本地开发。
访问指导书上的链接,Download Zip。
在GitHub创建实验仓库后,在本地使用git clone将仓库下载到本地,然后在本地,使用
git branch master
git checkout master
切换到master分支
3.1.2 Problem 1: Test Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
直接测试即可
3.1.3 Problem 2: Implement Graph
以下各部分,请按照MIT页面上相应部分的要求,逐项列出你的设计和实现思路/过程/结果。
3.1.3.1 Implement ConcreteEdgesGraph
对于Edge类
关于field,一个edge应有起点,终点,权重

抽象函数:一个Edge对象表示一条从source到target的权重weight的边
表示不变性:一条边的起点和终点不同,weight>0
表示泄露安全性:所有field都是私有的,且String和int是immutable的

由于field是私有的,需要观察函数来获得,对于immutable的field,直接返回即可。但是需要修改权重时,不能直接更改weight,所以采用创建一条新的边的方法,使用时需要用返回的新边来替换旧边。
(截图已修改为泛型类)
immutable类需要重写equals和hashCode函数,认为如果起点终点权重相等的边等价,hashCode采用起点终点权重的hashCode乘质数相加的方法。
(截图已修改为泛型类)
对于ConcreteEdgesGraph类,

由于vertices是可变的,直接返回不安全,所以vertices()函数返回vertices的一个deepcopy
注意每个边的两端必须在图中

在改变一条边的权重时,先在List中找到已存在的边的下标,然后用Edge对象的setWeight函数返回新的更改权重的边,替换之前的边。

测试时,重写抽象方法,生成ConcreteEdgeGraph对象,并调用方法构建graph,再调用观察方法与期望结果比较。注意查看代码覆盖,调整测试方法,来使测试更完善。
a green bar from JUnit and excellent code coverage from EclEmma.idea

3.1.3.2 Implement ConcreteVerticesGraph
对于Vertex类
field存储点的名字,出边和入边的另一端及权重
(截图已修改为泛型类)

由于outTargets和inSources是mutable的,所以观察时需要返回deepcopy防止被修改,这样它们只能被本类的方法修改。

在Vertex类中,设计
public void setInEdge(L source, int weight)
public void setOutEdge(L target, int weight)
public void removeSource(L v)
public void removeTarget(L v)
函数来修改点的入边和出边。
对于ConcreteVerticesGraph类

没有方法直接返回vertices,所以它是安全的。
注意每个边的两端必须在图中
每次修改边时,注意要同时修改两个点的属性。删除一个点时,要把其它所有点与其相连的边删除。
测试时,重写抽象方法,生成ConcreteEdgeGraph对象,并调用方法构建graph,再调用观察方法与期望结果比较。注意查看代码覆盖,调整测试方法,来使测试更完善。

a green bar from JUnit and excellent code coverage from EclEmma.idea

3.1.4 Problem 3: Implement generic Graph
3.1.4.1 Make the implementations generic
如实验指导,所有改为,以及所有创建修改为泛型类的类(Edge和Vertex)的对象时,加上
3.1.4.2 Implement Graph.empty()

测试使用不同的类型

a green bar from JUnit and excellent code coverage from EclEmma.idea

3.1.5 Problem 4: Poetic walks
3.1.5.1 Test GraphPoet
测试时,生成GraphPoet对象,并使用一个文件存储corpus,来构建graph,测试toString与期望比较;再输入一个句子,生成输出与期望比较。注意查看代码覆盖,调整测试方法,来使测试更完善。

3.1.5.2 Implement GraphPoet
对于GraphPoet类,里面存储一张图,顶点为词语,边权重为Corpus中每个相邻词出现的次数。

注意每个词必然有至少一条边。
graph是mutable的,只能被构造器修改,即使用corpus构造时graph就固定了。

构造时,读入一行,拆分成词列表,依次遍历相邻的词,首先使用set函数删除边,返回值得到两词之前的权重,再用之前的权重加1重新设置该边。

应用时,先将输入拆分成词列表,依次遍历相邻的词,对每一对词,遍历graph的vertices,使用sources()和targets()查看两词是否分别在一个点的sources和targets中,如果成立,则得到一个桥,计算桥的权重,最终选择权重最大的桥,先记录坐标。

遍历完整个句子后,按坐标将原来的词和桥连起来得到输出

3.1.5.3 Graph poetry slam

3.1.6 使用Eclemma检查测试的代码覆盖度
a green bar from JUnit and excellent code coverage from EclEmma.

3.1.7 Before you’re done
请按照http://web.mit.edu/6.031/www/sp17/psets/ps2/#before_youre_done的说明,检查你的程序。
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
git add *
git commit -m “ ”
git push
在这里给出你的项目的目录结构树状示意图。

3.2 Re-implement the Social Network in Lab1
在这里简要概述你对该任务的理解。
由于要尽可能复用在3.1中的代码,所以考虑继承ConcreteEdgeGraph或ConcreteVerticesGraph,泛型类型替换为Person
3.2.1 FriendshipGraph类
给出你的设计和实现思路/过程/结果。
继承ConcreteVerticesGraph,由于父类私有属性只能由父类public方法修改,所以表示泄露安全。

representation invariant与父类相同。子类没有定义新的属性所以构造时只需调用父类构造函数。

addVertex调用父类add方法。利用返回值判断是否已存在,如果已存在输出提示信息。

addEdge方法调用父类的set方法,边权重永远为1。由于父类的set会将不存在的点添加到图中,而addEdge不希望这样,所以需要判断,如果不存在输出提示信息,不添加新点和边。

getDistance不需要修改原图,只需要调用父类的观察方法,得到点集,即需要的点的边集。使用广度优先搜索。如果参数不存在于图中,输出提示信息。

重写toString方法,调用父类的toString方法即可

3.2.2 Person类
给出你的设计和实现思路/过程/结果。
Person类只有一个属性name,表示人名

构造时就设置name,之后不能再修改

由于Person是immutable的,所以要重写equals和hashCode方法,根据要求,如果两个对象name相同,就判断为同一人;hashCode返回name的hashCode即可

另外,还要重写toString()方法

3.2.3 客户端main()
给出你的设计和实现思路/过程/结果。
根据要求,不变动Lab1的3.3节给出的客户端代码(例如main()中的代码)

3.2.4 测试用例
给出你的设计和实现思路/过程/结果。
测试时,生成FriendshipGraph对象,并调用方法构建graph,再调用观察方法与期望结果比较。注意查看代码覆盖,调整测试方法,来使测试更完善。
a green bar from JUnit and excellent code coverage from EclEmma.

(FriendshipGraph里有main()函数)

3.2.5 提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab3仓库。
git add *
git commit -m “ ”
git push

在这里给出你的项目的目录结构树状示意图。

4 实验进度记录
请使用表格方式记录你的进度情况,以超过半小时的连续编程时间为一行。
每次结束编程时,请向该表格中增加一行。不要事后胡乱填写。
不要嫌烦,该表格可帮助你汇总你在每个任务上付出的时间和精力,发现自己不擅长的任务,后续有意识的弥补。
日期 时间段 计划任务 实际完成情况
2021.6.1 16:00-19:00 3.1.3.1 Implement ConcreteEdgesGraph 按计划完成
2021.6.1 20:00-22:00 3.1.3.2 Implement ConcreteVerticesGraph 超时完成
2021.6.2 16:00-17:00 3.1.4 Problem 3 按时完成
2021.6.2 19:00-21:00 3.1.4 Problem 4 按时完成
2021.6.6 14:00-14:30 3.2.2 Person类 按时完成
2021.6.6 14:00-16:00 3.2.1 FriendshipGraph类
3.2.3客户端main() 按时完成
2021.6.6 18:00-20:00 3.2.4测试用例 按时完成
2021.6.7 15:00-17:00 修改测试用例 超时完成
5 实验过程中遇到的困难与解决途径
遇到的难点 解决途径
测试用例的编写 查看代码覆盖,对应修改
定义不明
有些定义后来才讲 百度,看ppt
Set在遍历过程中,不能被修改 百度,
遍历后再修改
6 实验过程中收获的经验、教训、感想
6.1 实验过程中收获的经验和教训
注意Set在遍历过程中,不能被修改
6.2 针对以下方面的感受
(1) 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?
直接面向应用场景编程,在别的任务不能复用。面向ADT编程,编程后需要根据任务修改。
(2) 使用泛型和不使用泛型的编程,对你来说有何差异?
使用泛型时,需要考虑泛型类型的特征,例如immutable
(3) 在给出ADT的规约后就开始编写测试用例,优势是什么?你是否能够适应这种测试方式?
测试用例更具普遍性,不会被代码限制住思路
不是很适应
(4) P1设计的ADT在多个应用场景下使用,这种复用带来什么好处?
在别的场景下,不需要考虑ADT的内部实现,只需调用方法
(5) P3要求你从0开始设计ADT并使用它们完成一个具体应用,你是否已适应从具体应用场景到ADT的“抽象映射”?相比起P1给出了ADT非常明确的rep和方法、ADT之间的逻辑关系,P3要求你自主设计这些内容,你的感受如何?
(6) 为ADT撰写specification, invariants, RI, AF,时刻注意ADT是否有rep exposure,这些工作的意义是什么?你是否愿意在以后编程中坚持这么做?
保护ADT的安全性,防止被意想不到的修改,引起意想不到的错误。愿意
(7) 关于本实验的工作量、难度、deadline。
适中
(8) 《软件构造》课程进展到目前,你对该课程有何体会和建议?
希望增加课时

软件构造 Lab2 实验报告相关推荐

  1. 软件构造lab2 - 实验报告

    软件构造lab2 - 实验报告 1.实验目标概述 2.环境配置 3.实验过程 3.1Poetic Walks 3.1.1Get the code and prepare Git repository ...

  2. 哈工大2020软件构造Lab2实验报告

    本项目于3.17日实验课验收,请放心参考 参考时文中有给出一些建议,请查看 基本更新完成 2020春计算机学院<软件构造>课程Lab2实验报告 Software Construction ...

  3. HIT 软件构造 lab2实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 2实验报告 学号 1180300223 班号 1803002 目录 1 实验目标概述 1 2 实验环境配置 1 3 实验过程 1 3 ...

  4. 哈工大软件构造lab2实验报告

    1 实验目标概述 2 实验环境配置 3 实验过程 3.1 Poetic Walks 3.1.1 Get the code and prepare Git repository 3.1.2 Proble ...

  5. HIT 软件构造 lab3实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 3实验报告 姓名 赵旭东 学号 1180300223 班号 1803002 电子邮件 1264887178@qq.com 手机号码 ...

  6. 哈工大软件构造Lab1实验报告

    2020年春季学期 计算机学院<软件构造>课程 Lab 1实验报告 目录 1 实验目标概述... 1 2 实验环境配置... 1 3 实验过程... 1 3.1 Magic Squares ...

  7. [HITSC]哈工大2020春软件构造Lab3实验报告

    Github地址 1 实验目标概述 本次实验覆盖课程第 3.4.5 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术: 子类型.泛型.多态.重写.重载 继承.代理.组合 常 ...

  8. 软件构造Lab2实验总结

    目录 一.关于split 1.split方法简介 2.带数的split方法 3.避免划分后数组开头出现空串的一个思路 二.正则表达式判断字词 1.unicode类别 2.构造正则表达式 三.关于复用 ...

  9. 关于hit软件构造lab2实验后回顾

    1 实验目标概述 本次实验训练抽象数据类型(ADT)的设计.规约.测试,并使用面向对象编程(OOP)技术实现ADT.具体来说:  针对给定的应用问题,从问题描述中识别所需的ADT:  设计ADT规 ...

最新文章

  1. asp实现301跳转的方法
  2. .NET Core开发实战(定义API的最佳实践)Source Generators版
  3. 查看目标主机安装的杀毒软件
  4. hdu 6183 线段树的空间优化
  5. 计算机网络课设题目java_java课程设计参考题目
  6. 夜间工作致癌的原因被发现:熬夜破坏了癌症相关基因的节律,导致DNA损伤增加、修复效率降低...
  7. [转][读书笔记]深入理解java虚拟机
  8. 隐马尔科夫模型(Hidden Markov Models) 系列之三
  9. 二十个让你泪流满面的瞬间
  10. java工作中mq应用多吗_RabbitMQ消息中间件在工作中的应用场景
  11. https://gogs.io/
  12. 一次磁盘满的系统故障
  13. chattr与lsattr命令
  14. python爬取邮件内容_利用Python爬取获取博客园文章定时发送到邮箱
  15. CMOS中的 latch-up 闩锁效应、添加tap解决latch-up、使用combained area绘制TAP TAP的作用 IC后端版图【VLSI】
  16. 密码学笔记——培根密码
  17. word文档下面有红色波浪线如何解决
  18. html字体制作,用@font-face实现网页特殊字符(制作自定义字体)
  19. HTTP协议格式(请求格式、响应格式)
  20. 【全文检索】sqlite-fts4和pgsql的全文检索对比

热门文章

  1. ListView滑动删除 ,仿腾讯QQ
  2. Educoder-java字符串之StringToKenizer类分割字符串之计算手机话费总额
  3. Linux常用硬盘管理命令详解!
  4. java中JSB_深入解析Cocos Creator JSB绑定原理以及应用实践
  5. 基于R语言的DICE(Dynamic Integrated Model of Climate and Economy)模型
  6. 盘点那些功能强大的黑科技软件:竟然可以如此简单?
  7. 公众号推文如何添加文件下载功能_公众号附件添加教程
  8. Unity学习笔记(四)—— 制作第三个小游戏(像模像样的)
  9. ege管理系统_医院挂号管理系统-智能新型医院挂号管理系统下载v95.44官方PC版-CE安全网...
  10. 【哈佛积极心理学笔记】第12讲 写日记