11月阅读周·编写可测试的JavaScript代码:基于事件的架构篇
背景
去年下半年,我在微信书架里加入了许多技术书籍,各种类别的都有,断断续续的读了一部分。
没有计划的阅读,收效甚微。
新年伊始,我准备尝试一下其他方式,比如阅读周。每月抽出1~2个非连续周,完整阅读一本书籍。
这个“玩法”虽然常见且板正,但是有效,已经坚持阅读十个月。
已读完书籍:《架构简洁之道》、《深入浅出的Node.js》、《你不知道的JavaScript(上卷)》、《你不知道的JavaScript(中卷)》、《你不知道的JavaScript(下卷)》、《数据结构与算法JavaScript描述》、《WebKit技术内幕》、《前端架构:从入门到微前端》、《秒懂算法:用常识解读数据结构与算法》、《JavaScript权威指南》、《JavaScript异步编程设计快速响应的网络应用》。
当前阅读周书籍:《编写可测试的JavaScript代码》。
基于事件的架构
基于事件的架构与MVC架构
如何对比基于事件的架构与模型-视图-控制器(MVC)呢?其实它们是很相似的。事实上,基于事件的架构帮助执行了MVC所倡导的关注点分离以及模块化。
但两者之间也有一些差异,其最大的区别在于,基于事件的架构模型被打乱、消除或分离,这取决于我们如何看待这些模型。例如,使用MVC时,模型类的初始化对应于数据库中的行数据;该类提供了数据以及对数据进行操作的方法。而在基于事件的架构中,模型只存储简单的散列数据,这些数据通过事件进行传递(你可以称之为模型),以便监听器进行操作。这种数据和功能的分离可以提供更佳的可测试性,更加节省内存,更具模块化,并且具有更好的可伸缩性,都有益于将数据和方法放在第一位置。与大量实例化的各个模型对象随意游荡相比,这里游荡的只是大量的数据,以及一个可以操作它们的实例化对象。
此时的控制器就是事件集线器,将事件在视图和模型之间进行传递即可。事件集线器可以有与之关联的逻辑,比如智能事件传递,而不是盲目地向所有监听器都传递。事件集线器也可以检测到没有监听器的事件,并返回相应的错误消息。除了相关的逻辑外,以事件为中心的控制器只是一个傻瓜式集线器(最多是智能交换机,就像以太网集线器和交换机一样)。
视图,可能是改变最少的,其数据是通过事件推送得到的,而不是通过查询模型得到的。用户发起事件后,视图“模型化”相应的数据,并触发适当的事件。所需的UI更新都可以接收到事件的通知。
基于事件的架构与面向对象编程
将数据和操作数据的方法存在一起是面向对象编程的基本原则。面向对象编程的另外一个原则是重用。该理论表示,普通超类可以被具体的子类进行重用。面向对象方法引入了另一种形式的耦合:继承耦合。在设计监听器时,没有什么可以阻止一个基于事件编程的人员使用面向对象原则,只不过可能会遇到一些波折。
首先,整个程序并不是基于面向对象编程。此外,面向对象编程没有链式的交互对象,只能通过继承或接口耦合,并且程序并没有在单线程或进程中运行,而是在多进程中运行。但最大的不同是,基于事件架构的数据并不是存储在对象中。单例对象及其操作数据的方法一起实例化,然后再将数据传递给要操作这些数据的单例对象。
没有“public”、“private”或“protected”修饰符——所有内容都是私有的。与“外部”世界的唯一沟通方式就是通过基于事件的API。由于这些对象并非由依赖项进行实例化,所以不用担心外部对象会触及到内部对象。没有生命周期问题,这些对象存活于整个应用程序的生命周期内,所以构造函数(如果有的话)在一开始只调用一次,并且析构函数也不是必要的。
基于事件的架构与软件即服务
基于事件的架构促进了软件即服务(SaaS)。每个独立的部分都可以加入事件集线器,独立于其他服务而单独提供服务,从而用于创建应用程序。可以很容易想象通过下载或者互联网访问一个服务存储库,以便让应用程序使用。将应用程序连接到集线器,从而访问它们的服务。这些服务的“API”都是独立的事件命名,其用于调用所暴露的行为以及事件中所必须存在的数据。另外,对于任何有必要的响应,这些服务在结束时,既可以触发其他事件,也可以使用回调机制进行响应。
总结
基于事件的架构开启了软件即服务模式,即根据需要,对小型且独立的功能进行动态添加和删除,从而为应用程序提供服务。
作者介绍
非职业「传道授业解惑」的开发者叶一一。
《趣学前端》、《CSS畅想》等系列作者。华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。
- 点赞
- 收藏
- 关注作者
评论(0)