コードは、実際には1つの悪い習慣、より多くを提示:
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)Abstractionについて聞いたことがないかのようです。 ... (2)継承。 ... (3)多型。関数を呼び出してジョブを実行し、必要なときに呼び出します。この関数は外部的に一貫した答えを返さなければなりません。 –
@JonGoodwinこれは継承または多型のどちらと関係がありますかわかりません。 – Bergi