否则应该重构这个

should refactor this if else

有人给我举例说明如何重构 if-else 代码。

function doSomething(a) {
    if (a === 'x') {
        doX();
    } else if (x === 'y') {
        doY();
    } else {
        doZ();
    }
}

它应该重构为:

function doSomething(a) {
    var lookup = {x: doX, y: doY}, def = doZ;
    (lookup[a] || def)();
}

但我说这是一个坏例子。第一段代码足够样本。我认为拥有这些 if-else 是可以的。第二段代码没有第一段清晰

然后他又给了我一个例子:

function rank(score) {
    var star
    if (score > 89) {
        star = 9
    } else if (score > 74 && score < 90) {
        star = 8
    } else if (score > 59 && score < 75) {
        star = 7
    } else if (score > 44 && score < 60) {
        star = 6
    } else if (score > 29 && score < 45) {
        star = 5
    } else if (score >10 && score < 30) {
        star = 4
    } else if (score > 8 && score < 11) {
        star = 3
    } else if (score > 6 && score < 9) {
        star = 2
    } else if (score < 7) {
        star = 1
    }
    return star
}  

我仍然认为它被接受了。它不大也不复杂。很容易知道在做什么。我将这样编写代码,只是删除 && 之后的条件。我不喜欢像这样写那么多if-else,但我找不到更好的方法。

我问他怎么重构,他给了我重构的代码

function rank(score) {
    var ranges = {
        9: [90: Infinity],
        8: [75, 90],
        7: [60, 75],
        6: [45, 60],
        5: [30, 45],
        4: [11, 30],
        3: [9, 11],
        2: [7, 9],
        1: [-Infinity, 7]
    }
    var count = _.findKey(ranges, function(range) {
        return range[0] <= score && score < range[1]
    })
    return count >>> 0
}

我觉得重构后的代码比原来的代码复杂,容易出错。而且我不喜欢使用哈希映射来重构 if-else。

他说我应该读一些关于函数式编程的文章。他们没有if-else。他们使用模式匹配和守卫。我对 Scala 和 Haskell 知之甚少。我认为模式匹配就像 switch 语句一样。只是更强大。

我从 wiki 中复制了一段 Haskell 代码:

describeLetter :: Char -> String
describeLetter c
   | c >= 'a' && c <= 'z' = "Lower case"
   | c >= 'A' && c <= 'Z' = "Upper case"
   | otherwise            = "Not an ASCII letter"

如果我用Haskell写这个逻辑,我会这样写,而且我觉得和源代码差不多,不是他重构的代码。

我的问题是哪个代码更好,原始代码还是重构代码?为什么?或者有任何其他方法可以重构此代码?

使用哈希映射来重构 if-else 是一个好习惯吗?

感谢您的回答!

我想答案将取决于你的情况。

如果您是独自工作,请选择您更喜欢的工作方式;毕竟,您是要(重新)阅读您的代码的人——您需要能够相当容易地理解它。我想说的是,如果你能训练自己一眼就理解哈希映射,那就去做吧,它会节省那些宝贵的键盘敲击次数。

如果您在专业环境中工作,则必须了解此代码不是 'yours'。您的同事以及您的许多继任者都将阅读此代码。您需要确保您的代码尽可能具有可读性和连贯性——如果这些额外的 1-2 行代码使整个程序更具可读性,那么投资是值得的。没有什么比从试图成为 'too smart' 的人那里继承代码更糟糕的了,但最终却得到一堆难以阅读的复杂代码,即使是作者也是如此。

你还必须考虑同事的偏好,也许甚至有一个指南来指示如何在代码中写出这些情况。在这些情况下,您应该选择团队选择的首选样式——有时这可能是可读性较差的版本,但连续性也有助于确保易读性。

"refactoring" 的所有这些代码,您只需要使用 switch,switch 比 if else 更快,而且很可能是因为上面所有其他晦涩的代码。

这里有更多内容 -> Javascript switch vs. if...else if...else

P.S这是我个人的看法