Несколько полезных правил, которых следует придерживаться при разработке программ на C/C++:

  • Советами нужно пользоваться там, где они применимы. Не существует замены здравому смыслу.
  • Не забывайте в конце своих функций добавлять "return выражение", потому что в противном случае функция обязательно выдаст "мусор".
  • Программа на Си - это много "маленьких функций" и процедур, а не мало больших.
  • Разбивайте сложные выражения на более простые.
  • Уменьшайте набор потенциальных зависимостей (в области видимости) до набора реальных.
  • Если в функции используются исключительно комментарии вида "// ...", то при необходимости большие фрагменты кода можно быстро отключить или вернуть при помощи "/* ... */". Но не следует забывать, что препроцессор Си не понимает комментарии вида "// ...".
  • Не полагайтесь на очередность вычисления элементов выражения, если не знаете точно.
  • Базовые типы (char, int, short, long, float, double) имеют разное максимальное значение на разных платформах - всегда проверяйте граничные значения на текущей платформе при помощи констант из файлов <limits.h> и <float.h>.
  • Старайтесь освобождать память в той-же функции, в которой ее выделяете.
  • Если у функции есть аргументы, опишите их, если их нет, используйте слово void. В коде функции перед тем, как использовать аргументы
    1. Проверяйте, получены ли аргументы вообще;
    2. Всегда проверяйте тип и диапазон;
    3. Если что-то не так, то попытайтесь их привести к правильному виду и сообщите о случившимся;
    4. если нет возможности скорректировать аргументы, то должно быть сгенерировано исключение.
  • У внутренних имен в Си значимы только первые 31 символ. Для внешних имен функций и переменных гарантируется уникальность только в пределах первых 6 символов в любом регистре.
  • Макросы почти никогда не требуются в С++.
  • Пользуйтесь "const" или "enum" для определения констант.
  • Используйте "inline" для уменьшения накладных расходов на вызов функций.
  • Применяйте "templat" для для определения семейства функций.
  • Для предотвращения конфликтов имен есть "namespace".
  • Не объявляйте переменную, пока она не потребуется, чтобы тут-же ее инициализировать. Всегда инициализируйте начальным значением все объявленные переменные.
  • Не используйте "malloc" - оператор "new" делает то же самое лучше.
  • Вместо "realloc" используйте "vector".
  • Везде, где только возможно, пользуйтесь средствами стандартной библиотеки вместо возни с указателями и байтами.
  • В большинстве случаев приведение типа означает ошибку на этапе проектирования.
  • Применение стандартных библиотек классов С++ "string" и "vector" поможет упростить программирование и свести к минимуму необходимость использования традиционных для С массивов символов и строк.
  • В начале проектирования программы старайтесь представить ее в виде набора взаимодействующих понятий, реализованных в виде классов и объектов, а не в виде набора структур данных с функциями.
  • Старайтесь, чтобы структура программы отражала ваши идеи:
    1. Отдельные понятия оформляйте в виде классов.
    2. Сущности следует делать объектами классов
    3. Если два класса имеют общий интерфейс, то его следует оформить в виде абстрактного класса.
    4. Если в реализации нескольких классов есть нечто существенно общее, то это лучше реализовать в виде базового класса.
    5. Если класс является контейнером объектов - сделайте из него шаблон.
    6. Если функция реализует алгоритм для контейнера, оформите ее в виде шаблона функции, выполняющего алгоритм для семейства контейнеров.
    7. Если набор классов, шаблонов, данных и т.п. логически связаны, то поместите их в одно пространство имен.
  • Не создавайте в классе "поля типа" - пользуйтесь виртуальными функциями.