web-dev-qa-db-ja.com

動的に型付けされた言語で列挙型が必要なのはなぜですか?

私はいくつかのコード here を読んでいて、HTMLタグの名前を格納するために列挙型が使用されているのを見ました。なぜこれを行う必要があるのですか?この戦略を使用するとどのようなメリットがありますか?

コンパイルされた言語または静的に型付けされた言語での列挙型の有用性を知っていますが、動的に型付けされた言語で列挙型を見ると、上で示したコード例のように気になります。したがって、質問は基本的に、なぜ動的型付け言語で列挙型が必要なのか、それともまったく必要なのかということになります。

33
CodeYogi

利点は、誤って「ADRESS」または「FEILDSET」と入力した場合にコンパイラーから通知され、実行時に無意味な動作をする代わりに、すぐに修正できることです。

この利点は、動的型付け言語よりも静的型付け言語の方がはるかに役立ちますが、ランタイムエラーであっても、データではなくcaseステートメントの問題を示すメッセージが表示されるので役立ちます。

57
whatsisname

列挙型は、適切な値/エンティティの固定セットがある場合に役立ちます。これらは自己文書化されており、コンパイラーが実行時に残されたものを検証できるようにします。意味のある値のセットが不明であるか、厳密に制限されていない場合は、使用しないでください。

より有用な例は、HTTP応答コードのようなものです。数値を受け取り、エラーの名前または説明、あるいはその両方を提供するメソッドを使用する代わりに、意味のある名前、コード、説明などを含む一連の列挙を、1つのクリーンなパッケージに含めることができます。許可され、処理する必要があります。

22
JimmyJames

列挙型はOOPとは関係がなく、JavaScriptには列挙型がありません。代わりに、固定された値のセットから選択できる場合は常に列挙型が使用されます。たとえば、ブール値はtrueとfalseの間の選択であり、_enum Bool { False, True }_として実装できます。 GUIライブラリでは、アライメントの列挙型がある場合があります:_enum HAlignment { LEFT = -1, CENTER = 0, RIGHT = 1 }_。

通常、列挙型の実装方法は関係ありません。重要な部分は、可能な値がそれぞれ異なることです。多くの言語は列挙型に整数を使用しますが、Javaは任意のオブジェクトをサポートします。

これまでは、定数を使用することもできました。 _const int LEFT = -1, CENTER = 0, RIGHT = 1_。ただし、コンパイラーは列挙値が一緒に属していることを認識しています。したがって、列挙値switch(value) {case LEFT: ...; case RIGHT: ...;}を切り替えると、CENTERのケースを忘れたことをコンパイラーが警告します。これはかなりの時間の節約になります。 enumやswitch-caseコンストラクトのない言語では、これはVisitorパターンでシミュレートできますが、静的な型指定がある場合により役立ちます。

他の利点は、列挙型を別の型として処理できることです。例えば。メソッドが整数ではなくHAlignmentパラメータを取ることを宣言できます。 3つの可能なHAlignment値の1つ以外を指定すると、コードはコンパイルに失敗します。ただし、Cの列挙型はうまくカプセル化されておらず、列挙型定数は整数と交換可能に使用できます。他の言語はここでより厳密です。

JavaScriptでは、これらのメリットはありません。以下の例では、列挙型として扱われるオブジェクトを宣言しています。これは、プログラマにとっていくつかの利点があります。ドキュメント化が容易になり、すべての「定数」が1つのオブジェクトにグループ化されます。ただし、そのようなオブジェクトが列挙型に似ているのは単なる慣習です。

ここでの要点は、HTMLには有限で既知のタグのセットのみがあるということです。 HTML5仕様を調べて、それらの要素名を列挙型としてコードに入れることができるため、_<blink>_タグをプログラムに忍び込ませることが難しくなります。この知識を1か所にエンコードして、コードに特別な文字列リテラル(または、マジックナンバー)を散らかすとよいでしょう。

11
amon

言語がコンパイルを必要としない場合でも、おそらく何らかの種類のIDEまたは開発ツールを使用します。これにより、文字列だけではなく、列挙型などのサポートが大幅に向上します。

たとえば、JavaScriptでオブジェクトリテラルのような列挙型を使用する場合、誤った値を誤って使用すると、エディターがコード補完を提供し、JSHintまたはJSLintなどのコードチェッカーが警告します。

3
hansmaad

そのような列挙型のポイントは、許可されたタグのセット/バンドルをJs Api(goog)に提供することかもしれません。どれ? W3C HTML 4.01で定義されたもの(enumのドキュメントをチェックしてください)。つまり、設定の境界です。

これが本当の目標であるかもしれませんが、そうではないかもしれませんが、そのような目的にはうまく機能します。

JavaScriptがどのように機能するかを知っている場合、コードが実行していることは、文字列でインデックス付けされた配列を定義することです:-)。どの値が文字列ですが、属性、関数などを備えた他のコンポーネントである可能性があります。想像力を自由に動かせば、あらゆる場所でメリットが得られます。

JavaScriptは別にして、モデル化と管理に列挙型を多用しています状態マシン

START> IN_PROGRESS> CONFIRMED> FINISHED> ...

Javaswitchでは列挙型が許可されるため、状態をに検証するのは非常に簡単ですステートマシン、列挙型全体をループする、複雑な列挙型を実行して優先順位を定義する、...

また、これらを使用して、型付きで変更不可能な定数を定義します。

  • はい、いいえ

また、複雑な列挙型(安全な変換/パーサーを実行できます)

  • はい(1、true)、いいえ(0、false)

Enumは多くの場合私のモデルレイヤー(コア)に属しているため、その機能はシステム全体からアクセスできるため、機能モデルになり、低カップリングを維持します。

Enumが(とりわけ)与えるものはboundariesおよびtypificationです。

2
Laiv