编写代码时,对边界问题的处理如何才算是适度? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kongque2016

编写代码时,对边界问题的处理如何才算是适度?

  •  
  •   kongque2016 2018 年 7 月 15 日 3520 次点击
    这是一个创建于 2838 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我在用 C 语言做一个 linux 上的编辑器,目前的阶段在实现快捷键绑定,也就是 vim 里的 binkey。
    现在有个两个问题困扰到我:
    1, 如果我假定用户自定义的快捷键不超过约 50 个,我的实现可以很简单。
    因为这样就可以用一个数组容纳,做常规的线性查找,不用哈希表。
    2, 如果我假定 function keys 对应的转义序列长度不超过 8 个。我的实现可以更简单。
    容我解释一下 function keys,其实就是就是键盘上的 F1 ~ F12,类似的还有 HOME,PGUP 之类,在 linux 上它们没有对应的 ascii 码,而是 ESC 打头的转义序列,所以一般编辑器内部是把它们当做 sequence 类型的快捷键处理的。
    我翻了 terminfo 数据库,发现在籍的 function keys 的转义序列长度都不超过 8 字节。因为我的编辑器恰好只在 x64 上运行,用一个 long long 类型容纳,有具体的编程技巧可以避免很多(真的很多)细节上的麻烦。

    我自己编写程序的原则是,编程技巧只应该锦上添花的用,不会为了性能牺牲架构和程序的健壮性。
    但怎么把握健壮的度,像上面两个假定,我自己很难取舍。采用的话,代码会更简洁和可读,但总觉得悬着心,不采用的话,我推测代码量会从 300 行增加到 800 行以上,我不是觉得费事,而是觉得无谓。
    这是我自己的项目,不用迭代开发,至少在这种简单的功能上,想一开始就做决策。
    我看了 Bash 和 Zsh 的源码,bash 用的是单链表,似乎它也认为快捷键不会很多,zsh 用的则是哈希表,从不少的代码细节能看出来,zsh 是很在意健壮性的。

    想知道各位的观点,最好不要讨论商业压力下的产品软件,而是谈谈优秀设计的软件,或者分享你在这方面的宝贵经验。
    5 条回复    2018-08-04 08:26:07 +08:00
    zhujinliang
        1
    zhujinliang  
       2018 年 7 月 15 日 via iPhone
    根据 HID 定义,扫描码最多 255 种情况,ctrl、alt、shift、win/cmd 如果不区分左右,最多 16 种组合,综上,开一个 256*16=4k 的数组,搞定
    billlee
        2
    billlee  
       2018 年 7 月 15 日
    用 C++, 这样链表和散列表的代码量就没区别了
    ipwx
        3
    ipwx  
      &nbp;2018 年 7 月 15 日 via iPhone
    接楼上的评论,你需要面向对象…(如果你平时积累 c 的数据结构“类”,你照样可以写得很开心。什么你不会写 c 面向对象?!)
    kongque2016
        4
    kongque2016  
    OP
       2018 年 7 月 15 日
    @zhujinliang 编辑器运行在 terminal 上,read(0, xx)只能读出 ascii 键值或者 ESC 打头的转义序列。
    jm00
        5
    jm00  
       2018 年 8 月 4 日 via Android
    考虑到所有可能性,但是也别把明知道不可能的范围写进去,还找借口说“万一呢”
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5716 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 06:47 PVG 14:47 LAX 23:47 JFK 02:47
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86