首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合成终端控制序列

合成终端控制序列
EN

Code Review用户
提问于 2015-04-06 10:03:52
回答 1查看 252关注 0票数 3

我见过每个人都声称嵌套三元结构是一种邪恶,即使在不能用switch编写操作时也是如此;更多的是,我的代码可以很容易地用switch语句编写。

代码语言:javascript
复制
/// <summary>
/// Control sequence character
/// </summary>
private readonly string CSI = "\u001b";

public string ComposeTermSeqs1(TermActions action)
{
    switch(action) {
        case TermActions.Right:
            return CSI + "[C";
        case TermActions.Up:
            return CSI + "[A";
        case TermActions.Left:
            return CSI + "[D";
        case TermActions.Down:
            return CSI + "[B";
        case TermActions.ForwardWord: //readline lib
            return CSI + "f";
        case TermActions.BackWord: //readline lib
            return CSI + "b";
        case TermActions.BackSearch:
            return "\u0012";
        case TermActions.Interrupt:
            return "\u0003";
        default: //TermActions.SuspendApp:
            return "\u001a";
    }
}

但是当我看到函数…的三元版本时

代码语言:javascript
复制
public string ComposeTermSeqs2(TermActions action)
{
    return (action == TermActions.Right)      ? CSI + "[C"
        : (action == TermActions.Up)          ? CSI + "[A"
        : (action == TermActions.Left)        ? CSI + "[D"
        : (action == TermActions.Down)        ? CSI + "[B"
        : (action == TermActions.ForwardWord) ? CSI + "f" //readline lib
        : (action == TermActions.BackWord)    ? CSI + "b" //readline lib
        : (action == TermActions.BackSearch)  ? "\u0012"
        : (action == TermActions.Interrupt)   ? "\u0003"
        : "\u001a";
}

我不知道,开关大小写是α) (更长的β) )更难维护,因为每次在默认情况下编写一个大小写,而γ)三元版本是纯的,也就是说,当发生错误时,这里没有必要处理这个函数的调试问题,只处理结果。您可能会说第一个版本也是纯的,但是实际上有人可以很容易地为一个案例添加一个附带代码。

我在犹豫…我该选哪一个?

EN

回答 1

Code Review用户

回答已采纳

发布于 2015-04-06 17:25:20

我更喜欢开关语句。以下是我的理由:

  1. 您可以将每个return语句移动到与case语句相同的行上,使switch语句与三元版本一样短。
  2. 由于涉及到更多的?:==(),三元版本更难阅读(至少对我来说是如此)。不过,这没什么大不了的。
  3. 我发现使用三元操作符更容易产生微妙的语法错误(而不是编译时错误)。例如:X=y&掩膜?8: 4;a=5+ (b > c)?B: c;当然,您可以避免使用正确的括号:X= (y &掩码)?8: 4;a=5+(b> c)?B: c);只是有时这类表达会出现在多条线上,很难想象哪一部分是哪一部分。
  4. 编译器可能会比三元if-else阶梯更好地优化开关语句。例如,如果您的开关情况是连续顺序的(如0..N),那么编译器可以使用跳转表将切换简化为: // (伪代码)偏移量= jumpTable索引;
票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/86011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档