哈工大软件构造实验三

5 篇文章 0 订阅
3 篇文章 0 订阅

目录

 

1 实验目标概述·· 1

2 实验环境配置·· 1

3 实验过程·· 1

3.1 待开发的三个应用场景·· 1

3.2 基于语法的图数据输入·· 1

3.3 面向复用的设计:CircularOrbit<L,E>· 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. 实验目标概述

本次实验覆盖课程第 3、5、6 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术:

子类型、泛型、多态、重写、重载

继承、代理、组合

常见的 OO 设计模式

语法驱动的编程、正则表达式

基于状态的编程

API 设计、API 复用

本次实验给定了五个具体应用(径赛方案编排、太阳系行星模拟、原子结构 可视化、个人移动 App 生态系统、个人社交系统),学生不是直接针对五个应用 分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其 实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可 复用性)和更容易面向各种变化(可维护性)。

 

  1. 实验环境配置

Windos10专业版,eclipse,IDEA,jdk-9.01,Junit5.

 

在这里给出你的GitHub Lab3仓库的URL地址(Lab3-学号)。

git@github.com:ComputerScienceHIT/Lab3-1170300821.git

  1. 实验过程
    1. 待开发的三个应用场景

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

  1. TrackGame
  2. AtomStructure
  3. SocialNetworkCircle

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

    1. 基于语法的图数据输入
    2. 面向复用的设计:CircularOrbit<L,E>

L

中心物体

E

轨道上的物体

 

方法

用途

public void addCentralObject(L object);

添加中心物体(考虑后续功能扩展,放入set中)

public void addTrack(Track t);

添加轨道到set中

public void removeTrack(Track t);

从set中去除轨道

public void addObjectToTrack(E object, Track t);

添加轨道到物体的映射关系

public void addRealationship(E object1, E object2);

添加物体到物体的映射关系

public void readFiles(String filename);

从文件中读取系统基本信息

 

 

ConcreteCircularOrbit<L, E> implements CircularOrbit<L, E> :

L

中心物体

E

轨道上的物体

public Set<Track> trackSet = new HashSet<>();    

轨道的集合

public Set<E> objectSet = new HashSet<>();

轨道上物体的集合

public Set<L> centralObjectSet = new HashSet<>();

中心物体的集合

public Map<Track, Set<E>> relationMap = new HashMap<>();

轨道和物体的对应关系

public Map<E, E> objectRelation = new HashMap<>();

轨道上物体间的关系

 

方法

用途

public void addCentralObject(L object);

添加中心物体(考虑后续功能扩展,放入set中)

public void addTrack(Track t);

添加轨道到set中

public void removeTrack(Track t);

从set中去除轨道

public void addObjectToTrack(E object, Track t);

添加轨道到物体的映射关系

public void addRealationship(E object1, E object2);

添加物体到物体的映射关系

public void readFiles(String filename);

从文件中读取系统基本信息

    1. 面向复用的设计:Track

Track抽象类:

protected int trackRadius;

Track的轨道半径

 

方法

作用

Getter

Getter

public boolean equal(Track track)

半径相等时认定两个track相等

 

 

TrackGame的GameTrack:

protected int trackRadius;

Super

private int Group;

标记轨道所在的分组

(用于后续改进)

 

方法

作用

Getter

Getter

 

 

AtomStructure的AtomStructureTrack:

private int trackNumber;

电子轨道层数

private String atomName;

电子对应原子名

 

方法

作用

Getter

Getter

 

 

SocialNetworkCircle的SocialNetworkCircleTrack:

protected int trackRadius;

Super

 

    1. 面向复用的设计:L

L复用作为中心物体

Orbit类

中心物体类

ConcreteCircularOrbit<L, E>

CentralObject

TrackGame

AtomStructure

AtomCentralObject

SocialNetworkCircle

SocialNetworkCentralObject

 

CentralObject:

protected String name

中心物体名

Getter

Getter

 

AtomCentralObject:

protected String name

原子名(扩展后可作为质子、中子)

 

SocialNetworkCentralObject:

private int age;

中心用户的年龄

private String gender;

性别

Getter

