Правила программирования на Си и Си++


         

Правила программирования на Си и Си++

Введение
Введение - 2
Процесс проектирования
Сущность программирования: без сюрпризов, минимум сцепления и максимум согласованности
Подавляйте демонов сложности (часть 1)
Решайте конкретную проблему, а не общий случай
Решайте конкретную проблему, а не общий случай - 2
Интерфейс пользователя не должен быть похожим на компьютерную программу (принцип прозрачности)

Интерфейс пользователя не должен быть похожим на компьютерную программу (принцип прозрачности) - 2
Интерфейс пользователя не должен быть похожим на компьютерную программу (принцип прозрачности) - 3
Не путайте легкость в изучении с легкостью в использовании
Производительность может измеряться числом нажатий клавиш
Если вы не можете сказать это по-английски, то вы не сможете выполнить это и на Си/Си++
Если вы не можете сказать это по-английски, то вы не сможете выполнить это и на Си/Си++ - 2
Начинайте с комментариев
Читайте код
В цехе современных программистов нет места примадоннам
Разбивайте сложные проблемы на задачи меньшего размера

Используйте для работы соответствующий инструмент
Проблема должна быть хорошо продумана перед тем, как она сможет быть решена
Компьютерное программирование является индустрией обслуживания
Заказчик всегда прав
Малое — это прекрасно (большое == медленное)
Общие проблемы разработки программ
Прежде всего, не навреди
Нельзя измерять свою производительность числом строк
Вы не можете программировать в изоляции
Пустые потери времени

Пишите программу с учетом сопровождения — вы специалист по сопровождению
Эффективность — часто просто пугало
Форматирование и документация
Программа без комментариев ничего не стоит
Располагайте программу и документацию вместе
Комментарии должны быть предложениями
Пропустите свой исходный тест через систему проверки орфографии
Комментарий не должен подтверждать очевидное
Комментарий должен предоставлять только нужную для сопровождения информацию
Комментарий должен предоставлять только нужную для сопровождения информацию - 2

Комментарий должен предоставлять только нужную для сопровождения информацию - 3
Комментарии должны быть выровнены вертикально
Используйте аккуратные столбцы везде, где можно
Не располагайте комментариев между именем функции и открывающей скобкой
Помечайте конец длинного составного оператора чем-нибудь, имеющим смысл
Располагайте в строке только один оператор
Указывайте имена аргументов в прототипах функций
Используйте "предикатную" форму при разбиении длинных выражений
Подпрограмма должна помещаться на экране
Нужно обеспечивать возможность распечатки всего текста программы

Используйте штриховую линию для зрительного разделения подпрограмм
Пробел — один из наиболее эффективных комментариев
Используйте отступы в четыре пробела
Условные операторы выделяются абзацными отступами
Комментарии должны иметь тот же отступ, что и окружающий текст программы
Выравнивайте скобки вертикально по левой границе
Используйте скобки, если в условном операторе имеется более, чем одна строка
Имена и идентификаторы
Имена должны быть обычными
Не используйте в качестве имен тарабарщину

Имена макросов должны записываться ЗАГЛАВНЫМИ_БУКВАМИ
Не используйте заглавных букв для констант перечисления
Не используйте заглавных букв в именах типов, созданных при помощи typedef
Не пользуйтесь именами из стандарта ANSI Cи
Не пользуйтесь именами Microsoft
Избегайте ненужных идентификаторов
Именованные константы для булевых величин редко необходимы
Именованные константы для булевых величин редко необходимы - 2
Правила обычного программирования
Не путайте привычность с читаемостью

Не путайте привычность с читаемостью - 2
Функция должна делать только одно дело
Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало
Функция должна вызываться более одного раза, но…
Код, используемый более одного раза, должен быть помещен в функцию
Функция должна иметь лишь одну точку выхода
Всегда предусматривайте возврат значения из блока внешнего уровня
Избегайте дублирования усилий
Не захламляйте область глобальных имен
Избегайте глобальных идентификаторов

Никогда не требуйте инициализации глобальной переменной при вызове функции
Делайте локальные переменные
Используйте счетчик экземпляров объектов вместо инициализирующих функций
Если оператор if завершается оператором return, то не используйте else
Помещайте более короткий блок условного оператора if/else первым
Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции
Применяйте указатели на функции Си в качестве селекторов
Избегайте циклов do/while
Никогда не используйте do/while для бесконечного цикла
В цикле со счетчиком его значение должно по возможности уменьшаться

