Javascript 如果不是这样的话,应该重构它吗

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;

有人给了我关于如何重构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
}  
功能等级(分数){
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好的,我会更改它。谢谢!这个问题是基于意见的,我甚至会说是离题的。如果有两个以上的,我会使用哈希映射或数组…什么