代码呈现更多然后一个不好的做法,实际上是:
var a = 1;
function myFunction() {
++a; // 1
return true;
}
if (myFunction() && a === 2) { // 2, 3, 4
alert("Hello, world!")
}
if (a === 3 && myFunction()) { // 2, 3, 4
alert("Hello, universe!")
}
变异在不同范围的变量。这可能是也可能不是问题,但通常是这样。
召唤一个if
语句条件中的函数。 这本身并不会造成问题,但它并不十分干净。 将该函数的结果分配给变量(可能使用描述性名称)是一种更好的做法。这将帮助阅读代码的人理解您想要在if
声明中检查的内容。顺便说一句,该函数总是返回true
。
使用一些神奇的数字。想象一下其他人阅读该代码,它是一个大型代码库的一部分。这些数字是什么意思?一个更好的解决方案是将它们替换为命名常量。
如果你想支持更多的信息,你需要增加更多的条件。 更好的方法是使这个可配置。
如下我想重写代码:
const ALERT_CONDITIONS = { // 4
WORLD_MENACE: 2,
UNIVERSE_MENACE: 3,
};
const alertsList = [
{
message: 'Hello world',
condition: ALERT_CONDITIONS.WORLD_MENACE,
},
{
message: 'Hello universe',
condition: ALERT_CONDITIONS.UNIVERSE_MENACE,
},
];
class AlertManager {
constructor(config, defaultMessage) {
this.counter = 0; // 1
this.config = config; // 2
this.defaultMessage = defaultMessage;
}
incrementCounter() {
this.counter++;
}
showAlert() {
this.incrementCounter();
let customMessageBroadcasted = false;
this.config.forEach(entry => { //2
if (entry.condition === this.counter) {
console.log(entry.message);
customMessageBroadcasted = true; // 3
}
});
if (!customMessageBroadcasted) {
console.log(this.defaultMessage)
}
}
}
const alertManager = new AlertManager(alertsList, 'Nothing to alert');
alertManager.showAlert();
alertManager.showAlert();
alertManager.showAlert();
alertManager.showAlert();
一类具有精确的函数,使用的而不是一组函数依赖于一些可变其自己的内部状态,这可能位于任何地方。无论是否使用课堂,这都是一个选择的问题。它可以以不同的方式完成。
使用配置。这意味着你想添加更多的消息,你根本不需要触摸代码。例如,想象来自数据库的配置。
正如你可能会注意到,这个变异的功能的外部范围的变量,但在这种情况下,它不会引起任何问题。
使用具有明确名称的常量。 (好吧,这可能会更好,但考虑到这个例子,请忍受我)。
为了便于阅读,我尽量避免这种副作用 - 但如果您提供更详细的使用案例可能会有帮助 – msrd0
该代码几乎没有实际用途。它在很多方面都很糟糕,它无法描述。这就像你从来没有听说过(1)抽象。 ... (2)继承。 ... (3)多态性。调用一个函数来完成一项工作,在需要时调用它,该函数应该返回一个外部一致的答案。 –
@JonGoodwin我没有看到这与继承或多态性有什么关系。 – Bergi