1

私の最後の会社で、区切り文字列の特定の部分のインデックス、または SQL テーブルの列の定数を作成する非常に巧妙な方法のように見えるものに出会いましたが、パフォーマンスやその他の欠陥があるのではないかと長い間疑問に思っていました。キャッチしませんでした。

たとえば、住所情報を含む単一の区切られた文字列に 5 つのデータ フィールドがある場合、次のように表示されることがあります。

const int INDX_NAME = 0;
const int INDX_ADDR = INDX_NAME + 1;
const int INDX_CITY = INDX_ADDR + 1;
const int INDX_STATE = INDX_CITY + 1;
const int INDX_ZIP = INDX_STATE + 1;

そうすれば、将来、プログラムが名前と市区町村の間の住所の 2 行を区切る必要がある場合 (たとえば、1 行に住所、もう 1 行に部屋番号など)、プログラマーがしなければならないことは次のとおりです。行を追加

const int INDX_ADDR2 = INDX_ADDR + 1;

INDX_CITY を作成する行を次のように変更します。

const int INDX_CITY = INDX_ADDR2 + 1;

要するに、これは、特にリストが 50 個以上のアイテムであり、インデックス番号 3 に何かを追加する必要がある場合に、変更される可能性のある列/ピース インデックス リストを処理するための非常に賢い方法のように思えました。リストが大きくなり始めると、これがパフォーマンスに影響を与え始める可能性があります。または、私が見ていない他の固有の欠陥があるかどうか.

何かご意見は?この怠惰なプログラミングを巧妙ではなくするものはありますか?

ありがとう。

-編集-

得られた応答から列挙型の値がどこにあるのかがわかりますが、使用しているすべてのフィールドが互いに正確に 1 スポット離れている場合にのみ有用であることが懸念されます。他のプログラマーも参照しているデータ ストレージの一部を使用しているが、全フィールドのサブセットしか気にしないので、気にしないフィールドのブロックをスキップする必要がある場合はどうでしょうか。

たとえば、300 フィールドの長さの区切られた文字列から 100 のデータ フィールドを使用していますが、アプリケーションはフィールド 1 ~ 4 (配列のカウント) を気にしません。列挙型を使用して置き換えるクリーンな方法はありますか

const int INDX_RECORD_ID = 0;
const int INDX_DATE_UPDATED = INDX_RECORD_ID + 5;
const int INDX_USER_UPDATED = INDX_DATE_UPDATE + 1;
...

?

4

2 に答える 2

5

いいえ、「怠惰」ではありません。それは単に良い習慣だと思います。また、フィールドはコンパイル時の定数でなければならないため、実行時のペナルティは発生しません。const

于 2012-10-12T16:22:32.050 に答える
5

本当にenumここで使用する必要があります。これらは、まさにこのタイプの状況向けに設計されています。

public enum MyEnum
{
    NDX_NAME,
    INDX_ADDR,
    INDX_CITY,
    INDX_STATE,
    INDX_ZIP
}

値を (任意の位置に) 追加すると、それに応じてすべてのインデックスが更新されます。

列挙を使用すると、いくつかの利点があります: (完全なリストではありません)

  1. インデックスではなく、列挙型に型指定された関数または変数へのパラメーターを持つことができます。これにより、「このパラメーターには、この別のクラスの定数の 1 つを指定する必要がある」という意図を他のコーダーに明確に伝えることができます。
  2. 前の定数に 1 を追加しないという間違いを心配する必要はありません。途中で新しいアイテムを追加したり、コピー/貼り付けエラーとして発生したりすることが簡単にわかりました。
  3. 表示を簡単にするために列挙型の文字列値 (および整数値) を取得する機能など、他の列挙型ツールを使用できます。リフレクションを使用して可能な値を反復処理できます。文字列または整数を解析して適切な列挙値など

パフォーマンスに関しては、(列挙型と定数の両方の) 値は実行時ではなくコンパイル時に評価されるため、実行時に手動の番号付けよりも追加のコストはかかりません。

于 2012-10-12T16:26:52.230 に答える