我想知道这是否可能归结为个人品味,或者是否有一个普遍认同的答案。我有一段代码可以用两种方式之一编写,虽然我认为这在效率方面是一个微不足道的例子,但我想知道未来推断的普遍接受的答案是什么。
这是我目前的代码,基本上是一个分数,一些文本会相应更新。文本的颜色也会根据得分值改变。
function getBSTotalText(score) {
var scoreText;
if (score >= 0 && score <= 12) {
scoreText = "0 - 12 HIGH RISK";
}
else if (score >= 13 && score <= 14) {
scoreText = "13 - 14 MODERATE RISK";
}
else if (score >= 15 && score <= 16) {
scoreText = "15 - 16 LOW RISK";
}
else if (score >= 16) {
scoreText = "16+ NO RISK";
}
else {
scoreText = "";
}
return scoreText;
}
function getBSTotalColour(score) {
var colour;
if (score >= 0 && score <= 12) {
colour = "red";
}
else if (score >= 13 && score <= 14) {
colour = "amber";
}
else if (score >= 15 && score <= 16) {
colour = "yellow";
}
else if (score >= 16) {
colour = "grey";
}
else {
colour = "white";
}
return colour;
}
现在我可以轻松地将它重构为一个函数,然后让它返回一个数组或对象来保存基本上复制并将相同的代码粘贴到一个不同的函数中,从我的理解中它将符合DRY但是然后打破SOLID。最佳做法是保持这些功能不同还是将它们合并为一个?
答案 0 :(得分:0)
在这个例子中,我说有一个令人信服的理由重构单个函数,因为两个函数都关注同一个东西 - 获取一些格式化的文本。
function getBSTotalDisplayInfo(score) {
var result = {};
if (score >= 0 && score <= 12) {
result.colour = "red";
result.scoreText = "0 - 12 HIGH RISK";
}
else if (score >= 13 && score <= 14) {
result.colour = "amber";
result.scoreText = "13 - 14 MODERATE RISK";
}
else if (score >= 15 && score <= 16) {
result.colour = "yellow";
result.scoreText = "15 - 16 LOW RISK";
}
else if (score >= 16) {
result.colour = "grey";
result.scoreText = "16+ NO RISK";
}
else {
result.colour = "white";
result.scoreText = "";
}
return result;
}
答案 1 :(得分:0)
检查重复代码的哪一部分,并将其移动到额外的功能中。在你的情况下,它实际上很容易:
function getBSTotal(score) {
// returns some kind of enum
if (score >= 0 && score <= 12)
return 0;
else if (score >= 13 && score <= 14)
return 1;
else if (score >= 15 && score <= 16)
return 2;
else if (score >= 16)
return 4;
else
return 5;
}
function getBSTotalText(score) {
// now map the enum either to a text
return ["0 - 12 HIGH RISK",
"13 - 14 MODERATE RISK",
"15 - 16 LOW RISK",
"16+ NO RISK"
][getBSTotal(score)] || "";
}
function getBSTotalColour(score) {
// … or map it to a color
return ["red",
"amber"
"yellow",
"grey",
"white"
][getBSTotal(score)];
}
通过仅评估getBSTotal(score)
一次并将其传递给映射函数而不是score
,您仍然可以提高效率。