Форматирование исходного кода

Важным способом повышения "читаемости" кода программы является его правильное форматирование. Некоторые элементы форматирования, например, расстановка отступов, реализованы в текстовых редакторах "для программистов". О возможностях редактора vim можно прочитать на этой странице.

Отступы и расположение фигурных скобок

Отступы используются для визуального выделения структуры программы. Операторы, которые составляют тело функции, цикла или условного оператора, принято сдвигать вправо относитльно заголовка функции, цикла или условного оператора. В приведенном ниже примере (справа) сразу видно, какие операторы выполняются в теле цикла while. Также явно видно где заканчивается функция main.

Плохо

int main()    {
int k=100;
while(k>0){
    k=k-1;
if((k%7)==1){printf("k=%d\n",k);}}
     return 0;

}

Лучше

int main() {
    int k = 100;
    while(k > 0) {
        k = k-1;
        if((k % 7) == 1)
            printf("k=%d\n", k);
    }
    return 0;
}

Размер отступа должен быть достаточно большим, чтобы четко выделить группу операторов, но не слишком большим, так как в противном случае при большой вложенности операторов (циклов и условных переходов) текст программы перестанет умещаться по ширине экрана, чего следует категорически избегать. Распространенным значением сдвига является четыре пробельных символа.

Закрывающая фигурная скобка должна быть единственным символом в строке и ее следует располагать на уровне первого непробельного символа строки, содержащей соответствующий оператор. В приведенном примере закывающая скобка для цикла while находится на уровне символа w. Открывающую скобку можно располагать либо в конце строки опреатора (как в приведенном примере), либо на отдельной строчке, аналогично закрывающей скобке. В последнем случае блок выделяется сильнее, но при этом тратится лишняя строчка. Чем больше кода умещается на экране – тем проще понять логику программы (нет необходимости прокручивать текст).

Пробелы внутри одного оператора

В каких случаях следует ставить пробелы в рамках одной строки (одного оператора)?

Плохо

int validate_values(double x,double y,double a){ // нет пробелов
    double k = x/ y-a; // выглядит как ошибка в x/(y-a)
    double dx=0 ; // пробел перед ;
    if(k< 0||x <  y){  // нет пробела до < и лишний пробел после
        return -1;
    }
    for(dx=(y-x)/10;x<y;x+=dx) { // все сливается
        if(compute(1,2.1,x,3-x,1.,0.1,.3)<0){ // аргументы не видны
            return - 1; // пробел после унарной операции
        }
    }
    return 0;
}

Лучше

void validate_values(double x, double y, double a) {
    double k = x/y - a;
    double dx = 0;
    if(k < 0 || x < y) {
        return -1;
    }
    for(dx = (y-x)/10; x < y; x += dx) {
        if(compute(1, 2.1, x, 3-x, 1., 0.1, .3) < 0) {
            return -1;
        }
    }
    return 0;
}

Длинные строки

В тексте программы следует категорически избегать появления длинных строк, так как редактирование программы становится неудобным в случае, когда текст не умещается по ширине экрана. Строчку можно считать длинной, если она не умещается в 80 символов, включая отступ. Источниками длинных строк, как правило, являются сложные арифметические и логические выражения, вызов функций, управляющие конструкции циклов. Если оператор оказывается слишком длинным, то его можно записать в несколько строк.

Вызов функции

Если вызов функции не умещается на одной строке, то перевод строки можно ставить после запятой, которая разделяет аргументы вызова. Сколько аргументов размещать на одной строчке зависит от конкретной ситуации. Если аргументы сложные, например, являются арифметическими выражениями, то имеет смысл размещать один аргумент на строке. Если же аргументы простые или между ними существует связь, то более наглядным может оказаться несколько аргументов на строке.

...
double velocity = 0;
velocity = compute_velocity(convert_to_kilometers(miles_travelled),
                            end_time - start_time);
distance = compute_distance(x1, y1, z1,
                            x2, y2, z2);

Цикл со сложными условиями

Управляющая конструкция цикла for включает инициализацию переменных, проверку условия продолжения цикла и оператор, который выполняется после каждой итерации цикла (инкремент). Эти выражения могут быть достаточно длинными. Разрыв строки можно ставить после символа точка с запятой, который разделяет эти три части.

double process_points(double points[], int number_of_points, double border, double slope) {
    int point_number;
    for(point_number = find_starting_point(points, slope);
        point_number < number_of_points && point[point_number] < border;
        point_number++) {
        /* ... */
    }
    return 0;
}

Логические и арифметические выражения

Сложные логические и арифметические выражения можно сделать более наглядными, если использовать круглые скобки и переносы строк.

В начало Читать дальше: выбор имён переменных »