HIT-CS-2019-软件构造-Lab3

2019年春季学期

计算机学院《软件构造》课程

Lab
3实验报告

概述···· 1
2 实验环境配置···· 1
3 实验过程···· 1
3.1 待开发的三个应用场景···· 1
3.2 基于语法的图数据输入···· 1
3.3 面向复用的设计:CircularOrbit· 1
3.4 面向复用的设计:Track· 2
3.5 面向复用的设计:L· 2
3.6 面向复用的设计:PhysicalObject· 2
3.7 可复用API设计···· 2
3.8 图的可视化:第三方API的复用···· 2
3.9 设计模式应用···· 2
3.10 应用设计与开发···· 2
3.10.1 TrackGame· 2
3.10.2 StellarSystem· 2
3.10.3 AtomStructure· 2
3.10.4 PersonalAppEcosystem· 2
3.10.5 SocialNetworkCircle· 2
3.11 应对应用面临的新变化···· 2
3.11.1 TrackGame· 3
3.11.2 StellarSystem· 3
3.11.3 AtomStructure· 3
3.11.4 PersonalAppEcosystem· 3
3.11.5 SocialNetworkCircle· 3
3.12 Git仓库结构···· 3
4 实验进度记录···· 3
5 实验过程中遇到的困难与解决途径···· 3
6 实验过程中收获的经验、教训、感想···· 4
6.1 实验过程中收获的经验和教训···· 4
6.2 针对以下方面的感受···· 4

1 实验目标概述

根据实验手册简要撰写。

2 实验环境配置

简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。

特别是要记录配置过程中遇到的问题和困难,以及如何解决的。

在这里给出你的GitHubLab3仓库的URL地址(Lab3-1170300624)。

3 实验过程

请仔细对照实验手册,针对每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。

3.1 待开发的三个应用场景

首先请列出你要完成的具体应用场景(至少3个,1和2中选一,3必选,4和5中选一,鼓励完成更多的应用场景)。

l Stellar System

l AtomStructure

l SocialNetworkCircle

分析你所选定的多个应用场景的异同,理解需求:它们在哪些方面有共性、哪些方面有差异。

共性:

需要轨道系统中基本存在的对象,包括轨道、中心物体、轨道物体。其中物体都不考虑绝对位置。轨道都为圆形。

   都需要完成的功能有:添加/删除轨道,在某一轨道上添加/删除物体,获得轨道系统的熵值,获得逻辑距离,比较两个同类型轨道系统的差异,检查轨道系统是否合法,可视化。

都只需要从文件中读入一个轨道系统

差异:

   AtomStructure轨道物体都是值相同的对象,需要实现物体跃迁。SocialNetworkCircle中需要实现物体关系及对应操作,需要计算信息扩散度。

3.2 基于语法的图数据输入

StellarSystem

String
stellarPattern=“Stellar\s*::=\s*<([a-zA-Z]+),(\d+),(\d+)>”;

String planetPattern=“Planet\s*::=\s*<([a-zA-Z]+),([a-zA-Z]+),([a-zA-Z]+),(\d+),(\d+),(\d+),(CW|CCW),(\d+)”

AtomStructure

String
elementNamePattern=“ElementName\s*::=\s*([A-Z] {1}[a-z]
{0,1})”;

String
tracksPattern=“NumberOfTracks\s*::=\s*(\d+)”;

String electronPattern=“NumberOfElectron\s*::=\s*((???:\d+\/\d+);)+)”;

3.3 面向复用的设计:CircularOrbit

3.4 面向复用的设计:Track

3.5 面向复用的设计:L

构造CommonObject作为CentralObject和PhysicalObject的父类。其中包括obName与pos分别代表物体名称以及物体位置,Position是Immutable类型。

方法:getter,drawGraphics,hashCode,toString

3.6 面向复用的设计:PhysicalObject

3.7 可复用API设计

计算轨道系统熵值。在ConcreteCircularOrbit中已经具体实现。

获取最短逻辑距离。在ConcreteCircularOrbit中已经具体实现。

获取物理距离:在ConcreteCircularOrbit中已经具体实现。

计算两个多轨道系统之间的差异:

在ConcreteCircularOrbit中我们将两个对应的轨道物体集合添加到Difference对象中。下面声明Difference的类设计。

每一对比较的轨道,各自形成集合且只保留各自轨道上独有的轨道物体(去除交集,这里的比较使用equalsObject进行值比较),通过两个集合构造trackDifference对象,一个轨道系统的Difference由多个trackDifference构成。在trackDifference中提供toString方法将差异转化为字串,需要注意的是,如果两个集合都为空则说明两轨道上物体完全相同,这时候不输出“物体差异”。

3.8 图的可视化:第三方API的复用

3.9 设计模式应用

请分小节介绍每种设计模式在你的ADT和应用设计中的具体应用。

StellSystem

AtomStructure

实现Memento设计模式管理电子跃迁的状态。

设计ElectronTransitMemento类,保存电子轨道跃迁信息,分别保存跃迁电子electron,源轨道fromTrack,目标轨道toTrack。

设计ElectronTransitCareTaker类,负责保存所有的动作列表,回退历史信息(返回删除点之后的所有操作列表)。回退动作先从CareTaker类中获得删除点之后的所有历史信息,然后传入轨道系统中反方向执行操作。

SocialNetworkCircle不需要实现设计模式

3.10 应用设计与开发

利用上述设计和实现的ADT,实现手册里要求的各项功能。

以下各小节,只需保留和完成你所选定的应用即可。

3.10.1 TrackGame

3.10.2 StellarSystem

功能:计算某时刻任意两行星之间的距离。调用CircularOrbitAPIs中实现的getPhysicalDistance方法即可。

3.10.3 AtomStructure

功能:模拟电子跃迁。调用ConcreteCircularOrbit中实现的transit方法即可。

3.10.4 PersonalAppEcosystem

3.10.5 SocialNetworkCircle

功能1:从社交关系日志中恢复结构,首先将所有的输入信息读入,这时候我们得到了中心节点,与中心节点相邻的节点,节点之间的关联信息,在这个图上进行BFS,BFS的起始节点集合是所有与中心点相邻的节点,于是我们就可以获得哪些节点与中心节点不相邻(删去),各自的节点应该处于哪一条轨道上。之后调用Builder构造轨道系统即可。

功能2:计算第一条轨道上的亲密度因素:这里我们定义第一层轨道上的物体为V,其他物体为U,记v->u路径上紧密度的乘积为val(v,u),则v的扩散度为其所有能到达的物体u’的val(v,u’)之和。使用BFS,这里BFS一次的源点为一个第一层轨道上的物体,对每个第一层轨道上的物体都进行一次BFS。



功能3:增加/删除一条社交关系。增加删除关系可以直接调用ConcreteCircularOrbit中实现了的函数,不过考虑到关系改变会引起图的结构的改变(有的节点需要删除,有的节点需要改变所处的轨道),需要调用adjustFriendLocation来调整整个physicalObjectMap,这里采用的(暴力)方法是重复功能1中的BFS过程,重新计算所处轨道,然后删除不能连通的节点。

功能4:计算逻辑距离。调用ConcreteCircularOrbit中的getLogicalDistance即可。

你可能感兴趣的:(软件构造)