Не делайте одно и то же двумя способами одновременно
Используйте оператор for
То, чего нет в условном выражении, не должно появляться и в других частях оператора for
Допускайте, что ситуация может измениться в худшую сторону
Компьютеры не знают математики
Рассчитывайте на невозможное
Всегда проверяйте коды возврата ошибки
Избегайте явно временных переменных
Не нужно магических чисел
Не делайте предположений о размерах

Не делайте предположений о размерах - 2
Опасайтесь приведения типов (спорные вопросы Си)
Опасайтесь приведения типов (спорные вопросы Си) - 2
Немедленно обрабатывайте особые случаи
Не старайтесь порадовать lint
Помещайте код, динамически распределяющий и освобождающий память, в одном и том же месте
Динамическая память — дорогое удовольствие
Тестовые подпрограммы не должны быть интерактивными
Сообщение об ошибке должно подсказывать пользователю, как ее исправить
Не выводите сообщения об ошибке, если она исправима

Не используйте системно-зависимых функций для сообщений об ошибках
Препроцессор
Все из одного .h файла должно быть использовано в по меньшей мере двух .c файлах
Используйте вложенные директивы #include
Вы должны быть всегда способны заменить макрос функцией
Вы должны быть всегда способны заменить макрос функцией - 2
Вы должны быть всегда способны заменить макрос функцией - 3
Вы должны быть всегда способны заменить макрос функцией - 4
Операция ?: не то же самое, что и оператор if/else
Помещайте тело макроса и его аргументы в круглые скобки

Enum и const лучше, чем макрос
Аргумент параметризированного макроса не должен появляться в правой части более одного раза
Никогда не используйте макросы для символьных констант
Если все альтернативы отпали, то используйте препроцессор
Если все альтернативы отпали, то используйте препроцессор - 2
Правила, относящиеся к языку Си
Подавляйте демонов сложности (часть 2)
Устраняйте беспорядок
Избегайте битовых масок; используйте битовые поля
Не используйте флагов завершения

Рассчитывайте, что ваш читатель знает Си
Не делайте вид, что Си поддерживает булевый тип (#define TRUE)
Для битового поля размером 1 бит должен быть определен тип unsigned
Указатели должны указывать на адрес, больший, чем базовый для массива
Используйте указатели вместо индексов массива
Избегайте goto, за исключением…
Избегайте goto, за исключением… - 2
Правила программирования на Си++
Если проект не ориетирован на объекты, то используйте Си
Если проект не ориетирован на объекты, то используйте Си - 2

Рассчитывайте потратить больше времени на проектирование и меньше на разработку
Библиотеки классов Си++ обычно не могут быть использованы неискушенными пользователями
Пользуйтесь контрольными таблицами
Пользуйтесь контрольными таблицами - 2
Сообщения должны выражать возможности, а не запрашивать информацию
Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную
Вам обычно не удастся переделать имеющуюся структурную программу в объектно-ориентированную - 2
Наследование — это процесс добавления полей данных и методов-членов
Наследование — это процесс добавления полей данных и методов-членов - 2
Наследование — это процесс добавления полей данных и методов-членов - 3

Сначала проектируйте объекты
Затем проектируйте иерархию снизу вверх
Базовые классы должны иметь более одного производного объекта
Си++ — это не Smalltalk: избегайте общего класса object
Си++ — это не Smalltalk: избегайте общего класса object - 2
Си++ — это не Smalltalk: избегайте общего класса object - 3
Си++ — это не Smalltalk: избегайте общего класса object - 4
Си++ — это не Smalltalk: избегайте общего класса object - 5
Инициализируйте виртуальные базовые классы при помощи конструктора, используемого по умолчанию
Используйте закрытые базовые классы лишь когда вы должны обеспечить виртуальные замещения

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


Сетевые средства Java - перейти
Работа в WWW - перейти
Переход к Swing - перейти
JFC: Почему именно так? - перейти
Преобразование XML в HTML на сервере - перейти
Можно создать многострочную кнопку! - перейти

Массивы массивов - перейти
Firewall tunneling - перейти
Семафоры - перейти
Небылицы? - перейти
Help tips в Swing - перейти
Использование нитей в Java - перейти
Минимизирование окна - перейти
Конструктор апплета - перейти
Как заменить кофейную чашку - перейти