相关文章
IoT Studio可视化搭建平台编辑历史功能的思考与探索
2024-12-16 15:21

简介: 在前端可视化搭建领域中“重做”和“撤销”这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了“后悔药”。目前有各种各样的可视化搭建平台,本文介绍IoT Studio可视化搭建平台在编辑历史功能上的设计与思考。

IoT Studio可视化搭建平台编辑历史功能的思考与探索

来源 | 阿里技术公众号

在前端可视化搭建领域中“重做”和“撤销”这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了“后悔药”。目前有各种各样的可视化搭建平台,本文介绍IoT Studio可视化搭建平台在编辑历史功能上的设计与思考。

1 页面DSL的维护

在IoT Studio可视化搭建平台中,我们通过页面的抽象语法树来维护页面状态,页面信息和组件信息都记录在对应节点上:

2 重做与撤销

快照法

在每次编辑页面时,将页面的信息进行深拷贝存入历史记录中。在进行重做和撤销时从历史记录中取出对应的快照,用快照代替当前页面状态,即可完成一次历史记录的操作。

在这种方法下,通常使用一个指针来指向当前的页面状态。如下图:

  1. 实现比较简单,页面信息全量进行深拷贝即可。
  2. 历史记录之间的切换灵活。
  3. 当页面信息很大时,十分占用存储空间。

指令法

IoT Studio使用的是这种方法。

我们为每一次操作定义两个方法:execute与undo,以及将“操作”抽象为Operation。

在execute中执行这次操作的正向操作,在undo中实现逆向操作。

每进行一次编辑操作,其实就是创建一次Operation并执行其execute方法,随后如果需要撤销就执行其undo方法。

指令法的特点:

  1. 相对快照法,在页面配置复杂时,能节省不少存储空间。
  2. 不同的Operation其execute和undo逻辑很可能会不一样,有一定的逻辑开发成本。
  3. 跨多个历史记录的重做或撤销,需要执行他们之前所有的execute或undo。例如,上图中如果从O3到O1需要执行2次undo。这一点没有快照法便利。

3 实现细节

在上文里提到了IoT Studio使用的是指令法。

Transation

在实际业务开发中,很多场景会涉及到一次性编辑多个组件,即涉及多个Operation实例。于是在Operation基础上有了Transaction——事务的概念,Transaction下维护了一份Operation实例List,每当有execute或者undo执行时,会遍历Operation List中的Operation实例执行其execute或undo方法。

双向链表

IoT Studio中的操作历史是基于双向链表实现的,每个链表节点维护一个Transaction实例。链表节点末端的execute结果既是最新的操作历史。

链表之前通过forwardCurrent和backforwardCurrent方法进行节点状态的切换。

 

每当有新的编辑操作时,会通过addAfterCurrent插入新的节点。

4 总结

Operation是实现重做和撤销的最小指令实例,通过Operation不同子类实现不同的execute和undo方法,从而实现重做和撤销的具体逻辑。

Transaction中维护了Operation实例数组,我们在进行业务逻辑开发中对组件进行属性设置时是以Transaction实例为单位进行业务逻辑开发。

维护了一个双向链表来对Transaction实例进行管理,从而实现可视化搭建的操作历史功能。

在实现思路中我们提到了“快照法”和“指令法”,对比两者的优缺点,不难发现主要矛盾是在体积与维护成本上。那么有没有一种办法能兼顾二者的优点呢?下面两个工具可以提供一些思路:

immutable.js + 快照法

在JS中对象是引用赋值,在保存对象时往往会使用深拷贝规避这个问题,但是这样会造成CPU和内存的浪费,这也是快照法的缺点所在。

immutable使用持久化数据结构,在使用旧数据创建新数据的时候,会保证旧数据同时可用且不变,同时为了避免深度复制复制所有节点的带来的性能损耗,immutable使用了结构共享,即如果对象树种的一个节点发生变化,只修改这个节点和受他影响的父节点,其他节点则共享。

在实现操作历史功能时,使用immutable存储数据,能解决数据复用的问题。immutable.js + 快照法可以组合使用。据我所知公司的@ali/visualengine使用的就是这个方案。

Git

每次我们运行 git add 和 git commit 命令时,Git 所做的工作实质就是将被改写的文件保存为数据对象, 更新暂存区,记录树对象。
Git 是如何做到这点的?Git 打包对象时,会查找命名及大小相近的文件,并只保存文件不同版本之间的差异内容。 你可以查看包文件,观察它是如何节省空间的。
同样有趣的地方在于,第二个版本完整保存了文件内容,而原始的版本反而是以差异方式保存的——这是因为大部分情况下需要快速访问文件的最新版本。最妙之处是你可以随时重新打包。Git 时常会自动对仓库进行重新打包以节省空间。当然你也可以随时手动执行 git gc 命令来这么做。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

    以上就是本篇文章【IoT Studio可视化搭建平台编辑历史功能的思考与探索】的全部内容了,欢迎阅览 ! 文章地址:http://sjzytwl.xhstdz.com/news/11626.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://sjzytwl.xhstdz.com/mobile/ , 查看更多   
最新文章
发力“春日经济”!首届青岛市赏花节启幕,100余项特色活动邀您参与
东风传花信,山海迎客临。3月28日上午,由山东省文化和旅游厅、青岛市人民政府指导,青岛市文化和旅游局、各区(市)政府主办的
CBA常规赛:北京北汽队负于浙江稠州金租队
3月27日,在北京首都体育馆举行的2024-2025中国男子篮球职业联赛(CBA)常规赛中,北京北汽队主场99比106负于浙江稠州金租队。图
观点|以负面清单规范健康科普
张玉胜日前,上海推出了全国首个“互联网健康科普负面行为清单”,同时在各级医疗卫生机构建立健全互联网健康科普规范管理制度,
三星折叠屏手机新突破:360度折叠设计引发热议
【环球网科技综合报道】3月30日,据外媒报道,三星的一项新专利揭示了其正在研发的360度折叠屏手机设计,这一创新概念有望彻底改
AI时代,科技期刊如何继续保持“可信”|中关村论坛观察
每经记者:杨煜    每经编辑:张海妮科技期刊在科学研究与科学传播中的重要性不言而喻。3月28日,在“2025中关村论坛年会”
李睿赴湄潭县宣讲习近平总书记在贵州考察时的重要讲话精神
3月25日,省委常委、市委书记李睿赴湄潭县,向基层干部群众宣讲习近平总书记在贵州考察时的重要讲话精神。他强调,要牢记习近平
苹果不会再推出小屏手机,只能寄希望于苹果小折叠
2025年3月,彭博社记者马克·古尔曼透露,苹果正式终结小屏iPhone产品线,未来两年内不会推出屏幕小于6英寸的机型。这一决策源于
东莞莞城城管践行雷锋精神,为垃圾分类“添翼”
为弘扬和践行雷锋精神,倡导绿色文明新风尚,3月5日,东莞莞城城管分局以“学雷锋纪念日”为契机,联合罗沙社区、东莞玉兰女子城
提额延期齐上阵!银行发力消费贷 需增强消费信贷可持续性
近期,多家银行密集跟进政策举措,推出相应消费贷产品。不少银行消费贷额度有所提高、期限有所延长,同时利率持续降低。有权威专
聚焦“百千万工程”丨“乡村艺先生”将走进全市973个村(社区)
近日,根据市委宣传部关于在全市开展“艺起乡见‘百千万’”系列活动的工作安排,云浮市、云安区两级文联率先行动,在云安区高村