待开发的三个应用场景
首先请列出你要完成的具体应用场景(至少 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>
- 设计新的接口 CircularOrbit<L,E>,其中 L 和 E 分别代表多轨道系统的中 心点物体类 型和轨道物体的类型。
接口功能:
⚫ 创建一个空的 CircularOrbit 对象
⚫ 增加一条轨道、去除一条轨道
⚫ 增加中心点物体
⚫ 向特定轨道上增加一个物体(不考虑物理位置)
⚫ 增加中心点物体和一个轨道物体之间的关系
⚫ 增加两个轨道物体之间的关系
⚫ 从外部文件读取数据构造轨道系统对象
⚫ 画图
- 在 ConcreteCircularOrbit 类中,需实现 CircularOrbit 中的所有方法
- 由上面的 ConcreteCircularOrbit 派生出更具体的、面向应用的类 StellarSystem AtomStructure SocialNetworkCircle 在这些类中都有自己针对自己系统的功能
面向复用的设计:Track
- 定义 ConcreteCircularOrbit<L,E>的 rep 使用的 Track,即轨道
- 考虑:Track 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给应用层的 client 端。我才用了工厂方法对这个类进行包装,如下图
3. 其中,我规定 track 中的方法如下
4. 对三个系统分别构造不同的 track
面向复用的设计:L
- 定义 CircularOrbit<L,E>中的 L,即表征中心点物体的类 CentralObject
- 考虑:CentralObject 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给 应用层的 client 端。我才用了工厂方法对这个类进行包装,如下图
- 我规定中心物体的功能如下图所示
- 再分别针对三个系统设计自己的中心物体的方法
面向复用的设计:PhysicalObject
- 实现 ConcreteCircularOrbit<L,E>中的 E,即代表分布在不同轨道上的物体类 PhysicalObject。
- 考虑:PhysicalObject 作为 ConcreteCircularOrbit 内部使用的类,最好不要暴露 给应用 层的 client 端。我才用了工厂方法对这个类进行包装
- 其中 physical object 的方法有
- 对每个系统的轨道物体设计自己的方法
可复用 API 设计
- 针对 ConcreteCircularOrbit<L,E> 设计 API 并实现 具 体 代 码 , 包含CircularOrbitAPIs.java 中。
- 功能;
⚫ 计算多轨道系统中各轨道上物体分布的熵值。
实现方案:通过阅读连接根据定义写出数学表达式,这个方法书写只需要理解熵的定义, 我们可以简单的理解为,如果所有物体都 分布在同一条轨道上,其熵值最低;如果所有物体均匀的分布在每一条轨道 上,整个系统的熵值最高。这里代码如下:
⚫ 计算任意两个物体之间的最短逻辑距离。
实现方案:。这里的逻辑距离是指:e1 和 e2 之 间通过最少多少条边(relation)即可 连接在一起。两个物体之间若无关系, 则距离无穷大 所以我们按照图的邻接的关系,通过搜索来计算最短距离,代码如下:
⚫ 计算任意两个物体之间的物理距离。
实现方案:物理距离。若物体有具体位置,则可在直角坐标系里计算出它们之间的物理 距离(在 Github 中找的代码,现在和我的代码接口有些不对) ,然后因为这个对于我的 代码来说只是在 StellarSytem 中计算,所以基于我自己的类,写了相同功能的方法 所以,这里我们进行数学计算就可以完成物理距离的计算
⚫ 计算两个多轨道系统之间的差异。
实现方案:首先定义 ADT Difference,然后我在 Difference 实现的计算
图的可视化:第三方 API 的复用
- 天体系统:
2. Atom
- Social