Javascript 如果不是这样的话,应该重构它吗
有人给了我关于如何重构if-else代码的示例Javascript 如果不是这样的话,应该重构它吗,javascript,if-statement,functional-programming,refactoring,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;
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
}
功能等级(分数){
var星
如果(分数>89){
星=9
}否则如果(分数>74和<90){
星=8
}否则如果(分数>59和分数<75){
星=7
}否则如果(分数>44和分数<60){
星=6
}否则如果(分数>29和分数<45){
星=5
}否则,如果(分数>10&&分数<30){
星=4
}否则,如果(分数>8&&分数<11){
星=3
}否则如果(分数>6&&分数<9){
星=2
}否则如果(分数<7){
星=1
}
返回星
}
我仍然认为它被接受了。它既不大也不复杂。很容易知道正在做什么。我将这样编码,只需在&&之后删除条件。我不喜欢写这么多东西,但我找不到更好的方法
我问他如何重构,他给了我他重构的代码
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
}
功能等级(分数){
变量范围={
9:[90:无穷大],
8: [75, 90],
7: [60, 75],
6: [45, 60],
5: [30, 45],
4: [11, 30],
3: [9, 11],
2: [7, 9],
1:[-无限,7]
}
变量计数=u.findKey(范围,函数(范围){
返回范围[0]>>0
}
我认为重构后的代码比源代码更复杂,容易出错。而且我不喜欢使用哈希映射来重构if-else
他说我应该读一些关于函数式编程的文章。他们没有if-else。他们使用模式匹配和guard。我对Scala和Haskell知之甚少。我认为模式匹配就像switch-station一样。只是更强大
我处理了一段来自wiki的Haskell代码:
describeLetter :: Char -> String
describeLetter c
| c >= 'a' && c <= 'z' = "Lower case"
| c >= 'A' && c <= 'Z' = "Upper case"
| otherwise = "Not an ASCII letter"
描述符::Char->String
描述词c
|我想答案将取决于你的情况
如果你自己工作,选择你更喜欢的风格;毕竟,你是一个(重新)阅读代码的人——你需要能够相当容易地理解它。我想说,如果你能训练自己一眼就能理解散列图,那就去做吧,这样可以节省键盘上那些宝贵的点击
如果您在专业环境中工作,您必须了解此代码不是“您的”。此代码将由您的同事以及您的许多继任者阅读。您需要确保您的代码具有尽可能高的可读性和一致性-如果这些额外的1-2行代码使整个程序ram更具可读性,值得投资。没有什么比从那些在编写代码时试图“太聪明”的人那里继承代码更糟糕的了,他们最终得到的是一堆复杂的代码,即使是作者也几乎无法读取
您还必须考虑到同事的偏好,也许甚至有一个指导说明如何在代码中写出这些情况。在这些情况下,您应该选择团队选择的首选样式-有时可能是可读性较差的版本,但连续性也有助于确保易读性l、 我想答案取决于你的情况
如果你自己工作,选择你更喜欢的风格;毕竟,你是一个(重新)阅读代码的人——你需要能够相当容易地理解它。我想说,如果你能训练自己一眼就能理解散列图,那就去做吧,这样可以节省键盘上那些宝贵的点击
如果您在专业环境中工作,您必须了解此代码不是“您的”。此代码将由您的同事以及您的许多继任者阅读。您需要确保您的代码具有尽可能高的可读性和一致性-如果这些额外的1-2行代码使整个程序ram更具可读性,值得投资。没有什么比从那些在编写代码时试图“太聪明”的人那里继承代码更糟糕的了,他们最终得到的是一堆复杂的代码,即使是作者也几乎无法读取
您还必须考虑到同事的偏好,也许甚至有一个指导说明如何在代码中写出这些情况。在这些情况下,您应该选择团队选择的首选样式-有时可能是可读性较差的版本,但连续性也有助于确保易读性l、 所有这些“重构”代码,你只需要使用switch,switch比if-else快,而且很可能是上面所有其他晦涩的代码
更多信息请点击这里->
这是我个人的观点所有这些代码都是用于“重构”的,你只需要使用switch,switch比if-else快,而且很可能是上面所有其他晦涩的代码
更多信息请点击这里->
p.S这是我个人的观点BTW:这种情况没有任何意义:否则如果(分数<74&&分数<90)任何<74的内容都将<90@bub很抱歉,我会修复它。谢谢!请确保对您的等效性进行比较。@Shinobi881好的,我会更改它。谢谢!这个问题是基于观点的,我会说甚至是离题的。如果有两个以上的其他项,我会使用哈希映射或数组…顺便说一句:这个条件没有任何意义se:否则如果(分数<74和<90)任何<74的内容都将<90@bub很抱歉,我会解决它。谢谢!请确保对您的等效性进行比较。@Shinobi881好的,我会更改它。谢谢!这个问题是基于意见的,我甚至会说是离题的。如果有两个以上的,我会使用哈希映射或数组…什么