web-dev-qa-db-ja.com

JavaScriptの文字列定数のベストプラクティス/理由

Java/C#などの静的言語では、文字列や数値の定数をコードに挿入するのではなく、定数を使用します。ただし、私はJavaScriptでのこの習慣を避ける傾向があります。最近では、私の周りの他の一部のコーダーがJSでこのアプローチを採用しているので、私またはおそらく彼らの推論を固める必要があると判断しました。

JavaScriptには、実際の「const」宣言構文はありません。通常は、大文字のプロパティを変更しないという非公式のポリシーで解決します。しかし、私の意見は通常、それらを完全に回避することです。それらの利点のほとんどはJavaScriptで失われるためです。 Javaでは、ミススペル文字列が原因でプログラムを実行しようとしたときにプログラムが失敗します。その時点でプログラムを修正して次に進みます。両方のインスタンスが同じ定数を指している静的チェッカーを使用すると、コンパイル時に見つけることができるので、その問題を排除できます。しかし、JavaScriptはそのスペリング全体に単純にその問題を抱えているでしょう。なぜなら、あなたはつづりの正確さを常に発見するつもりだからです実行時

Library = { doThing: function() }
setTimeout(function()
  Liberry.doThing()
  // No such object: Liberry
}, 0);

これに対する最善の安全策は、通常、「厳密な使用」です。それを好む開発者にとっては、宣言されていない変数の問題をより迅速に見つけるためにそれを使用することに問題はありません。しかし、私の意見では、REST APIなどに文字列定数を提供しても、実際には何も保護されていません。別の例:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

ajax({url: CompanyAPI.constants.ENROLL_URL,
data: CompanyAPI.constants.FIRST_NAME
});
// vs.
ajax({url: "/rest/enroll",
data: "firstName"
});

...あなたは上記を書くつもりでしたが、次にタイプミスをしました。おっと。

ajax({url: CompanyAPI.constants.ENROL_URL,
  data: CompanyAPI.constants.FIRS_NAME
});
// vs.
ajax({url: "/rest/enrol",
  data: "firsName"
});

定数ベースのものはndefinedを提供しますが、 "firsName"の方が優れています。そのため、私はこれを静的言語の利点と見なす傾向があり、それを修正するシステムを持っていることを気にしない傾向があります(デバッグに「厳密な使用」を使用し始める可能性がある以外に)。他の何人かの人々は、文字列/整数の恒常性のための彼らの好ましい実践が何であるかを私に言うことができますか?

編集:明確にするために、私の好みは通常、「firstName」のような文字列をトップレベルの定数宣言なしで直接インラインに置くことです-スペルミスのペナルティはどちらの方法でも同じです。 REST URLのように、長くなる可能性がある文字列は、ファイルの上部で定義する傾向があります。

8
Katana314

定数は、静的に型付けされた言語でエラーチェック機能を果たしますが、2番目の目的にも役立ちます。情報を1か所に集めます。これは、JavaScriptに移行しても失われません。

あなたの例がこのように見えると想像してください、

config.js:

CompanyAPI.constants.ENROLL_URL = "/rest/enroll";
CompanyAPI.constants.FIRST_NAME = "firstName";

enroll.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

special-enroll.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

need-to-enroll-from-this-other-place.js:

ajax({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

goto-enroll.js:

redirect({url: CompanyAPI.constants.ENROLL_URL,
    data: CompanyAPI.constants.FIRST_NAME
});

これらの定数がファイル内のあちこちに表示されていることに注目してください。定数を使用していない場合は、その特定の文字列のすべてのインスタンスを見つけて、手動で置き換える必要があります。確かに、ここには重複がありますが、最後のものは実際には異なることに注意してください。つまり、重複を削除しても、実際にこれを抽象化することはできませんでした。ここで、定数とCompanyAPI.constants.FIRST_NAME変更する必要があります1つだけの場所で変更でき、すべての場所で自動的に変更されます。

文字列を1か所だけで使用していて、それが構成ではない場合(つまり、配列文字列のインデックスが構成ではない場合)、インラインで配置します。互いに近いいくつかの場所で使用していることがわかった場合は、1つの用途にリファクタリングすることを検討します。リファクタリングできない場合は、おそらく「クラス」レベルの定数に移動します。

5
cbojar

他の言語を学ぶように、それを彼/彼女の母国語と比較すべきではありません。一部の言語には、他の言語にはない概念があることがよくあります。私たちは単にそれらを受け入れることを学びます。

Java、C#、およびC++の定数は、バイナリコードには存在しません。これらの定数は、プログラマーとコンパイラーを支援するために発明されました。この回答( https://stackoverflow.com/questions/130396/are-there-constants-in-javascript )は、「これまで一定ではない」と述べています

したがって、あなたの質問に対する答えは、命名規則とコードレビューにあります。あなたとあなたのチームは、定数に名前を付ける方法を定義し、定数が変更されないことに同意し、ルールを実施する方法としてコードレビューを使用する必要があります。結局のところ、どちらに進むかは問題ではなく、誰にでもできることではありません。

定数を扱う私の好ましい方法は

var NAMESPACE.CONSTANT = 1;
4
Roman Mik