Программирование



|
66. Компьютеры не знают математики.
66. Компьютеры не знают математики. Компьютеры - это арифметические инструменты, славные счетные машины. Они не знают математики. Поэтому даже такие простые выражения, как следующее, могут...
65. Допускайте, что ситуация может измениться в худшую сторону.
65. Допускайте, что ситуация может измениться в худшую сторону. Одним из лучших примеров этой проблемы связан со знаковым расширением . Большинство компьютеров используют так называемую...
64. То, чего нет в условном выражении, не должно появляться и в других частях оператора for.
64. То, чего нет в условном выражении, не должно появляться и в других частях оператора for . Так как оператор for предназначен для того, чтобы собрать инициализирующую, условную и...
63. Используйте оператор for, если имеются любые два из инициализурующего, условного или инкрементирующего выражений.
63. Используйте оператор for , если имеются любые два из инициализурующего, условного или инкрементирующего выражений. Иначе используйте while. Такой код: int x = 10; // далее следует 200 строк...
62. Не делайте одно и то же двумя способами одновременно.
62. Не делайте одно и то же двумя способами одновременно. В качестве контрапункта к предыдущему правилу рассмотрим следующий фрагмент (содержащий в себе ошибку): int array[ARRAY_SIZE]; int *p =...
61. В цикле со счетчиком его значение должно по возможности уменьшаться.
61. В цикле со счетчиком его значение должно по возможности уменьшаться. Циклы являются одним из тех мест, где малое повышение эффективности значительно улучшает выполнение программы, потому...
60.1. Никогда не используйте do/while для бесконечного цикла.
60.1. Никогда не используйте do/while для бесконечного цикла. Код, похожий на следующий: do { // здесь следует несколько страниц кода while ( 1 ); просто заставляет сопровождающего программиста...
60. Избегайте циклов do/while.
60. Избегайте циклов do/while . Цикл do/while опасен в принципе, так как вы обязательно выполняете его тело хотя бы один раз. Следовательно, вы должны проверить условия завершения до входа в...
59. Применяйте указатели на функции С в качестве селекторов.
59. Применяйте указатели на функции С в качестве селекторов. Это правило строго для программистов на С. (Программирующие на С++ должны использовать виртуальные функции). В С заменяйте подобный...
58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции.
58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции. Неинициализированные переменные - по сути ошибки, ждущие своего часа. Вы всегда должны инициализировать переменную при ее...
57. Помещайте более короткий блок условного оператора if/else первым.
57. Помещайте более короткий блок условного оператора if/else первым. Часто бывает, что у оператора if/else одно предложение (или внутренний блок) короткое (обычно оператор для обработки...
56.4. Если оператор if завершается оператором return, то не используйте else.
56.4. Если оператор if завершается оператором return , то не используйте else . Вместо: if ( условие ) return xxx; else { делать_массу_вещей(); } обычно лучше записать: if ( условие ) return...
56.3. Используйте счетчик экземпляров объектов вместо инициализирующих функций.
56.3. Используйте счетчик экземпляров объектов вместо инициализирующих функций . Инициализирующие функции, с очевидным исключением в виде конструкторов С++, не должны использоваться просто...
56.2.1. Делайте локальные переменные статическими в рекурсивных функциях, если их значения не участвуют в рекурсивном вызове.
56.2.1. Делайте локальные переменные статическими в рекурсивных функциях, если их значения не участвуют в рекурсивном вызове. Так как мы занялись темой рекурсии, то вот правило, которое...
56.2. Никогда не требуйте инициализации глобальной переменной при вызове функции.
56.2. Никогда не требуйте инициализации глобальной переменной при вызове функции. Вот одна ситуация, где оправданы статические глобальные переменные: если у вас применяется система рекурсивных...
56.1. Избегайте глобальных идентификаторов.
56.1. Избегайте глобальных идентификаторов. Раскрывая немного предыдущее правило, положим, что две функции связаны посредством глобальной переменной, если одна из них устанавливает эту...
56. Не портьте область глобальных имен.
56. Не портьте область глобальных имен. Порча области глобальных имен является характерной проблемой в среде групповой разработки. Вам не очень понравится спрашивать разрешение от каждого...
55. Избегайте дублирования усилий.
55. Избегайте дублирования усилий. Следующий фрагмент демонстрирует эту проблему: if ( strcmp(a, b) < 0 ) { } else if ( strcmp(a, b) > 0 ) { } else if ( strcmp(a, b) == 0 ) { } Вызов...
54.1. Всегда предусматривайте возврат значения из блока внешнего уровня.
54.1. Всегда предусматривайте возврат значения из блока внешнего уровня. Иногда, когда подпрограммы короткие, не стоит стараться обеспечить единственную точку выхода. (По моему мнению, правило...
54. Функция должна иметь лишь одну точку входа.
54. Функция должна иметь лишь одну точку входа. Это правило применимо лишь к программам на С. Вообще, множество переходов goto к одной точке выхода лучше, чем много операторов return. Этим...
53.1. Код, используемый более одного раза, должен быть помещен в функцию.
53.1. Код, используемый более одного раза, должен быть помещен в функцию. Это правило является обратной стороной предыдущего. Если вы обнаруживаете почти идентичный код появляющимся более чем в...
53. Функция должна вызываться более одного раза, но...
53. Функция должна вызываться более одного раза, но... Кроме того, если функция должным образом связана (т.е. если она выполняет единственную операцию и весь код функции работает на ее...
52. Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало.
52. Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало. Основной смысл использования таких абстракций, как функции или символьные константы (или...
51. Функция должна делать только одно дело.
51. Функция должна делать только одно дело. Это обычно не очень удачная мысль - записывать то, что должна делать функция, через ее аргументы. Это должно делать имя функции. Например:...
50. Не путайте привычность с читаемостью.
50. Не путайте привычность с читаемостью. (Или синдром настоящего программиста, который может программировать на любом языке как на ФОРТРАНе ). Многие люди пытаются злоупотреблять...
Глава 5. Правила обычного программирования
Глава 5. Правила обычного программирования Эта часть содержит правила, относящиеся к написанию собственно исходного текста программы, в отличие от предыдущей части, в которой рассматривалась...
49. Именованные константы для булевых величин редко необходимы.
49. Именованные константы для булевых величин редко необходимы. Выбор неверного имени может добавить значительную ненужную сложность в вашу программу. Рассмотрим следующую простейшую функцию,...
48. Избегайте ненужных идентификаторов.
48. Избегайте ненужных идентификаторов. Имена для констант часто вообще не нужны. Например, не определяйте значения, возвращаемые при ошибке; если возвращается всего одна ошибка, возвратите...
47. Избегайте области имен Microsoft.
47. Избегайте области имен Microsoft. Это может показаться правилом, специфичным только для Microsoft, но на самом деле это не так (учитывая имеющуюся склонность Microsoft к мировому...
46. Избегайте области имен стандарта ANSI C.
46. Избегайте области имен стандарта ANSI C. Идентификаторы, начинающиеся с символа подчеркивания, и имена типов, оканчивающиеся на _t, были зарезервированы стандартом ANSI C для использования...
45.2. Не используйте заглавных букв в именах типов, созданных при помощи typedef.
45.2. Не используйте заглавных букв в именах типов, созданных при помощи typedef. Так как макрос также может использоваться в манере, подобной typedef, то полезно знать может или нет что-то...
45.1. Не используйте заглавных букв для констант перечисления.
45.1. Не используйте заглавных букв для констант перечисления. Должна быть обеспечена возможность замены констант, определенных в перечислении, на переменную типа const. Если ее имя записано...
45. Имена макросов должны записываться ЗАГЛАВНЫМИ_БУКВАМИ.
45. Имена макросов должны записываться ЗАГЛАВНЫМИ_БУКВАМИ. Как показывается в последующих разделах, макросы часто вызывают побочные эффекты. Поэтому полезно иметь возможность определить с...
44.1. Не используйте в качестве имен тарабарщину.
44.1. Не используйте в качестве имен тарабарщину. Отличный образец такого подхода можно наблюдать в любом предлагаемом Microsoft примере программы, хотя эта проблема ни в коем случае не...
44. Имена должны быть обычными словами английского языка, описывающими то, что делает функция, аргумент или переменная.
44. Имена должны быть обычными словами английского языка, описывающими то, что делает функция, аргумент или переменная. Избегайте аббревиатур; они ухудшают читабельность программ. Некоторые по...
Глава 4. Имена и идентификаторы
Глава 4. Имена и идентификаторы Имена играют важную роль. Правильно выбранные имена могут сделать программу поистине самодокументированной, не требуя совсем или требуя мало дополнительного...
43. Используйте скобки, если в условном операторе имеется более, чем одна строка.
43. Используйте скобки, если в условном операторе имеется более, чем одна строка. Это правило применяется, если даже дополнительными строками является комментарий. Проблема заключается в том,...
40. Используйте отступы в четыре пробела.
40. Используйте отступы в четыре пробела. Никлас Вирт, который изобрел языки Паскаль и Модула-2, однажды выпустил книгу, где всюду использовались отступы в один символ. Чтение листингов из нее...
39. Пробел - один из наиболее эффективных комментариев.
39. Пробел - один из наиболее эффективных комментариев. Это кажется мелочью, но это может чрезвычайно улучшить читаемость вашей программы. Обратите внимание, как используются пробелы в этой...
38. Используйте штриховую линию для зрительного разделения подпрограмм.
38. Используйте штриховую линию для зрительного разделения подпрограмм. Я всегда ставлю такой комментарий: //--------------------------------------------------------- над каждым определением...
35. Используйте "предикатную" форму при разбиении длинных выражений.
35. Используйте предикатную форму при разбиении длинных выражений. Предикатом в английском языке называется вторая половина предложения - глагол и дополнение, над которым глагол выполняет...
34. Указывайте имена аргументов в прототипах функций.
34. Указывайте имена аргументов в прототипах функций. Это особенно важно в определениях классов. Страницы руководств (и встроенных систем помощи) для программы, над которой вы старательно...
32. Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл.
32. Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл. Прежде всего, подобные комментарии в конце блока: while ( a < b ) { for ( i = 10; --1 >= 0; ) { f( i ); } //...
31. Не располагайте комментариев между именем функции и открывающей скобкой.
31. Не располагайте комментариев между именем функции и открывающей скобкой. Основная сложность в следующем примере: foo( int x ) /* Не помещайте * комментарий */ здесь. { //... } заключается в...
30. Используйте аккуратные столбцы везде, где можно.
30. Используйте аккуратные столбцы везде, где можно. Так как форматирование по сути является видом комментирования, то это правило применяйте также и к тексту программы. Два следующих блока...
29. Комментарии должны быть выровнены вертикально.
29. Комментарии должны быть выровнены вертикально. Выравнивайте начало и конец комментария вертикально в многострочных комментариях. /* Первая строка, * вторая строка, * третья строка. */ Если...
28. Комментарии должны быть в блоках.
28. Комментарии должны быть в блоках. Комментарии в общем воспринимаются лучше, когда помещаются в многострочных блоках, которые чередуются с блоками текста программы. Для этого комментарий...
26. Комментарий не должен подтверждать очевидное.
26. Комментарий не должен подтверждать очевидное. Начинающие программировать на С склонны попадать в эту ловушку. Избегайте явно нелепых случаев типа: ++x; // увеличить x но мне также не...
8. Разлагайте сложные проблемы на задачи меньшего размера.
8. Разлагайте сложные проблемы на задачи меньшего размера. На самом деле это также правило и литературного стиля. Если концепцию слишком сложно объяснить за один раз, то разбейте ее на меньшие...
42. Выравнивайте скобки вертикально по левой границе.
42. Выравнивайте скобки вертикально по левой границе. Иногда поиск отсутствующей фигурной скобки превращается в крупную проблему. Если вы вынесете скобки туда, где их хорошо видно, то их...