程序的健壮性是否该有一个度?

2018-07-19 20:57:42 +08:00
 kongque2016
我想用项目里的具体例子来开始这次讨论。我自己的一个小项目。。。可以当成一个具有代码提示功能的编辑器。现在我要实现两个功能:
1, 按键序列的映射。例如 vim 风格的:
map ^X x
map ^X^A ggvGx
(这两个映射随便写的,没什么特殊意义。)
2,属性名称的智能补全, 像输入"string.l"时,提示:
string.length,
string.lastIndexOf

要实现这两个功能,在编程上需要一个数据结构,来搜集用户绑定按键序列(例如"^X", "^X^A"),或是对象的属性名称(例如"length", "lastIndexOf")。
有两个选择(哈希表被排除了,因为这里需要对字符串排序):
1,普通数组。 排序存储+二分查找。
2,AVL 树。

现在我的问题是,应该选哪一个?这两者的区别仅在于插入 /删除元素时,后者是稳定的,前者在 100 以内通常快,但会随着容量增加而线性变慢。

如果按照“量体裁衣”的原则,数组似乎是更好的选择,毕竟很少有用户绑定超过 100 个快捷键,也很少有一个对象的属性 /方法超过 100 个,即使超过,在 1000 范围内,速度都还是可接受的。

但问题是,如果有某个用户绑定超过 1000 个快捷键,或者某个用户的对象的属性超过 1000 个,甚至是一万,十万,然后他感觉到程序变迟钝了。那这是谁的错?我们怪用户的行为稀奇古怪,用户也可能觉得我们的程序不够“健壮”。毕竟,我们只需要简单的把数组换成 AVL 树,所有的问题都会消失。而且代价不算大,仅仅是代码稍微复杂了一些。
但如此一来,我们是不是过度的关注程序了健壮性呢?

希望听听各位在这方面的宝贵意见,也想听听大家若遇到帖子里的情形,会怎么选择。如果各位你能分享你在编程生涯中遇到的类似的设计抉择,那就更好了。
4309 次点击
所在节点    编程
21 条回复
kongque2016
2018-08-18 20:45:49 +08:00
@choice4
谢谢,感觉这是最佳的方式。
linux 内核 2.4 源码里也有一处,是链表长出 32 后,重构成红黑树。
BTW,真是巧,我这两天正在琢磨这个思路。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/472471

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX