设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

26 | 实战二(下):如何实现一个支持各种统计规则的性能计数器?

RedisMetricsStorage类
RedisMetricsStorage类
EmailReporter类
ConsoleReporter类
Aggregator类
MetricsStorage接口
MetricsCollector类
EmailReporter类
ConsoleReporter类
Aggregator类
MetricsStorage接口
MetricsCollector类
ConsoleReporter、EmailReporter
Aggregator
MetricsStorage、RedisMetricsStorage
MetricsCollector
将类组装起来并提供执行入口
定义类及类与类之间的关系
划分职责
课堂讨论
重点回顾
Review设计与实现
面向对象设计
模块划分
需求分析
性能计数器框架

该思维导图由 AI 生成,仅供参考

在上一节课中,我们对计数器框架做了需求分析和粗略的模块划分。今天这节课,我们利用面向对象设计、实现方法,并结合之前学过的设计思想、设计原则来看一下,如何编写灵活、可扩展的、高质量的代码实现。
话不多说,现在就让我们正式开始今天的学习吧!

小步快跑、逐步迭代

在上一节课中,我们将整个框架分为数据采集、存储、聚合统计、显示这四个模块。除此之外,关于统计触发方式(主动推送、被动触发统计)、统计时间区间(统计哪一个时间段内的数据)、统计时间间隔(对于主动推送方法,多久统计推送一次)我们也做了简单的设计。这里我就不重新描述了,你可以打开上一节课回顾一下。
虽然上一节课的最小原型为我们奠定了迭代开发的基础,但离我们最终期望的框架的样子还有很大的距离。我自己在写这篇文章的时候,试图去实现上面罗列的所有功能需求,希望写出一个完美的框架,发现这是件挺烧脑的事情,在写代码的过程中,一直有种“脑子不够使”的感觉。我这个有十多年工作经验的人尚且如此,对于没有太多经验的开发者来说,想一下子把所有需求都实现出来,更是一件非常有挑战的事情。一旦无法顺利完成,你可能就会有很强的挫败感,就会陷入自我否定的情绪中。
不过,即便你有能力将所有需求都实现,可能也要花费很大的设计精力和开发时间,迟迟没有产出,你的 leader 会因此产生很强的不可控感。对于现在的互联网项目来说,小步快跑、逐步迭代是一种更好的开发模式。所以,我们应该分多个版本逐步完善这个框架。第一个版本可以先实现一些基本功能,对于更高级、更复杂的功能,以及非功能性需求不做过高的要求,在后续的 v2.0、v3.0……版本中继续迭代优化。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何实现一个支持各种统计规则的性能计数器。作者强调了小步快跑、逐步迭代的开发模式的重要性,提倡在多个版本中逐步完善框架。在v1.0版本中,作者暂时只实现了数据采集、存储、聚合统计和显示这四个基本功能,将更高级、更复杂的功能留在后续版本中进行迭代优化。文章详细讲解了面向对象设计与实现的步骤,包括划分职责、识别类、设计接口等。通过对MetricsCollector、MetricsStorage、Aggregator、ConsoleReporter和EmailReporter等类的划分和设计,作者展示了如何实现灵活、可扩展的、高质量的代码。整体而言,本文强调了逐步迭代的开发模式和面向对象设计的重要性,为读者提供了实现性能计数器的思路和方法。文章内容涉及面向对象设计、代码质量和灵活性,适合对性能计数器实现感兴趣的读者阅读。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(96)

  • 最新
  • 精选
  • 落叶飞逝的恋
    老师,请教个问题。类的定义里面,什么时候使用基本类型,什么时候用包装类型?

    作者回复: 能用基本类型就不要用包装类型~

    2020-01-04
    3
    3
  • 程序员小跃
    把落下的实战篇学习完了,还把老师的干货总结分享给了自己的小伙伴,都说赞

    作者回复: 😍

    2020-01-06
    2
  • 淤白
    打卡:用Java实现了文中的完整案例。

    作者回复: 加油

    2020-11-23
    1
  • 牛顿的烈焰激光剑
    Demo.java 里应该用`while(true);`包裹所有代码吧?

    作者回复: 不用的哦,你觉得为啥要while循环呢?只是一个demo而已的

    2020-01-06
    2
  • 猫头鹰爱拿铁
    可否提供下类图,整体上看着更方便。

    作者回复: 自己画画?

    2020-01-02
    2
  • 再见孙悟空
    对于获取大量数据在内存有可能把内存撑爆的问题,有什么好的解法吗?前段时间系统也遇到这个问题了,最后扩大了内存,有没有通过代码上来解决的方案呢?欢迎小伙伴和老师的指教。

    作者回复: 后面有讲到 别急

    2020-01-01
    4
  • 堵车
    要写出优美的代码,首先要有一颗对丑陋代码厌恶的心
    2020-01-02
    8
    62
  • 李现教你学编程
    新年快乐 一起学习 一起提高 2020
    2020-01-01
    7
    52
  • 何沛
    Aggregator考虑到后期新增新的维度统计,可以考虑使用责任链模式。 ConsoleReporter、EmailReporter 出现了代码复用,可以用模板设计模式。
    2020-01-02
    5
    30
  • 辣么大
    想了三点,希望和小伙伴们讨论一下: 1、RequestInfo save 一次写入一条。是否需要考虑通过设置参数,例如一次写入1000或10000条?好处不用频繁的与数据库建立连接。 2、聚合统计Aggregator是否可以考虑不写代码实现统计的逻辑,而是使用一条SQL查询实现同样的功能? 3、EmailReporter startDailyReport 没指定明确的统计起止时间。设置统计指定区间的request info,例如08:00~次日08:00,然后发邮件。
    2020-01-01
    10
    24
收起评论
显示
设置
留言
96
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部