否则应该重构这个
should refactor this if else
有人给我举例说明如何重构 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)();
}
但我说这是一个坏例子。第一段代码足够样本。我认为拥有这些 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
}
我仍然认为它被接受了。它不大也不复杂。很容易知道在做什么。我将这样编写代码,只是删除 && 之后的条件。我不喜欢像这样写那么多if-else,但我找不到更好的方法。
我问他怎么重构,他给了我重构的代码
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 知之甚少。我认为模式匹配就像 switch 语句一样。只是更强大。
我从 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 是一个好习惯吗?
感谢您的回答!
我想答案将取决于你的情况。
如果您是独自工作,请选择您更喜欢的工作方式;毕竟,您是要(重新)阅读您的代码的人——您需要能够相当容易地理解它。我想说的是,如果你能训练自己一眼就理解哈希映射,那就去做吧,它会节省那些宝贵的键盘敲击次数。
如果您在专业环境中工作,则必须了解此代码不是 'yours'。您的同事以及您的许多继任者都将阅读此代码。您需要确保您的代码尽可能具有可读性和连贯性——如果这些额外的 1-2 行代码使整个程序更具可读性,那么投资是值得的。没有什么比从试图成为 'too smart' 的人那里继承代码更糟糕的了,但最终却得到一堆难以阅读的复杂代码,即使是作者也是如此。
你还必须考虑同事的偏好,也许甚至有一个指南来指示如何在代码中写出这些情况。在这些情况下,您应该选择团队选择的首选样式——有时这可能是可读性较差的版本,但连续性也有助于确保易读性。
"refactoring" 的所有这些代码,您只需要使用 switch,switch 比 if else 更快,而且很可能是因为上面所有其他晦涩的代码。
这里有更多内容 -> Javascript switch vs. if...else if...else
P.S这是我个人的看法
有人给我举例说明如何重构 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)();
}
但我说这是一个坏例子。第一段代码足够样本。我认为拥有这些 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
}
我仍然认为它被接受了。它不大也不复杂。很容易知道在做什么。我将这样编写代码,只是删除 && 之后的条件。我不喜欢像这样写那么多if-else,但我找不到更好的方法。
我问他怎么重构,他给了我重构的代码
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 知之甚少。我认为模式匹配就像 switch 语句一样。只是更强大。
我从 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 是一个好习惯吗?
感谢您的回答!
我想答案将取决于你的情况。
如果您是独自工作,请选择您更喜欢的工作方式;毕竟,您是要(重新)阅读您的代码的人——您需要能够相当容易地理解它。我想说的是,如果你能训练自己一眼就理解哈希映射,那就去做吧,它会节省那些宝贵的键盘敲击次数。
如果您在专业环境中工作,则必须了解此代码不是 'yours'。您的同事以及您的许多继任者都将阅读此代码。您需要确保您的代码尽可能具有可读性和连贯性——如果这些额外的 1-2 行代码使整个程序更具可读性,那么投资是值得的。没有什么比从试图成为 'too smart' 的人那里继承代码更糟糕的了,但最终却得到一堆难以阅读的复杂代码,即使是作者也是如此。
你还必须考虑同事的偏好,也许甚至有一个指南来指示如何在代码中写出这些情况。在这些情况下,您应该选择团队选择的首选样式——有时这可能是可读性较差的版本,但连续性也有助于确保易读性。
"refactoring" 的所有这些代码,您只需要使用 switch,switch 比 if else 更快,而且很可能是因为上面所有其他晦涩的代码。
这里有更多内容 -> Javascript switch vs. if...else if...else
P.S这是我个人的看法