Технология программирования для С++

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

Каждая функция должна решать только одну задачу.

Желательно, чтобы тело функции помещалось на 1-2 экрана:

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

Однотипные действия оформляются в виде перегруженных функций или функций с параметрами.

Короткие функции имеет смысл объявить с директивой inline.

Необходимо тщательно выбирать имена переменных. Правильно выбранные имена могут сделать программу в некоторой степени самодокументированной.

Неудачные имена, наоборот, служат источником проблем.

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

Общая тенденция состоит в том, что чем больше область видимости переменной, тем более длинное у нее имя. Перед таким именем часто ставится префикс типа (одна или несколько букв, по которым можно определить тип переменной). Для счетчиков коротких циклов, напротив, лучше обойтись однобуквенными именами типа i. j или к.

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

Не рекомендуется использовать имена, начинающиеся с символа подчеркивания, имена типов, оканчивающиеся на _t, а также идентификаторы, совпа-дающие с именами ресурсов стандартной библиотеки C++.

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

Локальные переменные предпочтительнее глобальных.

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

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

Входные параметры функции, которые не должны в ней изменяться, следует передавать как константные ссылки, а не по значению.

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

Исключение составляют параметры, размер которых меньше размера указателя — их эффективнее передавать по значению (не забывая указывать const).

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

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

Не рекомендуется возвращать ссылку на переменную, созданную внутри функции в динамической области памяти с помощью функции malloc или операции new, так как это приводит к трудно контролируемым утечкам памяти.

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

Константы должны иметь осмысленные имена, заданные через const или enum (последнее предпочтительнее, так как память под перечисление не выделяется).

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

Для записи каждого фрагмента алгоритма необходимо использовать наиболее подходящие средства языка. Любой цикл можно, в принципе, реализовать с помощью операторов goto и 1 f, но это было бы нелепо, поскольку с помощью операторов цикла те же действия легче читаются, а компилятор генерирует более эффективный код.

Ветвление на несколько направлений предпочтительнее реализовывать с помощью оператора switch, а не нескольких 1 f, красивый способ передачи управления одной функции из группы — массив указателей на функции.

Следует избегать лишних проверок условий. Например, вместо операторов
if (strstr(a, b) > О ) { ... }
else if (strstr(a, b) < 0 ) { ... }
else if (strstr(a, b) == 0) { ... }
лучше написать
int is_equal = strstr(a, b);
i f (is_equal > 0) { ... }
else if (is_equal < 0) { ... }
else { ... } . // здесь is_equal == 0
Бессмысленно использовать проверку на неравенство нулю (или, что еще хуже, наравенство true или fаlse.

Если одна из ветвей условного оператора гораздо короче, чем другая, более короткую ветвь if лучше поместить сверху, иначе вся управляющая структура может не поместиться на экране, что затруднит отладку.

В некоторых случаях условная операция лучше условного оператора:

При использовании циклов надо стремиться объединять инициализацию, проверку условия выхода и приращение в одном месте

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

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

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

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

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

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

Комментарии имеют очень важное значение, поскольку программист, как ни странно, чаще читатель, чем писатель. Даже если сопровождающим программистом является автор программы, разбираться через год в плохо документированном тексте — сомнительное удовольствие.

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

Вложенные блоки должны иметь отступ в 3-4 символа, причем блоки одного уровня вложенности должны быть выровнены по вертикали. Желательно, чтобы закрывающая фигурная скобка находилась строго под открывающей или в колонке, соответсвующей уровню вложения.

He следует размещать в одной строке много операторов.

Как и в русском языке, после знаков препинания должны использоваться пробелы.
Онлайн всего: 3
Гостей: 3
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте