首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果是其他的话应该重构这个吗?

如果是其他的话应该重构这个吗?
EN

Stack Overflow用户
提问于 2015-11-27 09:58:50
回答 2查看 145关注 0票数 1

有人给我举了关于如何重构if-else代码的例子。

代码语言:javascript
运行
复制
function doSomething(a) {
    if (a === 'x') {
        doX();
    } else if (x === 'y') {
        doY();
    } else {
        doZ();
    }
}

它应重新考虑到:

代码语言:javascript
运行
复制
function doSomething(a) {
    var lookup = {x: doX, y: doY}, def = doZ;
    (lookup[a] || def)();
}

但我说这是个坏例子。第一段代码是足够的样本。我想如果-否则的话,那是可以的。第二段代码不像第一段代码那么清晰。

然后他又给了我一个例子:

代码语言:javascript
运行
复制
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
}  

我仍然认为它被接受了。它既不大也不复杂。很容易知道这是在做什么。我将这样编码,只需删除&之后的条件即可。我不太喜欢这样写,但我找不到更好的方法了。

我问他如何改造它,他给了我他重构的代码。

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
describeLetter :: Char -> String
describeLetter c
   | c >= 'a' && c <= 'z' = "Lower case"
   | c >= 'A' && c <= 'Z' = "Upper case"
   | otherwise            = "Not an ASCII letter"

如果我用Haskell来写这个逻辑,我会这样写它,我认为它类似于原始代码,而不是由他重构的代码。

我的问题是,哪个代码更好,原始代码还是重构代码?为什么?或者还有其他方法来重构这段代码?

使用散列映射重构if-否则是一个很好的实践吗?

谢谢你的回答!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-27 10:16:27

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

如果您是自己工作,选择您更适合使用的样式;毕竟,您将(重新)阅读您的代码--您需要能够相当容易地理解它。我会说,如果你能训练自己一目了然地理解散列图,那就去做吧,这样就省去了键盘上那些珍贵的敲击。

如果你是在一个专业的环境中工作,你必须明白这段代码不是“你的”。这段代码将被您的同事以及您的一些继任者阅读。你需要确保你的代码尽可能的可读性和连贯性--如果这些额外的1-2行代码使整个程序更加可读性,这是值得的。没有什么比从那些试图在编写时变得“太聪明”的人那里继承代码更糟糕的了,而且最终会产生一些复杂的代码块,这些代码甚至是作者都无法读懂的。

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

票数 0
EN

Stack Overflow用户

发布于 2015-11-27 10:21:33

所有这些代码都用于“重构”,您只需使用开关,切换速度就比其他代码快,而且很可能是由上面所有其他晦涩的代码完成的。

这里有更多信息-> Javascript switch vs. if...else if...else

这是我个人的看法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33954782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档