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是一个好习惯吗?
感谢您的回复!
答案 0 :(得分:0)
我认为答案取决于你的情况。
如果您自己工作,请选择您更熟悉的风格;毕竟,你是那个(重新)阅读你的代码的人 - 你需要能够相当容易地理解它。我说如果你能训练自己一眼就能理解哈希地图,那就去吧,它会把那些珍贵的水龙头保存在键盘上。
如果您在专业环境中工作,则必须了解此代码不属于您自己的代码。这段代码将由您的同事以及您的许多继任者阅读。您需要确保您的代码尽可能可读和连贯 - 如果这些额外的1-2行代码使整个程序更具可读性,那么它值得投资。没有什么比那些试图过于聪明的人继承代码更糟糕了。在撰写和结束复杂的代码块时,即使是作者也几乎无法读取。
您还必须考虑同事的偏好,或许还有指导如何在代码中写出这些情况的指南。在这些情况下,您应该选择团队选择的首选样式 - 有时可能是可读性较低的版本,但连续性也有助于确保易读性。
答案 1 :(得分:0)
所有这些代码都用于&#34;重构&#34;,你只需要使用开关,开关比其他更快,最有可能是上面所有其他模糊的代码。
更多信息 - &gt; Javascript switch vs. if...else if...else
P.S这是我的个人意见