1

在我上一家公司,我遇到了一种似乎非常聪明的方法,可以为分隔字符串的某些片段或 SQL 表中的列的索引创建常量,但我一直想知道是否存在性能或其他缺陷没抓到。

例如,如果包含地址信息的单个分隔字符串中有五个数据字段,您可能会看到以下内容:

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;

这样,如果将来程序需要在名称和城市之间分隔两行地址(例如,一行是街道地址,另一行是套房号),程序员所要做的就是添加行

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. 你可以有一个函数的参数或一个枚举类型的变量,而不是一个索引。这有助于使其他编码人员的意图更清楚,然后知道“这个参数需要被赋予这个其他类中的常量之一。”
  2. 您不必担心会犯错误,即没有在前一个常量上加一个。当您在中间添加新项目时,我可以很容易地看到这种情况发生,或者只是作为复制/粘贴错误。
  3. 您可以使用其他枚举工具,例如能够获取枚举的字符串值(以及整数值)以便于显示,您可以使用反射来迭代可能的值,您可以将字符串或整数解析为适当的枚举值等

至于性能,值(对于枚举和常量)将在编译时而不是运行时评估,因此在运行时它不会比手动编号产生任何额外成本。

于 2012-10-12T16:26:52.230 回答