代碼呈現更多然後一個不好的做法,實際上是:
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