Имена переменных

К выбору имен переменных нужно подходить ответственно. Неудачно выбранное название переменной может создать у читателя ошибочное представление о ее назначении и привести к неправильному пониманию логики программы.

Символьные имена для числовых констант

Избегайте явного использования числовых констант. Используйте вместо них переменные, директивы #define, перечисления enum.

Плохо

int buffer[256];
// ...
void process_command(int command) {
    switch(command) {
        case 1:
            for(int k = 0; k < 256; k++)
                buffer[k] = 0;
            break;
        case 2:
            if(buffer[0] == 0) {
                // ...
            }
    }
}

Лучше

#define BUFFER_SIZE 256
typedef enum {CMD_CLEAR = 1, CMD_PRINT = 2} CommandType;
// ...
int buffer[BUFFER_SIZE];
// ...
void process_command(CommandType command) {
    const int blank_value = 0;
    switch(command) {
        case CMD_CLEAR:
            for(int k = 0; k < BUFFER_SIZE; k++)
                buffer[k] = blank_value;
            break;
        case CMD_PRINT:
            if(buffer[0] == blank_value) {
                // ...
            }
    }
}

Посмотрим на исходный вариант этого фрагмента программы (плохой). Здесь используются константы 256, 0, 1 и 2 для обозначения длины массива buffer, начального значения элемента этого массива, команды ОЧИСТИТЬ и команды ПЕЧАТЬ, соответственно. Может ли читатель, глядя на левый код, догадаться, что константа 1 означает команду ОЧИСТИТЬ? Без анализа кода – нет. Можно ли сказать, какие значения допустимы для параметра command функции process_command? Без анализа кода этого не сделать, так как аргумент объявлен целочисленным. Какой смысл имеет константа 0, которая четыре раза появляется в этом коде?

Улучшенный вариант этого фрагметна отличается следующим. Во-первых, размер буфера определен директивой #define. В случае необходимости изменения размера буфера это можно сделать исправив одну строчку – директиву #define. Изменение будет автоматически применено во всех местах, где используеся имя BUFFER_SIZE. В исходном варианте программы потребовалось бы просмотреть весь ее код и заменить 256 на новое значение. В общем случае константа 256 может появляться много раз и в нескольких смыслах, так что заменять нужно только некоторые вхождения, что обычно является причиной возникновения сложно обнаруживаемых ошибок, когда в некоторых местах программы остается старое значение. Во-вторых, для обозначения команд введен тип-перечисление CommandType. Это позволяет объявить формальный параметр функции с правильным типом, который допускает только два значения, и использовать символьные имена CMD_CLEAR и CMD_PRINT вместо соответствующих числовых констант. В-третьих, "пустому" значению 0 присвоено явное символьное обозначение blank_value. Это дает возможность читателю понять смысл константы 0.

В начало Читать дальше: структура программы »