没有合适的资源?快使用搜索试试~ 我知道了~
40丨运用学过的设计原则和思想完善之前讲的性能计数器项目(下)1
需积分: 0 0 下载量 13 浏览量
2022-08-03
23:08:44
上传
评论
收藏 1.81MB PDF 举报
温馨提示
试读
18页
40丨运用学过的设计原则和思想完善之前讲的性能计数器项目(下)1
资源详情
资源评论
资源推荐
40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(下)
2020-02-03 王争
设计模式之美
进入课程
讲述:冯永吉
时长 15:17 大小 12.26M
上一节课中,我们针对版本 1 存在的问题(特别是 Aggregator 类、ConsoleReporter 和
EmailReporter 类)进行了重构优化。经过重构之后,代码结构更加清晰、合理、有逻辑
性。不过,在细节方面还是存在一些问题,比如 ConsoleReporter、EmailReporter 类仍
然存在代码重复、可测试性差的问题。今天,我们就在版本 3 中持续重构这部分代码。
除此之外,在版本 3 中,我们还会继续完善框架的功能和非功能需求。比如,让原始数据
的采集和存储异步执行,解决聚合统计在数据量大的情况下会导致内存吃紧问题,以及提高
框架的易用性等,让它成为一个能用且好用的框架。
话不多说,让我们正式开始版本 3 的设计与实现吧!
下载APP
代码重构优化
我们知道,继承能解决代码重复的问题。我们可以将 ConsoleReporter 和 EmailReporter
中的相同代码逻辑,提取到父类 ScheduledReporter 中,以解决代码重复问题。按照这个
思路,重构之后的代码如下所示:
ConsoleReporter 和 EmailReporter 代码重复的问题解决了,那我们再来看一下代码的可
测试性问题。因为 ConsoleReporter 和 EmailReporter 的代码比较相似,且
EmailReporter 的代码更复杂些,所以,关于如何重构来提高其可测试性,我们拿
EmailReporter 来举例说明。将重复代码提取到父类 ScheduledReporter 之后,
EmailReporter 代码如下所示:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class ScheduledReporter {
protected MetricsStorage metricsStorage;
protected Aggregator aggregator;
protected StatViewer viewer;
public ScheduledReporter(MetricsStorage metricsStorage, Aggregator aggregato
this.metricsStorage = metricsStorage;
this.aggregator = aggregator;
this.viewer = viewer;
}
protected void doStatAndReport(long startTimeInMillis, long endTimeInMillis)
long durationInMillis = endTimeInMillis - startTimeInMillis;
Map<String, List<RequestInfo>> requestInfos =
metricsStorage.getRequestInfos(startTimeInMillis, endTimeInMillis)
Map<String, RequestStat> requestStats = aggregator.aggregate(requestInfos,
viewer.output(requestStats, startTimeInMillis, endTimeInMillis);
}
}
复制代码
1
2
3
4
5
6
7
8
9
public class EmailReporter extends ScheduledReporter {
private static final Long DAY_HOURS_IN_SECONDS = 86400L;
private MetricsStorage metricsStorage;
private Aggregator aggregator;
private StatViewer viewer;
public EmailReporter(MetricsStorage metricsStorage, Aggregator aggregator, St
this.metricsStorage = metricsStorage;
前面提到,之所以 EmailReporter 可测试性不好,一方面是因为用到了线程(定时器也相
当于多线程),另一方面是因为涉及时间的计算逻辑。
实际上,在经过上一步的重构之后,EmailReporter 中的 startDailyReport() 函数的核心
逻辑已经被抽离出去了,较复杂的、容易出 bug 的就只剩下计算 firstTime 的那部分代码
了。我们可以将这部分代码继续抽离出来,封装成一个函数,然后,单独针对这个函数写单
元测试。重构之后的代码如下所示:
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
this.aggregator = aggregator;
this.viewer = viewer;
}
public void startDailyReport() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date firstTime = calendar.getTime();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
long durationInMillis = DAY_HOURS_IN_SECONDS * 1000;
long endTimeInMillis = System.currentTimeMillis();
long startTimeInMillis = endTimeInMillis - durationInMillis;
doStatAndReport(startTimeInMillis, endTimeInMillis);
}
}, firstTime, DAY_HOURS_IN_SECONDS * 1000);
}
}
复制代码
1
2
3
4
5
6
7
8
9
10
public class EmailReporter extends ScheduledReporter {
// 省略其他代码...
public void startDailyReport() {
Date firstTime = trimTimeFieldsToZeroOfNextDay();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// 省略其他代码...
}
剩余17页未读,继续阅读
啊看看
- 粉丝: 28
- 资源: 323
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python基于可变卷积改进的U-Net网络实现对胰腺细胞的精准切割源码(高分项目).zip
- python基于可变卷积改进的U-Net网络实现对胰腺细胞的精准切割源码(高分项目).zip
- 基于javascript实现的蚁群算法(JS代码)
- 基于python实现的随机森林(python代码)
- python读取excel到数据库中,简单的数据库管理脚本
- 7777端口抓包数据集
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0