宝哥软件园

JavaScript组件之旅(一)分析与设计

编辑:宝哥软件园 来源:互联网 时间:2021-10-25

另一方面,JavaScript通常与宿主环境(如浏览器)紧密集成,因此缺乏强大易用的开发工具。在这样的环境中,开发组件或框架成为一项具有挑战性的任务。这次我们将以一个简单的JavaScript组件开发为契机,逐步扩展组件分析、设计、实现、构建和测试的任务,讨论组件开发过程中涉及的各个方面。这些讨论将陆续在四篇文章中发布(链接将在发布后更新):分析和设计组件编码实现和算法用Ant构建组件测试JavaScript组件现在,假设我们想从头开始设计和实现一个队列管理组件,让我们首先了解一下队列:Queue

队列的图片来自维基百科。队列是一种先进先出的数据结构,只能在其尾部添加项目,项目从头部取出使用。这条规则将适用于我们正在讨论的组件。相信学过C语言或者数据结构课程的同学都已经知道队列了。如果你已经还给老师了,请使用搜索引擎了解队列。这个队列管理组件要实现的具体功能如下:它是一个任务管理器,根据高、中、低优先级维护三个任务队列。客户(用户)可以随时将他们想要执行的任务添加到队列中,指定任务运行的上下文,并向其发送必要的数据。客户也可以随时运行这个队列,队列中的任务按照指定的依赖关系以合理的方式依次运行。为了不使组件过于简单而不实用,我们特意给它添加了一些“糖”:区分优先级、导入上下文和数据以及处理依赖关系。如果把上一段理解为需求,首先我们需要从中提取最重要的关键词,直接决定这个组件应该如何设计:队列优先级依赖。然后,我们从中提取相关对象:TaskManager):从目前的需求来看,它只需要一个实例。Queue):对应于每个优先级的一个队列,TaskManager管理这三个队列实例。任务):描述了添加的任务,该任务被放置在具有相应优先级的队列中。Dependency):描述了一个单一的依赖关系,即Task1依赖于Task2。显然,一个任务可能有多个依赖项。它的对象模型大致可以表达如下:aaa

在设计的早期阶段,对象图注意到Dependency实际上没有做任何事情,Queue的两种方法可以交给TaskManager Task。一个方法由哪个对象负责是一个有争议的话题,这超出了我们的讨论范围。这一次,我们的重点是用JavaScript实现这个组件。结合JavaScript独特的语言特性,我们设想实现以上四个Objects: TaskManager是通过一个对象直接实现的。在JavaScript世界中,对象可以用作自然静态类。——你可以直接在“类”ClassObject中定义属性方法,把CassObject.property. Queue作为一个静态类来引用,体现为一个Array的形式。任务是存储在数组中的每个项目。要操作Queue,必须在Task.prototype中定义一些实例方法,由于每个Queue实例都是原生数组,为了减少Array.prototype的入侵,我们可以考虑在task.prototype上定义这些方法,——将职责转移到任务上。将三个队列数组组装成一个“大数组”,代表三个优先级不同的队列。这个大数组可以用作TaskManager的属性。任务的核心是一个函数,可以直接用来表示一个任务。但是,考虑到它有自己独特的属性(优先级、依赖性等)。)而且是操作最频繁的对象,它将来可能会被扩展,所以我们决定把它单独定义为一个对象。依赖关系以数组的形式直接作为任务的属性存在。——任务将依赖于它的其他任务标识符放入该数组中,不再单独定义该对象。经过分析,情况逐渐明朗。——我们需要将四个对象简化为两个:TaskManager Task,另外两个对象用原生数组实现:refactored-object-diagram

简化对象模型后,我们注意到它多次由数组实现,编码过程必须涉及数组的遍历和搜索,这已经由JavaScript 1.6实现。为了充分利用内置于数组中并在旧浏览器中运行的本机方法,我们使用了Eric的代码。这样就可以直接使用forEach/indexOf等方法,更加注重组件的功能实现,在现代浏览器中获得更好的性能。~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~八卦分割线~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~好了,认真分析完组件设计之后,我们就要踏上编码实现的快乐旅程了。别担心,TaskManager看起来有点俗气:用优先级和依赖管理来表示任务队列是不够的,用它作为命名空间可能会和其他代码冲突。好了,这个组件叫做智能队列,很响亮,很独特。对其进行了分析和设计,并给出了名称。如果想知道具体的实现过程,听下分解。

更多资讯
游戏推荐
更多+