2019年秋季学期软件构造 Lab3

待开发的三个应用场景

首先请列出你要完成的具体应用场景(至少 3 个,1 和 2 中选一,3 必选,4 和 5 中选一,鼓励完成更多的应用场景)。
⚫ Stellar System
⚫ Atom Structure
⚫ Social Network Circ
分析你所选定的多个应用场景的异同,理解需求:它们在哪些方面有共性、 哪些方面有差异。
(1) 共性 1. 都有中心物体 2. 都有轨道 3. 轨道上都有物体 4. 都有中心物体和轨道物体的关系 5. 轨道物体间都有关系 6. 可以添加、删除轨道 7. 可以添加、删除轨道物体
(2) 差异 1. 输入不同 2. 每个系统有自己的独立的动作

基于语法的图数据输入

方法:采用正则表达式,针对每个物体不同的输入来规定不同的正则表达式,这样 就可以将输入文本进行单词的切割,达到建立不同系统的目的
前提条件:我们需要自己对 label 和 number 进行定义,所以我建立了一个 Package 来放定义们
在这里插入图片描述
3. 代码
(1)Stellar
在这里插入图片描述
(2)Planet
在这里插入图片描述
(3) Stellar System
在这里插入图片描述
(4) Centron
在这里插入图片描述
(5) Atom Structure
在这里插入图片描述
(6) Central Username

在这里插入图片描述
(7) Friend
在这里插入图片描述
(8) Social Network Circle
在这里插入图片描述

面向复用的设计:CircularOrbit<L,E>

  1. 设计新的接口 CircularOrbit<L,E>,其中 L 和 E 分别代表多轨道系统的中 心点物体类 型和轨道物体的类型。
    接口功能:
    ⚫ 创建一个空的 CircularOrbit 对象
    ⚫ 增加一条轨道、去除一条轨道
    ⚫ 增加中心点物体
    ⚫ 向特定轨道上增加一个物体(不考虑物理位置)
    ⚫ 增加中心点物体和一个轨道物体之间的关系
    ⚫ 增加两个轨道物体之间的关系
    ⚫ 从外部文件读取数据构造轨道系统对象
    ⚫ 画图
    在这里插入图片描述
  2. 在 ConcreteCircularOrbit 类中,需实现 CircularOrbit 中的所有方法 在这里插入图片描述
  3. 由上面的 ConcreteCircularOrbit 派生出更具体的、面向应用的类 StellarSystem AtomStructure SocialNetworkCircle 在这些类中都有自己针对自己系统的功能

面向复用的设计:Track

  1. 定义 ConcreteCircularOrbit<L,E>的 rep 使用的 Track,即轨道
  2. 考虑:Track 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给应用层的 client 端。我才用了工厂方法对这个类进行包装,如下图

在这里插入图片描述
3. 其中,我规定 track 中的方法如下
在这里插入图片描述
4. 对三个系统分别构造不同的 track

面向复用的设计:L

  1. 定义 CircularOrbit<L,E>中的 L,即表征中心点物体的类 CentralObject
  2. 考虑:CentralObject 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给 应用层的 client 端。我才用了工厂方法对这个类进行包装,如下图
    在这里插入图片描述
  3. 我规定中心物体的功能如下图所示
    在这里插入图片描述
  4. 再分别针对三个系统设计自己的中心物体的方法

面向复用的设计:PhysicalObject

  1. 实现 ConcreteCircularOrbit<L,E>中的 E,即代表分布在不同轨道上的物体类 PhysicalObject。
  2. 考虑:PhysicalObject 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给应用 层的 client 端。我才用了工厂方法对这个类进行包装
  3. 其中 physical object 的方法有
    在这里插入图片描述
  4. 对每个系统的轨道物体设计自己的方法

可复用 API 设计

  1. 针对 ConcreteCircularOrbit<L,E> 设计 API 并实现 具 体 代 码 , 包含CircularOrbitAPIs.java 中。
  2. 功能;
    ⚫ 计算多轨道系统中各轨道上物体分布的熵值。
    实现方案:通过阅读连接根据定义写出数学表达式,这个方法书写只需要理解熵的定义, 我们可以简单的理解为,如果所有物体都 分布在同一条轨道上,其熵值最低;如果所有物体均匀的分布在每一条轨道 上,整个系统的熵值最高。这里代码如下: 在这里插入图片描述
    ⚫ 计算任意两个物体之间的最短逻辑距离。
    实现方案:。这里的逻辑距离是指:e1 和 e2 之 间通过最少多少条边(relation)即可 连接在一起。两个物体之间若无关系, 则距离无穷大 所以我们按照图的邻接的关系,通过搜索来计算最短距离,代码如下:
    在这里插入图片描述

⚫ 计算任意两个物体之间的物理距离。
实现方案:物理距离。若物体有具体位置,则可在直角坐标系里计算出它们之间的物理 距离(在 Github 中找的代码,现在和我的代码接口有些不对) ,然后因为这个对于我的 代码来说只是在 StellarSytem 中计算,所以基于我自己的类,写了相同功能的方法 所以,这里我们进行数学计算就可以完成物理距离的计算
⚫ 计算两个多轨道系统之间的差异。
实现方案:首先定义 ADT Difference,然后我在 Difference 实现的计算

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

  1. 天体系统:

在这里插入图片描述
2. Atom 在这里插入图片描述

  1. Social
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值