有人给我举了关于如何重构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)();
}
但我说这是个坏例子。第一段代码是足够的样本。我想如果-否则的话,那是可以的。第二段代码不像第一段代码那么清晰。
然后他又给了我一个例子:
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
}
我仍然认为它被接受了。它既不大也不复杂。很容易知道这是在做什么。我将这样编码,只需删除&之后的条件即可。我不太喜欢这样写,但我找不到更好的方法了。
我问他如何改造它,他给了我他重构的代码。
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-否则。
他说我应该读一些关于函数式编程的文章。他们没有-否则。他们使用模式匹配和保护。我对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-否则是一个很好的实践吗?
谢谢你的回答!
发布于 2015-11-27 10:16:27
我认为答案将取决于你的情况。
如果您是自己工作,选择您更适合使用的样式;毕竟,您将(重新)阅读您的代码--您需要能够相当容易地理解它。我会说,如果你能训练自己一目了然地理解散列图,那就去做吧,这样就省去了键盘上那些珍贵的敲击。
如果你是在一个专业的环境中工作,你必须明白这段代码不是“你的”。这段代码将被您的同事以及您的一些继任者阅读。你需要确保你的代码尽可能的可读性和连贯性--如果这些额外的1-2行代码使整个程序更加可读性,这是值得的。没有什么比从那些试图在编写时变得“太聪明”的人那里继承代码更糟糕的了,而且最终会产生一些复杂的代码块,这些代码甚至是作者都无法读懂的。
您还必须考虑到同事的偏好,也许甚至有一个指南来指导如何在代码中写出这些情况。在这种情况下,您应该选择团队选择的首选样式--有时这可能是较难读的版本,但连续性也将有助于确保可读性。
发布于 2015-11-27 10:21:33
所有这些代码都用于“重构”,您只需使用开关,切换速度就比其他代码快,而且很可能是由上面所有其他晦涩的代码完成的。
这里有更多信息-> Javascript switch vs. if...else if...else
这是我个人的看法
https://stackoverflow.com/questions/33954782
复制相似问题