许式伟的架构课
许式伟
七牛云 CEO
84946 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 89 讲
许式伟的架构课
15
15
1.0x
00:00/00:00
登录|注册

61 | 全局性功能的架构设计

支持修改迭代和功能增强
记录用户界面操作
二次开发的代码
支持异步操作和 Undo/Redo
存储中间件
实现反操作
维护 Command 队列
建立文档镜像
多版本文档
存储增量部分
引入只与数据有关的 IO DOM
抽象出对核心系统的稳定依赖
独立成子系统
任何功能都是可以正交分解的
加上多个正交分解的周边系统
最小化核心系统
API 录制
宏(Macro)
数据层(DataLayer)
Command 模式
异步存盘
快速存盘
IO 子系统
架构师的信仰
需求的易变
需求的交织
保持核心系统的纯洁性
业务分解
任何功能都是可以正交分解的
宏录制
Undo/Redo
读盘/存盘
结语
需求的难题
架构师的信仰
难以剥离的全局性功能
全局性功能的架构设计

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

你好,我是七牛云许式伟。
在上一讲 “加餐 | 实战:画图程序的整体架构” 中,我们结合前面几章的实战案例画图程序来实际探讨我们架构思维的运用。这一篇虽然以加餐名义体现,但它对理解怎么开展和评估架构工作非常关键。
在架构设计中,我们会有一些难啃的骨头。其中最为典型的,就是全局性功能。全局性功能的特征是很难被剥离出来成为独立模块的。我们仍然以大家熟悉的 Office 软件作为例子:
读盘 / 存盘:每增加一个功能,都需要考虑这个功能的数据如何存储到磁盘,如何从磁盘中恢复。
Undo/Redo:每增加一个功能,都需要考虑这个功能如何回滚 / 重做,很难剥离。
宏录制:每增加一个功能,都需要考虑这个功能执行的结果如何用 API 表达,并且得支持将界面操作翻译成 API 语句。
……
也有一些功能看似比较全局,但实际上很容易做正交分解,比如服务端的所有 API 都需要鉴权,都需要记录日志。它们似乎有全局性的影响,但一方面,通常可以在 API 入口统一处理,另一方面就算只是提供辅助函数,具体的鉴权和记录日志都由每个 API 自行处理,心智负担不算太高。所以对于这类功能,我们可以不把它归为全局性功能。
正因为需求交织在一起,全局性功能往往难以彻底进行正交分解。但对于架构师来说,难不代表应该轻易就放弃对正交分解的追求。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文通过具体案例,阐述了对全局性功能进行架构设计的思路和方法。作者以实际案例为例,探讨了架构思维的运用。全局性功能的特点是很难被剥离出来成为独立模块的,例如读盘/存盘、Undo/Redo等功能。作者提出了对全局性功能进行正交分解的思路,通过引入IO DOM等方式,削弱全局性功能对核心系统的影响。此外,作者还以实际案例说明了如何设计Undo/Redo功能,通过对数据本身的思考,提出了数据层的引入,以解决Undo/Redo功能的设计。文章强调了架构师的信念,即任何功能都是可以正交分解的,这是架构师的信仰。在模块演化的过程中,保持核心系统的纯洁性比什么都重要。总的来说,本文为读者提供了架构设计的实践经验和思考路径,帮助读者快速了解全局性功能的架构设计思路和方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《许式伟的架构课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • tt
    “业务分解就是最小化的核心系统,加上多个正交分解的周边系统。核心系统一定要最小化,要稳定。坚持不要往核心系统中增加新功能,这样你的业务架构就不可能有臭味。” 我觉得这句话就是下节课的引子,核心是最小化的,就可以容易做到对修改封闭,因为它是业务的本质,除非业务变了,或者是我们没有彻底理解业务,否则它不会剧烈变化。 多个正交分解的周边系统,所以可以容易的扩展,因为互相不耦合,而只是依赖核心。 核心就是坐标系原点,定位了一个业务,周边就是各个象限,扩充了整个系统。

    作者回复: 说得很赞👍

    2019-12-08
    28
  • 诗泽
    当一个新需求来了或者要开始一个新项目的时候架构师在做需求分析和架构设计的时候其他工程师们在做什么?

    作者回复: 在做老项目

    2019-12-05
    8
  • Aaron Cheung
    任何功能都是可以正交分解的,即使我目前还没有找到方法,那也是因为我还没有透彻理解需求。 醍醐灌顶

    作者回复: 👍

    2019-12-03
    7
  • Tesla
    老师,office做增量保存 添加到文档的末尾。是怎么做呢?要保存下每个操作的position和操作类型吗? 这样会同时存在多个文件,读取时需要基于第一个版本文件再做增量计算得出最后一个版本。如果保存很多了 计算量就会很大消耗时间,要有一个合并多版本的线程在后台异步运行吗?

    作者回复: 不是这样的。它是基于数据的多版本。从某个独立版本来说数据是完整的,但是不同版本共享了大部分的数据。

    2020-01-13
    2
    2
  • Tao
    许老师你好,最近在做一个前端图标编辑的 web 应用,遇到了undo/redo 需求,项目之前是针对部分 commander (涉及对画布的增删),将整个画布数据拷贝一份存入,没有持久化在内存中,undo/redo 将数据取出来重绘。性能非常差,数据量上去之后,直接卡死。现在这部分在重构,想要实现你文中表述的样子,只是对修改的部分存储,我们画布元素分为节点(node) 和边(edges),修改只针对这两种,包括修改样式、增加边或者节点,删除边或者节点,我想这增加修改我会将对应的数据存下(有元素id),redo/undo 的时候,与 base 数据合并,提供给场景,但是删除怎么增量保存呢? 另外数据保存到浏览器的 localStrorage 好还是 indexedDB 中较好呢

    作者回复: 1、删除可以看作parent的items属性修改,也可以看作自身deleted属性的修改。 2、localStorage 比较通用、易用,indexedDB 更加强大。

    2019-12-16
    1
  • lixin
    我理解正交分解,就是把需求,从到小的拆分,找到尽可能独立的边界。想好各个边界的交互,各个独立内部逻辑。

    作者回复: 是的

    2023-09-07归属地:广东
  • CoderLim
    老师一直在强调业务正交分解,不理解,能否说一下如何做

    作者回复: 这块和具体业务相关,关键做好需求分析。

    2019-12-06
    2
  • leslie
    "任何功能都是可以正交分解的,如果没有,那是因为没有透彻理解需求"。数据库多年,上次和池老师见面时-他描述他的人生轨迹时,自己得到了一个反思-全栈去看待梳理,然后换位思考去沟通。 大概万事万物离不开数据:数据部门有时反而成了中间点。站在中间点的角度和产品、销售、开发、运维之间做了不少需求的协调和梳理,在不断的换位思考中能理解可能的问题,这大概是最难的事情,不断的沟通去梳理探索当前真正的核心然后才能把握住当下。 老师的课程首先从各个方面去梳理了各个点的问题,又从业务/产品的角度去思考了,最后站在中间的地方去拎起来整体。明显的感受到老师在传递一种思想:好的架构一定是对架构相关的都明白且通过沟通去梳理出真正的核心需求/架构;就像计算机的核心是CPU,然后一步步扩展出整台PC。 感谢老师的教诲和付出:全局性的核心首先是不断抓住核心,然后扩展出周边,不能因为周边反而绑住/束缚了核心。期待老师下节课的分享。
    2019-12-03
    11
  • 清歌
    核心功能最小话,保持稳定;外围功能正交分解,这个总结太厉害了
    2019-12-04
    4
  • Tesla
    哦哦,所以增量保存,是在数据结构上做了优化。以前是先清空原数据,再将新数据保存起来。现在的数据结构可以每次只保存增量,相当于一个update。数据结构和算法实现起来更复杂,但是获得了更好的数据体验
    2020-01-13
    2
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部