Должен ли я использовать константы вместо строк, даже если строки используются только один раз? - PullRequest
8 голосов
/ 20 ноября 2010

У меня есть фрагмент кода, который анализирует неясный текстовый файл.
Этот текстовый файл может содержать различные ключевые слова.В какой-то момент есть некоторая длинная часть, которая выглядит следующим образом:

void loadKeywords() {
    tmpString = getValueForKeyword("width");
    if (tmpString != NULL) {
        /* do something for several lines */
    }

    tmpString = getValueForKeyword("height");
    if (tmpString != NULL) {
        /* do something for several lines */
    }

    /* and so on a few dozen times */
}

Эти строки "height" и "width" используются только в этом фрагменте кода.Тем не менее, мне интересно, было бы лучше использовать определенные строковые константы, такие как

#define KEYWORD_WIDTH ("width")

вместо литералов в приведенном выше коде.

Что бы вы сделали?

Ответы [ 6 ]

10 голосов
/ 20 ноября 2010

Начало без извлечения констант. Позже ваш редактор, вероятно, может сделать это за вас, если позже вам это понадобится.

Хотя, если вы думаете, что это улучшит читабельность вашего кода, вы можете использовать константы. Сделайте это, если вы можете добавить больше семантического значения, сделав так:

BROWSER_WIDTH = "width"
CONNECTION_POOL_MAX_SIZE = "max_size"
5 голосов
/ 20 ноября 2010

Наличие констант в одном месте помогает, особенно если константы необходимо изменить в будущем - т.е. в случае локализации.

Если строковые константы специфичны для решения (т. Е. Синтаксический анализ какого-либо файла конфигурации с хорошо установленными ключевыми словами), то я бы сказал, что введение const ничего не делает - кроме сохранения вашего кода стиль соответствует . :)

Ofc, если вы используете одну и ту же строковую константу дважды, константа дает вам одно большое преимущество: компилятор предупредит вас, когда вы сделаете опечатку с именем константы , но не будет, если вы сделаете опечатка в повторном литерале.

2 голосов
/ 20 ноября 2010

Преимущество использования констант для строк, даже если они используются только один или два раза, состоит в том, что компилятор может проверить правильность написания имен идентификаторов, чего не может быть, если вы просто используете строковые литералы - - так что как только вы получите правильные строки, вы с большей вероятностью подберете определенные типы опечаток во время компиляции. Это обычно полезно (по очевидным причинам) - хотя иногда это МОЖЕТ быть немного раздражающим для того, кто бы ни встречал ваш код следующим, регулярно находя определение каждой константы, чтобы увидеть, к какой последовательности символов она фактически относится.

Одна рекомендация, которую я бы рекомендовал для C (и, действительно, C ++), состояла бы в том, чтобы использовать статические массивы const char для хранения строк, например ::

static const char KEYWORD_WIDTH[]="width";

Это облегчает просмотр в отладчике, и вы гарантированно получите только одну копию каждой строки.

1 голос
/ 21 ноября 2010

Одним из преимуществ использования постоянного символа вместо магического числа / строки является то, что вы можете более точно выразить семантику значения.Например, строковый токен в вашем тексте может быть "wdh".Не очевидно, что это означает, например, «ширина» или «токен, означающий ширину автомобиля».Используя константу, вы выражаете это лучше:

const chat * WIDTH_OF_CAR_PARSING_TOKEN = "wdh";

Это всего лишь идея.

1 голос
/ 20 ноября 2010

Хорошая привычка - использовать константы со значимыми именами, даже если они использовались в коде один раз.Если вы используете их более одного раза, вы должны определить константы.

1 голос
/ 20 ноября 2010

Я бы использовал const. *

Даже если бы он использовался только один раз.

Я бы не использовал # define.

* за исключением оченьузко определенный набор ситуаций, когда плохой компилятор генерирует дополнительные байты в чрезвычайно ограниченной среде памяти

...