Getter

 

    1. 面向复用的设计:PhysicalObject

Orbi类

轨道物体类

ConcreteCircularOrbit<L, E>

PhysicalObject

TrackGame

Athlete

AtomStructure

Electron

SocialNetworkCircle

Friend

 

PhysicalObject:

protected String objectName = new String();

轨道物体名

protected Position position = null;

轨道物体的位置

Getter

Getter

hashCode

hashCode

 

Athlete

private int number;

号码

private String country = new String();

国籍

private int age;

年龄

private double bestgrade;

本年度最好成绩

Getter

Getter

hashCode

hashCode

equals

判断

 

Electron

private String atomName

对应原子名

Getter

Getter

hashCode

hashCode

 

Friend

private int age;

姓名

private String gender;

年龄

Getter

Getter

    1. 可复用API设计

CircularOrbitAPIs<L, E>:

L

中心物体

E

轨道上的物体

public double getObjectDistributionEntropy(CircularOrbit c)

计算多轨道系统中各轨道上物体分布的熵值

public int getLogicalDistance(CircularOrbit c, E e1, E e2)

计算任意两个物体之间的最短逻辑距离

public double getPhysicalDistance(CircularOrbit c, E e1, E e2)

计算任意两个物体之间的物理距离

public Difference getDifference(CircularOrbit c1, CircularOrbit c2)

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

 

 

 

 

 

 

 

TrackGameAPI extends CircularOrbitAPIs :

public int getLogicalDistance(CircularOrbit c, E e1, E e2)

计算任意两个物体之间的最短逻辑距离

public Difference getDifference(CircularOrbit c1, CircularOrbit c2)

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

public void randomSort(TrackGameOrbit trackC)

随机安排运动员分组

public void S2B_Sort(TrackGameOrbit trackC)

根据成绩分组

public boolean moveInGroup(TrackGameOrbit C1, Athlete a1, Athlete a2)

在组内调整赛道安排

public boolean moveBetweenGroup(TrackGameOrbit C1, Athlete a1, Athlete a2)

不同分组间调整赛道安排

private Set<String> writeDifference(Map<GameTrack, Set<Athlete>> mapC, GameTrack track)

写difference

 

 

 

 

 

 

 

 

 

 

 

public double getObjectDistributionEntropy(CircularOrbit c)

计算多轨道系统中各轨道上物体分布的熵值

public void removeElectronic(AtomStructureOrbit C,int i)

去除某个轨道上的电子

public Difference getDifference(CircularOrbit c1, CircularOrbit c2)

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

public void electronictransition(AtomStructureOrbit C1, int t1, int t2)

一个电子跃迁t1→t2

AtomStructureAPI extends CircularOrbitAPIs

    1. 图的可视化:第三方API的复用
    2. 设计模式应用

CircularOrbit<L,E>

 

 

 

CentralObject

 

 

 

PhysicalObject

 

 

 

Track

 

 

 

Difference

 

 

 

APIs

 

 

 

 

 

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

    1. 应用设计与开发
      1. TrackGame
  1. 初始化和清空
  2. 计算距离
  3. 计算差异
  4. 调整分组
  5. 增删运动员
      1. AtomStructure
  1. 初始化和清空
  2. 计算距离
  3. 计算差异
  4. 调整分组
  5. 增删电子

 

      1. SocialNetworkCircle
  1. 初始化和清空
  2. 计算距离
  3. 计算差异
  4. 调整分组
  5. 增删朋友

 

    1. 应对应用面临的新变化
      1. TrackGame

存储分组情况的数据结构改为Set<Map<GameTrack, Set<Athlete>>> ,每个分组的map中GameTrack指向一个Set<Athlete>,即可实现接力赛四人一个跑道的情况。

      1. AtomStructure

将轨道中心物体存储在Set<AtomCentralObject>中,可以对AtomCentralObject命名为“Proton”“neutron”来区分质子中子。

      1. SocialNetworkCircle

设置Map<SocialNetworkCircleTrack, Set<Friend>>存储社交层次到friend的映射,Map<Friend,Set<Friend>> 存储每个人(包括中央用户)的直接朋友关系。

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值