Рекомендации по написанию кода в C++ (часть 1)

Вы сталкивались с трудностями в понимании чужого кода? Если — нет, то вам еще рано изучать эту тему, если — да, то эта статья и последующие в этом разделе — для вас. Вы никогда не задумывались над тем, почему чужой код намного сложнее понять, чем свой собственный? Все дело в том, что у каждого программиста есть свой стиль написания кода. Например, кто-то не ставит отступы для выделения области действия, а кто-то наоборот — ставит, но слишком большие. Кто-то, сам того не подозревая, дает магические имена переменным, которые ну никак по смыслу не связаны с их назначением. Многие не используют комментарии в коде, хотя это очень важно. Одни программисты пытаются соблюдать код-стандарты, но не полностью, другие — вообще ничего об этом не слышали и слышать не хотят. В итоге получается макаронный код, в нем сложно распознать даже самый простой алгоритм, в таком коде легко допустить ошибку и, самое главное, его трудно читать.

Вы спросите: «А зачем мне разбираться в чужом коде?» Как минимум для того, чтобы использовать уже запрограммированные алгоритмы, вы не будете тратить время на «изобретение своего велосипеда». Кроме того, если вы работаете над большим проектом и не один, а целой командой, вы просто обязаны понимать чужой код, и конечно же, вы обязаны писать код, который будет понятен другим программистам из вашей команды. Что это дает? Это позволяет экономить кучу времени, вам и вашей команде. Но даже, если вы программируете сами для себя, и никто кроме вас не будет разбираться в вашем коде, вы все равно выигрываете, хотя бы потому, что спустя некоторое время, без использования код-стандартов, вам самим сложно будет разобраться в своем же коде. Переменные, которые вы объявляли неделю назад, станут не понятными, не говоря уже о том, что вы не будете знать, как именно работает программа.

Теперь, когда мы знаем, для чего нужны стандарты кодирования, приступим к их изучению. Существует очень много код-стандартов, у каждого из которых есть свои плюсы и минусы, по этой причине, в разных командах — разные стандарты написания кода, которые действуют в рамках данной команды разработчиков.

