【发布时间】:2015-04-04 06:30:43
【问题描述】:
我正在开发一个绘图应用程序,用户可以在其中创建和删除形状并用鼠标选择它们以拖动它们。是否应该在“选择”数组中引用选定的形状,或者它们每个都应该有一个 isSelected 属性?一种方法比另一种方法有什么优势吗?这是我到目前为止注意到的(我会用人们发现的任何东西来更新它)。我主要关心的是编程的简单性和性能。这个问题在很大程度上与语言无关,但应用程序是 javascript 并且渲染是在 html5 画布上完成的。
检查选择状态
虽然我们可以通过布尔属性立即知道是否选择了某个项目,但基于数组的解决方案需要遍历数组来搜索该项目的引用。考虑到当鼠标悬停在选定的形状上时光标应该变为“拖动”图标,或者当鼠标悬停在未选定的项目上时,光标应该变为“指向手”图标,这种验证非常常见。
取消选择项目
使用布尔属性可以即时选择和取消选择特定项目。然而,对于数组选择,我们必须先循环遍历选择以查看该项目是否存在,然后再从选择中添加或删除它。这使得“切换选择”和“添加到选择”选项慢得多。但是,此类绘图程序中最常见的操作是在选择特定元素之前清除选择。使用数组方法,清除选择就像替换数组一样简单,而布尔方法需要将所有项目的 isSelected 属性设置为 false。
删除项目
值得一提的是,必须先从选择数组中删除一个项目,然后才能将其删除。这个细节不会出现在 isSelected 方法中。
调用所有选定的项目
适用于所有选定项的操作需要最少的数组代码,因为我们只需要循环选择并调用每个元素的方法。如果与项目总数相比,选择很小,则必须仅循环通过选择可能会节省大量时间。使用布尔属性,对所有选定项调用操作所需的时间取决于项的总数,而不是选定项的大小。
绘制时间
所选项目通常具有可以通过其他元素看到的彩色边框。这意味着选择边框必须绘制在所有其他元素的前面。给定项目数“n”和选定项目数(“s”)...
数组解决方案从O(n) 到2*O(n) 进行渲染。
布尔解决方案大约需要 2*O(n) 来渲染。
虽然您可能认为这有理由单独选择数组方法,但请记住,重绘仅在触发操作后完成,而不是每秒 60 次。检查指出的形状以了解它是否被选中比绘图更常见。唯一可能会明显减慢速度的功能是拖动、拉伸和进行矩形选择。由于该应用程序用于表示现实生活中的项目,因此人们通常在键盘上输入他们想要的大小,而不是实际拖动项目。
封装
布尔属性的封装更强,因为项目无需查看应用程序范围的变量即可知道它们是否被选中。这种差异在严格范围的环境中可能意味着很多,但在 javascript 中并不是什么大问题。我想人们可能会认为选择自己不是形状的角色。
【问题讨论】:
-
我建议您研究 MV* 编程模式,因为它们与 JavaScript 相关:Backbone.js、Angular.js、Ember.js 和其他框架有助于解决这些类型的问题。 infragistics.com/community/blogs/nanil/archive/2013/04/01/…
-
@Diodeus 我看不出这对我有什么帮助,因为它是一个没有数据库的仅限客户端的应用程序,而且我遇到的问题主要与 UI 相关。再说了,大部分的应用都做完了,不能随便加个框架。
-
MV* 模式无需与后端通信即可使用。客户端模型、模板、视图和事件在您正在构建的应用程序类型中仍然有效且有用。是的,对于你正在做的事情来说,这可能为时已晚。
标签: javascript language-agnostic multipleselection