如果不这样,应该重构这个

时间:2015-11-27 09:58:50

标签: javascript if-statement functional-programming refactoring

有人给了我一些关于如何重构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
}  

我仍然接受了。它不大或复杂。很容易知道在做什么。我将这样编码只是删除&amp;&amp;后面的条件。我不喜欢写这么多 - 如果这样,但是我找不到更好的方法。

我问他如何反驳它,他给了我重构的代码。

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很了解。我认为模式匹配就像切换器一样。更强大。

我从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是一个好习惯吗?

感谢您的回复!

2 个答案:

答案 0 :(得分:0)

我认为答案取决于你的情况。

如果您自己工作,请选择您更熟悉的风格;毕竟,你是那个(重新)阅读你的代码的人 - 你需要能够相当容易地理解它。我说如果你能训练自己一眼就能理解哈希地图,那就去吧,它会把那些珍贵的水龙头保存在键盘上。

如果您在专业环境中工作,则必须了解此代码不属于您自己的代码。这段代码将由您的同事以及您的许多继任者阅读。您需要确保您的代码尽可能可读和连贯 - 如果这些额外的1-2行代码使整个程序更具可读性,那么它值得投资。没有什么比那些试图过于聪明的人继承代码更糟糕了。在撰写和结束复杂的代码块时,即使是作者也几乎无法读取。

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

答案 1 :(得分:0)

所有这些代码都用于&#34;重构&#34;,你只需要使用开关,开关比其他更快,最有可能是上面所有其他模糊的代码。

更多信息 - &gt; Javascript switch vs. if...else if...else

P.S这是我的个人意见