Данная статья не претендует на звание — «Код-стандарты С++», скорее, — это просто мои рекомендации по написанию кода в языке С++. Все эти рекомендации я не придумал, они существуют и в книгах и в интернете. Я же просто постараюсь вас хотя бы поверхностно с ними ознакомить:

  1. Всегда используйте IDE для программирования.
    Ушли те времена, когда необходимо было составлять программы в блокнотах и потом вручную собирать написанный код в объектный файл. Друзья, в мире существует очень много классных программ, которые подсвечивают, код, форматирую его и автоматически его собирают в готовую программу. Кроме всего этого, IDE информирует об возможных ошибках, еще до этапа сборки программы, подсвечивают неиспользуемые переменные, а также легко настраиваются под индивидуальные требования программистов. IDE даже может сама писать код, как это удобно реализовано в MVS, например, мы объявляем оператор switch, IDE уже знает об этом и делает это сама, нам же остается только добавить нужные переменные и константы. Все эти полезности реализованы с одной единственной целью — сделать процесс составления программ намного приятнее и намного быстрее. Так пользуйтесь же всем этим!
  2. Пользуйтесь системами контроля версий.
    Если вы работаете над программой долгое время, около недели или больше, не поленитесь создать репозиторий для вашей программы. Зачем это нужно? Когда разработка программы сильно затянулась, то вы уже не всегда сможете вспомнить что и когда добавляли в программный код, откуда взялась та или иная ошибка. Система контроля версий поможет вам ответить на все эти вопросы. В конце концов, если вдруг вы случайно что-то поломаете в программе, система контроля версий всегда сможет восстановить предыдущую, рабочую версию программы. Не поленитесь в этом разобраться, система контроля версий — это очень классная штука.
  3. Размещение фигурных скобок у функций:
    int myFunction()
    {
    }

    Нужно чтобы открывающаяся и закрывающаяся скобки находились в отдельных строках, по своему опыту могу сказать, так четко просматривается область видимости функции, её тело и заголовок.

  4. Отступы должны быть табами.
    Вместо пробелов, отступы лучше проставлять табами, это намного удобнее, в том смысле, что экономит время. Ведь проще нажать один раз — таб, чем несколько раз пробел. Некоторые говорят, что табами проставлять отступы — это не правильно, так как в разных редакторах длинна таба меняется. Соответственно, и отформатированный код будет выглядеть не одинаково. Возможно они и правы, но я не встречал такого, хотя я программировал на многих IDE, табы почти везде одинаковые.
  5. Имена функций должны быть в верблюжьем регистре.
    Следует давать имена функциям в верблюжьем регистре, причем начинаться имя должно всегда с маленькой буквы:

    // Правильно:
    myFunction()
    searchInFile()
    // Неправильно:
    SearchInFile()
    search_in_file()
    myfunction()
    Myfunction()
    MYFUNCTION()

    Вот еще несколько полезных статей: правила именования переменных и соглашения об именовании. Обязательно прочитайте их, в дальнейшем, вам очень помогут эти знания.

  6. Оператор if-else.
    if () {
        // тут код
    } 
    else {
        // и тут код
    }

    Ну во первых, всегда ставьте фигурные скобки, даже если в операторе if нужно выполнить всего одну строку кода. Во вторых, переносите оператор else, на новую строку, хотя, на первый взгляд это может показаться и не удобно. В чем плюс? А плюс в том, что если вдруг вам нужно будет закомментировать или удалить блок кода с оператором else, то вам это будет сделать очень просто. И поверьте, такие ситуации встречаются очень часто.
    Вот запись, как делать не следует:

    if () {
        // тут код
    } else {
        // и тут код
    }

    Оператор else стоит в строке с закрывающейся скобкой тела оператора if. Такая запись кажется намного компактнее и красивее. Но как я уже говорил, когда вам понадобится закомментировать блок кода else, вы случайно закомментируете или удалите и закрывающую скобку предыдущего блока. В результате получите ошибку, которая отберет у вас драгоценное время.
    Такая запись, по моему мнению, также считается не правильной:

    if () 
    {
        // тут код
    } 
    else
    {
        // и тут код
    }

    Она получается излишне большой.

  7. Используйте оператор const как можно чаще.
    Это дает огромное преимущество в отлаживании работы программы. Например, вы написали программу, но она работает не правильно, то есть в код прокралась ошибка, причем эта ошибка связана с изменением значения в переменной, в которой это значение меняться не должно. Вы начинаете просматривать весь код в поисках этой ошибки, на все это уйдет не мало времени. Если бы вы сразу объявили константу а не переменную, то ошибка б ы проявилась еще на этапе компиляции и вам бы не пришлось тратить время на её поиск. Рассмотрим пример:

    #include <iostream>
    using namespace std;
    int main()
    {
        const int august = 8;
        int currentMonth;
        cin >> currentMonth;
        if (august == currentMonth) {
            cout << "Current month - august";
        }
        return 0;
    }

    Это корректный код, он очень простой для понимания. Пользователь вводит номер месяца, если введенный номер равен 8 — август, то выводится сообщение. Обратите внимание, что в операторе if в условии я сравниваю значение константы, ведь август — это всегда 8-й месяц, а значит значение константы  august меняться не должно. Теперь допустим одну маленькую ошибку в операторе if, вот код:

    #include <iostream>
    using namespace std;
    int main()
    {
        const int august = 8;
        int currentMonth;
        cin >> currentMonth;
        if (august = currentMonth) {
            cout << "Current month - august";
        }
        return 0;
    }

    Программа таrже, но уже с маленькой ошибкой в условии. Вместо оператора сравнения там стоит оператор присваивания. И тут нас спасет тот случай, что august — это константа, а константе присваивать ничего нельзя и компилятор об этом знает. То есть на этапе компиляции вылетит ошибка:

    main.cpp:12: error: assignment of read-only variable ‘august’

    Согласитесь, что очень удобно! Теперь сделаем august не константой, вот код:

    #include <iostream>
    using namespace std;
    int main()
    {
        int august = 8;
        int currentMonth;
        cin >> currentMonth;
        if (august = currentMonth) {
            cout << "Current month - august";
        }
        return 0;
    }

    august — обычная переменная. И к вашему удивлению, даже с ошибкой, программа будет собрана и запустится, вот только работать она будет не правильно и вам придется потратить некоторое время чтобы исправить её. Программисты соблюдающие код-стандарт даже допустив эту ошибку быстро её смогут исправить, а те, кто пишет небезопасный код, будут долго искать эту ошибку, особенно в том случае, если у вас сотни строк кода.

На этом пункте решил завершить данную статью, продолжение напишу в следующей статье.

P.S.: Если у вас вдруг перестал работать роутер или вы купили роутер, но не знаете, что с ним делать, вам поможет — настройка роутера вызов мастера. Для тех, кто не знает, что это такое, пройдите по ссылке и вам станет все понятно.

Автор: Marienko L.
Дата: 31.12.2013
Поделиться:

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.