Стандарты программирования на С++. 101 правило и рекомендация | страница 40
>int speedupFactor = condition ? 2 : -1;
Варианты, отмеченные как лучшие, не имеют промежутка между определением и инициализацией.
Пример 2. Замена сложных вычислений вызовом функции. Иногда вычисление значения происходит таким образом, что лучше инкапсулировать его в функции (см. рекомендацию 11).
>// Не рекомендуется: не инициализирует переменную
>int speedupFactor;
>if (condition) {
> // ... код ...
> speedupFactor = somevalue;
>} else {
> // ... код ...
> speedupFactor = someothervalue;
>}
>// Лучше: инициализирует переменную
>int speedupFactor = ComputeSpeedupFactor();
Пример 3. Инициализация массивов. Для больших составных типов, таких как массивы, корректная инициализация не всегда означает реальное обращение к данным. Пусть, например, вы используете API, который заставляет вас использовать фиксированные массивы char размера >МАХ_РАТН
(см. рекомендации 77 и 78). Если вы уверены, что массивы всегда будут рассматриваться как строки в стиле С с завершающим нулевым символом, то такого немедленного присваивания будет достаточно:
>// Допустимо: Создание пустой строки
>char path[MAX_PATH];
>path[0] = '\0';
Более безопасная инициализация заполняет все элементы массива нулевыми значениями:
>// Лучше: заполняем нулями весь массив
>char path[MAX_PATH] = { '\0' };
Рекомендованы оба варианта, но в общем случае вы должны предпочитать безопасность излишней эффективности.
Входные буферы и данные, описанные как >volatile
, которые записываются непосредственно аппаратным обеспечением или другими процессами, не требуют инициализации программой.
[Dewhurst03] §48 • [Stroustrup00] §4.9.5, §6.3
20. Избегайте длинных функций и глубокой вложенности
Краткость — сестра таланта. Чересчур длинные функции и чрезмерно вложенные блоки кода зачастую препятствуют реализации принципа "одна функция — одна задача" (см. рекомендацию 5), и обычно эта проблема решается лучшим разделением задачи на отдельные части.
Каждая функция должна представлять собой связную единицу работы, несущую значимое имя (см. рекомендацию 5 и обсуждение рекомендации 70). Когда функция вместо этого пытается объединить малые концептуальные элементы такого рода в одном большом теле функции, это приводит к тому, что она начинает делать слишком многое.
Чрезмерно большая по размеру функция и чрезмерная вложенность блоков (например, блоков >if
, >for
, >while
и >try
) делают функции более трудными для понимания и сопровождения, причем зачастую без каких бы то ни было оснований.