|
Программирование >> Структурное программирование
3.22. Поскольку ссылочные параметры упоминаются в теле вызываемой функции только по имени, программист может нечаянно принять ссылочные параметры за параметры, передаваемые по значению. Это может привести к неожиданным эффектам, если исходные копии переменных изменяются вызывающей функцией. 3.23. При объявлении множества ссылок в одном операторе делается неверное предположение, что действие символа амперсанд & распространяется на весь записанный через запятую список имен переменных. Чтобы объявить переменные х, у и z как ссылки на целое число, используйте запись int &х, &у, &z; вместо неправильной записи int& X, у, z; или другой распространенной неправильной записи int &х, у, z; 3.24. В объявлении ссылочной переменной ей не присваивается начальное значение. 3.25. Попытка переприсвоить предварительно объявленную ссылку как псевдоним другой переменной. 3.26. Возвращение указателя или ссылки автоматической переменной в вызываемой функции. 3.27. Определение и попытка использовать аргумент по умолчанию, не являющийся самым правым (последним) аргументом (если одновременно не являются аргументами по умолчанию все более правые аргументы). 3.28. Попытка получить доступ к неглобальной переменной внешнего блока, используя унарную операцию разрешения области действия. 3.29. Создание перегруженных функций с идентичными списками параметров и различными типами возвращаемых значений приводит к синтаксической ошибке. 3.30. Функция с пропущенными аргументами по умолчанию может оказаться вызванной аналогично другой перегруженной функции; это синтаксическая ошибка. 3.31. Отсутствие ключевого слова class перед каждым формальным параметром шаблона функции. 3.32. В сигнатуре функции не используются все формальные параметры шаблона функции. Хороший стиль программирования 3.1. Внимательно изучайте широкий набор функций в стандартной библиотеке ANSI С и классов в различных библиотеках классов. 3.2. При использовании функций математической библиотеки включайте соответствующий заголовочный файл с помощью директивы препроцессора #include <math.h>. 3.3. Размещайте пустую строку между описаниями функций, чтобы отделить функции и облегчить чтение программы. 3.4. Несмотря на то, что пропущенный тип возвращаемого значения по умолчанию int, всегда задавайте тип возвращаемого значения явным образом. Исключением является функция main, для которой тип возвращаемого значения обычно не указывается. 3.5. Не используйте одинаковые имена для аргументов, передаваемых в функцию, и соответствующих параметров в описании функции, хотя это и не является ошибкой. Использование разных имен помогает избежать двусмысленности. 3.6. Выбор осмысленных имен функций и осмысленных имен параметров делает программу более легко читаемой и помогает избежать излишних комментариев. 3.7. Имена параметров могут быть включены в прототипы функции с целью документирования. Компилятор эти имена игнорирует. 3.8. Делайте заглавной первую букву идентификатора, используемого как имя типа, определенного пользователем. 3.9. Используйте в именах констант перечисления только заглавные буквы. Это выделяет константы в тексте программы и напоминает программисту о том, что константы перечисления не являются переменными. 3.10. Использование перечислений вместо целых констант облегчает чтение программы. 3.11. Переменные, используемые только в отдельной функции, предпочтительнее объявлять как локальные переменные этой функции, а не как глобальные переменные. 3.12. Избегайте применения имен переменных, которые незримо уже используются во внешних областях действия. Этого можно достигнуть, вообще избегая использования в программе одинаковых идентификаторов. 3.13. Спецификацию inline целесообразно применять только для небольших и часто используемых функций. 3.14. Использование аргументов по умолчанию может упростить написание вызовов функций. Однако некоторые программисты считают, что для ясности лучше явно указывать все аргументы. 3.15. Избегайте использования в программе переменных с одинаковыми именами для разных целей. Хотя это и допускается в различных случаях, но может приводить к путанице. 3.16. Перегруженные функции, которые выполняют тесно связанные задачи, делают программы более понятными и легко читаемыми. Советы по повышению эффективности 3.1. Автоматический класс памяти - это средство экономии памяти, так как переменные этого класса создаются при входе в блок, в котором они объявлены, и уничтожаются при выходе из блока. Замечания по мобильности 3.1. Использование стандартной библиотеки ANSI С увеличивает мобильность программы. 3.2. Программы, которые зависят от последовательности вычисления операндов операций, отличных от &&, {, последования (,) и ?:, могут по-разному работать в системах с различными компиляторами. 3.3. Роль пустого списка параметров функции в С-Н- существенно отличается от С. В С это означает, что все проверки аргументов отсутствуют (т.е. вызов функции может передать любой аргумент, который требуется). А в С-Ы- пустой список означает отсутствие аргументов. Таким образом, программа на С, использующая эту особенность, может сообщить о синтаксической ошибке при компиляции в С-Ы-. 3.2. Спецификация класса памяти register может быть помещена перед объявлением автоматической переменной, чтобы компилятор сохранял переменную не в памяти, а в одном из высокоскоростных аппаратных регистров компьютера. Если интенсивно используемые переменные, такие как счетчики или суммы могут сохраняться в аппаратных регистрах, накладные расходы на повторную загрузку переменных из памяти в регистр и обратную загрузку результата в память могут быть исключены. 3.3. Часто объявления register не являются необходимыми. Современные оптимизирующие компиляторы способны распознавать часто используемые переменные и решать, помещать их в регистры или нет, не требуя от программиста объявления register. 3.4. Избегайте рекурсивных программ, подобных программе для вычисления чисел Фибоначчи, которые приводят к экспоненциальному нарастанию количества вызовов. 3.5. Избегайте использования рекурсий в случаях, когда требуется высокая эффективность. Рекурсивные вызовы требуют времени и дополнительных затрат памяти. 3.6. Программа, разбитая на множество функций, потенциально требует большего количества вызовов функций по сравнению с монолитной программой без функций. Это увеличивает время выполнения и затраты памяти компьютера. Но монолитные программы трудно программировать, тестировать, отлаживать, сопровождать и развивать. 3.7. Использование функций inline может уменьшить время выполнения программы, но может увеличить ее размер. 3.8. Для передачи больших объектов используйте константный ссылочный параметр, чтобы обеспечить защиту параметров, как при передаче по значению, и в то же время избежать накладных расходов при передаче копии большого объекта.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |