实验三总结

答主感想:首先我要说一点,实验三真的令人难受,即使是不考虑后来要做的实验四实验五,也令人难受
1实验目标概述
本次实验覆盖课程第 3、5、6 章的内容,目标是编写具有可复用性和可维护 性的软件,主要使用以下软件构造技术: ⚫ 子类型、泛型、多态、重写、重载 ⚫ 继承、代理、组合 ⚫ 常见的 OO 设计模式 ⚫ 语法驱动的编程、正则表达式 ⚫ 基于状态的编程 ⚫ API 设计、API 复用 本次实验给定了五个具体应用(径赛方案编排、太阳系行星模拟、原子结构 可视化、个人移动 App 生态系统、个人社交系统),学生不是直接针对五个应用 分别编程实现,而是通过 ADT 和泛型等抽象技术,开发一套可复用的 ADT 及其 实现,充分考虑这些应用之间的相似性和差异性,使 ADT 有更大程度的复用(可 复用性)和更容易面向各种变化(可维护性)。

3.1待开发的三个应用场景
首先请列出你要完成的具体应用场景(至少3个,1和2中选一,3必选,4和5中选一,鼓励完成更多的应用场景)。
行星运动模拟(StellarSystem)
原子结构模型(AtomStructure)
社交网络的好友分布(SocialNetworkCircle):
分析你所选定的多个应用场景的异同,理解需求:它们在哪些方面有共性、哪些方面有差异。
所有的系统都有中心点,轨道以及轨道上的点组成。
其中原子轨道系统中,电子没有差异,而社交场景中,人物之间有关联。
3.2基于语法的图数据输入
使用正则表达式,利用是否匹配来进行数据的输入。
3.3面向复用的设计:CircularOrbit<L,E>
使用泛型<L,E>来完成,完成一个接口
public interface CircularOrbit<L,E> {

public E getcen();
public HashSet<Track> gettracks();
public boolean putcen(E cen);
public boolean removetrack(Track tr);
public boolean puttrack(Track tr);
public boolean putpoint(Track tr,L point,double cite);
public boolean putrel(L one,L two,double cohesion);
public HashMap<L, Position> getwhere();
public HashMap<L, HashMap<L,Double>> getrel();
public boolean reading(String corpus) ;
public boolean removeL(L point);
public boolean putrelofcen(E one,L two,double cohesion);
public HashMap<E, HashMap<L,Double>> gettheRelationofE();
public HashMap<Track, HashSet<L>> getthepo();

}
其中定义了所有可以公用的函数
3.4面向复用的设计:Track
只定义了轨道的半径,以及轨道的名字,具体轨道上的点,在主题函数中进行实现。
Track只含有少量的数据,具体的点与轨道的关系我们在具体的类之中进行区分
具体的功能复用由CircularOrbit<L,E>实现
3.5面向复用的设计:L
表示了所有的轨道上的点,可以是任意的object类型
3.6面向复用的设计:PhysicalObject
这仅仅是一个接口
public interface PhysicalObject {
public String getname();
@Override
public String toString();
}
3.7可复用API设计
package APIs;

public class CircularOrbitAPIs {
//public Track track=new Track();
public static <L,E> double getPhysicalDistance (CircularOrbit<L,E> c, L e1, L e2)
public static <L,E> double getObjectDistributionEntropy(CircularOrbit<L,E> c) {
public static <L,E> int getLogicalDistance (CircularOrbit<L,E> c, L e1, L e2)
public static <L,E> Difference getDifference (CircularOrbit<L,E> c1, CircularOrbit<L,E> c2)
}
定义了四个静态函数分别为
getPhysicalDistance获得物理距离。
getObjectDistributionEntropy获得信息熵
getLogicalDistance获得逻辑距离
getDifference找不同
可以对任意的CircularOrbit<L,E>实现
3.8图的可视化:第三方API的复用
这一部分我并没有使用推荐的图形库,而是使用了原生的swing库,这个库简单高效,兼容平台而且线程安全,非常适合我这种新手使用。
为了实现图形化的功能,我实现了一个drawOval类用来画图。按照swing规定的格式,其内部必须实现一个静态类继承Jpanel接口,在这个静态类中使用各种draw函数进行绘图,然后在drawOval类中我还实现了一个函数drawit将draw传入其中来显示窗口。
在CircularOrbit<L,E>的各个实现类中,read函数会新建一个drawOval对象,并传入一个Map<轨道半径,轨道中节点的数量>,drawOval接收这个Map来绘制轨道

3.9设计模式应用
3.10应用设计与开发
利用上述设计和实现的ADT,实现手册里要求的各项功能。
以下各小节,只需保留和完成你所选定的应用即可。
3.10.1TrackGame
3.10.2StellarSystem
建立一个circularOrbit对象并初始化为StellarSystem对象,使用scanner类的next函数读入用户指令,根据指令的不同调用StellarSystem对象的不同函数进行物体、轨道的增减,计算位置、距离、可视化等一系列操作。

3.10.3AtomStructure
建立一个circularOrbit对象并初始化为AtomStructure对象,使用scanner类的next函数读入用户指令,根据指令的不同调用AtomStructure对象的不同函数进行物体、轨道的增减,跃迁、恢复、可视化等一系列操作。

3.10.4PersonalAppEcosystem
3.10.5SocialNetworkCircle
建立一个circularOrbit对象并初始化为SocialNetworkCircle对象,使用scanner类的next函数读入用户指令,根据指令的不同调用SocialNetworkCircle对象的不同函数进行物体、轨道、关系的增减,逻辑距离的计算、可视化等一系列操作。

3.11应对应用面临的新变化
以下各小节,只需保留和完成你所选定的应用即可。
3.11.1TrackGame
3.11.2StellarSystem
将planet的参数TrackRadius改为两个参数semiaxisL和semiaxisS,分别表示椭圆轨道的长短半轴,对StellarSystem中计算位置和两点距离的公式进行了改变,重写了正则表达式以从文件中读取semiaxisL和semiaxisS,使用两个参数的draw(L,S)函数替换了原来的draw(R)函数来进行椭圆的绘图。

3.11.3AtomStructure
在nucleus中添加了两个变量分别表示质子和中子的数量,并提供了它们的getter,重写了 AtomStructure的read函数的正则表达式以从文件中读取centralObject的质子数、中子数两个参数。

3.11.4PersonalAppEcosystem
3.11.5SocialNetworkCircle
在原来的设计中,关系使用一个Map<friend,List>进行存储,添加关系(a,b)时会自动的添加a->b和b->a两条边,而现在删除了b->a这个关系的添加,而且按照原来的算法,对于两种情况,fix函数都会自动的删除不可达的点
3.12Git仓库结构
请在完成全部实验要求之后,利用Git log指令或Git图形化客户端或GitHub上项目仓库的Insight页面,给出你的仓库到目前为止的Object Graph,尤其是区分清楚312change分支和master分支所指向的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值