OO_JAVA_JML系列第三次作业__架构之谈
OO_JAVA_JML系列第三次作业
## ————架构之谈
出发点
操作的可分离性
总的来说,我们的计算最短路,计算最少换乘,都可以视作计算一条路径的权值之和,然后找到权值之和最小的那一条路径,返回对应的权值。
所以我的出发点就是:分离出如下两个操作
- 遍历图结构生成两点间路径
- 根据拿到的路径计算权值之和
通过分离上述两个函数,可以大大降低我的单个方法的复杂度,起码,将其分成了两个层次的功能区分的函数,具体实现可以加入更多的层级,分离处理的逻辑。
操作本身的多样性
我们的权值之和的计算,有4种方式:
- 计算最短路径
- 计算最少换乘
- 计算最小票价
- 计算最小不满意度
所以,我想到了表驱动编程,就是按照switch的逻辑,指派属性对应的操作函数,通过map哈希表的形式实现,这也是我的架构的一个核心所在,通过此种方法降低一些复杂度。
实现手段:表驱动编程
储存
T是继承自Enum类型的类型,就是枚举类型。
Operation是一个接口,功能是对给定路径计算对应的权值之和。
public class GraphStructure<T extends Enum> {
...
private HashMap<T, HashMap<SymPair<Node>, Integer>> shortestLength;
private HashMap<T, Operation> operations;
public void setOperation(T type, Operation operation) {
this.shortestLength.put(type, new HashMap<>());
this.operations.put(type, operation);
}
...
private void addShortestLengthPair(T type, Node from, Node to) {
List<List<Node>> lists = TraverseFunc.depthFirstTraversing(from, to, table);
Map<SymPair<Node>, Integer> map = shortestLength.get(type);
Operation operation = operations.get(type);
TraverseFunc.addShortestLength(from, to, lists, edgeColors, map, operation);
}
}
注册
CalculateMethod是上述的泛型,用于表示操作的属性;每个操作都有对应的实现了Operation接口的类;
通过传递键:枚举类型;值:实现Operation接口的类,来完成注册操作方法的过程。
public class MetroSystem extends MyPathContainer implements RailwaySystem {
private GraphStructure<CalculateMethod> graph;
public MetroSystem() {
super();
this.graph = new GraphStructure<>();
this.graph.setOperation(CalculateMethod.shortestRouteLength,
new CalculateRouteLength());
this.graph.setOperation(CalculateMethod.leastTicketPrice,
new CalculateTicketPrice());
this.graph.setOperation(CalculateMethod.leastTransferLength,
new CalculateTransferLength());
this.graph.setOperation(CalculateMethod.leastUnpleasementCount,
new CalculateUnpleasantCount());
}
...
}
OO_JAVA_JML系列第三次作业__架构之谈的更多相关文章
- Spark源码系列(三)作业运行过程
作业执行 上一章讲了RDD的转换,但是没讲作业的运行,它和Driver Program的关系是啥,和RDD的关系是啥? 官方给的例子里面,一执行collect方法就能出结果,那我们就从collect开 ...
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- 2019OO第三单元作业总结
OO第三单元的作业主题是JML规格化设计,作业以图及图的最短路径相关计算为载体,体现接口的规格化设计. ------------------------------------------------ ...
- OO_JAVA_JML系列作业_单元总结
OO_JAVA_JML系列作业_单元总结 (1)梳理JML语言的理论基础.应用工具链情况 简单梳理 以下三者是jml规格里的核心,对一个方法功能和属性的限制: requires子句:规定方法的前置条件 ...
- 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划
菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 采用Sc ...
- BUAA OO 2019 第三单元作业总结
目录 总 JML规格化设计 理论基础 工具链 规格验证 验证代码 代码静态检查 自动生成测试样例 生成结果 错误分析 作业设计 第九次作业 架构 代码实现 第十次作业 架构 代码实现 第十一次作业 架 ...
- oo第三次作业--jml
1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注 ...
- Fastify 系列教程三 (验证、序列化和生命周期)
Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) 验证 Fast ...
- Webpack系列-第三篇流程杂记
系列文章 Webpack系列-第一篇基础杂记 Webpack系列-第二篇插件机制杂记 Webpack系列-第三篇流程杂记 前言 本文章个人理解, 只是为了理清webpack流程, 没有关注内部过多细节 ...
随机推荐
- FTP协议简介
1. FTP协议概述 FTP协议的英文全称为File Transfer Protocol, 简称为FTP, 它是从一个主机向一个主机传输文件的协议. FTP协议中客户端和服务器进行文件交互的方式如下图 ...
- k8s架构与组件详解
没有那么多花里胡哨,直接进行一个K8s架构与组件的学习. 一.K8s架构 k8s系统在设计是遵循c-s架构的,也就是我们图中apiserver与其余组件的交互.在生产中通常会有多个Master以实现K ...
- Java字符串常量池及字符串判等解析
一.理解"=="的含义 "=="常用于两个对象的判等操作,在Java中,"=="主要有以下两种用法: 1.基础数据类型:比较的是他们的值是否 ...
- C#动态构建表达式树(三)——表达式的组合
C#动态构建表达式树(三)--表达式的组合 前言 在筛选数据的过程中,可能会有这样的情况:有一些查询条件是公共的,但是根据具体的传入参数可能需要再额外增加一个条件.对于这种问题一般有两种方法: a. ...
- 迷宫3---BFS
经过思考蒜头君终于解决了怎么计算一个迷宫的最短路问题,于是蒜头君找到一个新的迷宫图,来验证自己是否真的会计算一个迷宫的最短路. 为了检验自己计算的是否正确,蒜头君特邀你一起来计算. 输入格式 第一行输 ...
- LateX出坑
1 公式是用$ 包围着的 $ 2 \begin{equation} 里面的公式自动编号 \end{equation} 要达成这样的效果,暂时想到如下方法: 1 \begin{equation} ...
- sonar-scanner的使用
在服务器搭建sonarqube后,本地的windows个人电脑如何使用sonar-scanner? 在服务器搭建sonarqube后,每个人都可以在本地使用sonar-scanner扫描代码. son ...
- Java对象构造
关于对象构造的一些认识. 默认域初始化 如果在构造器中没有显示地给域赋予初值,那么就会被自动地赋予默认值:数值为0,布尔值为false,对象引用为null.然而,这显然是不安全的,在一个null引用上 ...
- python FastAPI 初接触
先吹一波: 原来写接口可以这么简单!!! 简单到没朋友 . 中文官网:https://fastapi.tiangolo.com/zh/tutorial/header-params/ 且天然支持异步处理 ...
- 理解classpath
一.什么是classpath classpath,翻译过来就是类路径的意思,它是包含class文件的路径集合,用于指示虚拟机jvm在这些路径下搜索class文件. 类路径可以同时定义多个,多个类路径之 ...