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


8

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"
});

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

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


FIRST_NAME?それはサーバーサイドの何かから来ており、JavaScriptに渡されているように見えます。そして、あなたがJava / C#から来たと言うことと合わせて、これらの変数の.js
意味を誤って読んで

@Izkataキャッシングについてのコメントが得られるかわかりません。これはサーバーで生成されたJSではありません(これらの定数の1つの可能性は、サーバーから取得することです-それは物事をより集中化しますが、それは過度の複雑さと余分なリクエストが多すぎると思います。)
カタナ314

追加のリクエストは生成されません。データはテンプレートに設定され、JavaScriptで使用されます。FIRST_NAME特に使用方法が気になったのですが、ユーザーごとに変わらないのですか?
イズカタ2014

ええ、その部分は例を書く際の怠惰でした。このインスタンスは「firstName」という単語をサーバーに送信するだけで、あまり意味がありませんが、一般的には、入力値のキーとしてそれを使用するという考えです。
Katana314 14

回答:


5

定数は、静的に型付けされた言語でエラーチェック機能を果たしますが、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つの用途にリファクタリングする予定です。リファクタリングできない場合は、おそらく「クラス」レベルの定数に移動します。


1
それには、暗い面もあります。1つの要求に対してデータが追加/削除されるたびに、2つの異なるファイルに追加/削除する必要があります。さらに、データの一部の名前が変更された場合、定数を変更するだけで済みますが、コードが読みにくくなります。これは、1つの定数名が別の変数名を参照しているためです。(たとえば、当社は「登録コード」と呼ばれる名前を1回ではなく2回変更しました。)JSには自動リファクタリングツールがないため、この集中化の多くが失われています。
Katana314 2014

4

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

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

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

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

var NAMESPACE.CONSTANT = 1;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.