Написание исходного кода

Так как KDevelop понимает исходный код проектов, программа может помочь при написании нового кода. Далее приводится обзор некоторых таких возможностей.

Автодополнение

Возможно, автодополнение — это самая полезная возможность при написании нового кода. Рассмотрим, например, такой фрагмент кода:

class Car {
  // ...
  public:
    std::string get_color () const;
};
void foo()
{
  Car my_ride;
  // ...какие-то действия с этой переменной...
  std::string color = my_ride.ge

Так как программа помнит о том, что my_ride в последней строке представляет собой переменную типа Car, она автоматически предложит дополнить имя функции-члена ge как get_color(). Фактически, требуется только продолжать набирать текст, пока не останется только одно совпадение, а затем нажать клавишу «Ввод»:

Обратите внимание, что можно щёлкнуть по подсказке, чтобы увидеть больше сведений о функции, а не только тип данных, которые она возвращает, и то, является ли она открытой:

Автодополнение позволяет сэкономить много времени на наборе текста, когда в проекте используются длинные имена переменных и функций; более того, оно предотвращает опечатки (и возникающие в этой связи ошибки компиляции) и помогает вспоминать точные имена функций. Например, если имена всех функций получения начинаются с get_, то возможность автодополнения представит список вариантов имён этих функций только после ввода первых четырёх символов. Скорее всего, при просмотре этого списка получится вспомнить нужное имя. Обратите внимание, что автодополнение будет работать даже в том случае, если класс Car и переменная my_ride объявлены не в том файле, в котором в данный момент выполняется написание кода. KDevelop просто должно быть известно, что эти классы и переменные связаны, то есть файлы, в которых установлены эти связи, должны быть частью проекта, над которым сейчас ведётся работа.

Примечание

Программе KDevelop не всегда удаётся определить, когда пользователю требуется дополнение кода. Если всплывающая подсказка с вариантами автодополнения не появилась автоматически, воспользуйтесь комбинацией клавиш Ctrl+Пробел для открытия списка вариантов вручную. В целом, для того, чтобы возможность автодополнения работала, KDevelop необходимо выполнять синтаксический анализ файлов исходного кода. После запуска KDevelop выполняет такую обработку всех файлов, которые являются частью проектов текущего сеанса, в фоновом режиме, а также при приостановке набора текста пользователем (длительность паузы можно настроить).

Примечание

KDevelop выполняет обработку только тех файлов, которые являются файлами исходного кода (определяется типом MIME файла). Этот тип задаётся при первом сохранении файла; следовательно, если создать новый файл и начать писать в нём код, обработка этого файла для использования данных в целях автодополнения не будет выполнена. Чтобы она выполнялась, необходимо сохранить файл.

Примечание

Как было сказано ранее, чтобы автодополнение работало, KDevelop необходимо искать объявления в заголовочных файлах. Программа выполняет поиск по ряду стандартных путей. Если заголовочный файл не удастся найти автоматически, соответствующий пункт в списке будет подчёркнут красной линией. Следует щёлкнуть по этому пункту правой кнопкой мыши и явным образом сообщить KDevelop, где следует искать файл и данные, которые в нём хранятся.

Примечание

О настройке автодополнения рассказывается в этом разделе данного руководства.

Добавление новых классов и реализация функций-членов

В KDevelop предусмотрена вспомогательная программа для добавления новых классов. Описание этой процедуры приводится в разделе Создание нового класса. Простой класс C++ можно создать, выбрав соответствующий шаблон в категории Класс. Во вспомогательной программе доступны несколько типовых функций-членов, например пустой конструктор, конструктор копирования и деструктор.

После завершения работы вспомогательной программы файлы будут созданы и открыты в редакторе. В заголовочном файле уже есть защита от повторного включения, а новый класс содержит все выбранные функции-члены. Следующие два шага — задокументировать класс и его функции-члены и реализовать их. Средства документирования классов и функций рассматриваются далее. Чтобы реализовать уже добавленные специальные функции, просто перейдите на вкладку bus.cpp, которая уже содержит каркас функций:

Чтобы добавить новые функции-члены, вернитесь на вкладку bus.h и добавьте имя функции. Например, добавим это:

Обратите внимание, что реализация уже началась. Однако согласно многим стилям программирования функция должна быть реализована не в заголовочном файле, а в соответствующем файле .cpp. Чтобы сделать это, разместите курсор на имени функции и выберите пункт меню КодПереместить в код или воспользуйтесь комбинацией клавиш Ctrl+Alt+S. Код, расположенный в фигурных скобках, будет удалён из заголовочного файла (он будет заменён на точку с запятой, так как необходимо завершить объявление функции) и перемещён в файл исходного кода:

Ввод кода начат. Переменная students должна, вероятно, быть переменной-членом класса Bus, но она ещё не добавлена в этот класс. KDevelop подчёркивает эту переменную, чтобы указать на то, что среде ещё ничего не известно о ней. Эту проблему просто решить; при щелчке по имени переменной появится следующая подсказка:

(Тот же результат можно получить с помощью пункта контекстного меню Решить: Объявить как.) Давайте выберем «3 - private unsigned int» (с помощью мыши или комбинации клавиш Alt+3) и посмотрим, что будет добавлено в заголовочный файл:

Следует учитывать, что KDevelop извлекает тип переменной, которая будет объявлена, из выражения, используемого для её инициализации. Например, если бы добавление было записано следующим неоднозначным образом, программа бы предложила объявить переменную как тип double:

И последнее: при использовании пункта меню КодПереместить в код новая функция-член не всегда появляется там, где это нужно. Например, её может потребоваться отметить маркером inline и поместить в конце заголовочного файла. В таком случае напишите объявление и начните писать объявление этой функции так:

KDevelop автоматически предлагает все возможные варианты дополнения. При выборе одной из двух записей add_students получится следующий код, в котором уже будет полностью заполнен список аргументов:

Примечание

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

Документирование объявлений

Хороший код хорошо документируется как на уровне реализации алгоритмов в функциях, так и на уровне интерфейса — то есть необходимо документировать классы, функции (в том числе функции-члены и глобальные функции) и переменные, чтобы были понятны их назначение, возможные значения аргументов, пред- и постусловия и так далее. В плане документирования интерфейса стандартом де-факто стала программа doxygen; она позволяет форматировать комментарии, которые затем можно извлечь и представить на поддерживающих поиск веб-страницах.

В KDevelop предусмотрена поддержка комментариев в этом формате. Возможно создать структуру из комментариев, документирующих класс или функцию-член. Например, допустим, что уже был написан такой код:

class Car {
  public:
    std::string get_color () const;
};

Теперь нужно добавить документацию как для класса, так и для функции-члена. Чтобы это сделать, переместите курсор на первую строку и выберите пункт меню КодДокументировать объявление или воспользуйтесь комбинацией клавиш Alt+Shift+D. KDevelop сделает следующее:

Курсор уже находится в серой области для ввода краткого описания (после ключевого слова Doxygen @brief) этого класса. Затем к этому комментарию можно продолжить добавлять документацию с более подробным обзором назначения класса:

Пока редактирование выполняется в тексте комментария, он выделяется зелёным цветом (выделение цветом исчезает, когда курсор перемещается за пределы комментария). По достижении конца строки нажмите клавишу «Ввод», и программа KDevelop автоматически добавит новую строку, которая начинается со звёздочки, и поместит в неё курсор с отступом в один символ.

Теперь задокументируем функцию-член. Снова поместите курсор на строке объявления и выберите пункт меню КодДокументировать объявление или воспользуйтесь комбинацией клавиш Alt+Shift+D:

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

В этом примере в предложенном комментарии уже содержатся все поля Doxygen для отдельных параметров.

Переименование переменных, функций и классов

Иногда требуется переименовать функцию, класс или переменную. Например, имеется следующий код:

Затем становится понятно, что имя remove_students не очень удачное и лучше было бы его заменить, скажем, на throw_out_students. Можно воспользоваться возможностью поиска и замены, но возникают две проблемы:

  • Функция может использоваться в нескольких файлах.

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

Обе эти проблемы можно решить, если переместить курсор на одно из вхождений имени функции и выбрать пункт меню КодПереименовать объявление (или щелкнуть по имени правой кнопкой мыши и выбрать в контекстном меню пункт Переименовать Bus::remove_students).

Фрагменты кода

Во многих проектах есть фрагменты, которые часто используются в исходном коде. Например: цикл для всех инструкций (при написании компилятора), проверка корректности введённых пользователем данных и открытие окна с сообщением об ошибке в случае их некорректности (при написании интерфейса пользователя); в проекте автора этих строк это был бы код наподобие

for (typename Triangulation::active_cell_iterator
       cell = triangulation.begin_active();
     cell != triangulation.end(); ++cell)
  ... какие-то действия с ячейкой ...

Чтобы не набирать подобный текст снова и снова (и не допускать сопутствующие опечатки), можно воспользоваться инструментом Фрагменты KDevelop. Откройте панель этого инструмента (обратитесь к разделу Инструменты и представления, если соответствующей кнопки ещё нет по периметру окна). Затем нажмите кнопку «Создать комплект» — она позволяет создать именованный набор фрагментов исходного кода определённого вида (например, набор фрагментов кода C++) — и создайте пустой комплект. После этого нажмите кнопку для добавления фрагмента. Появится такое диалоговое окно:

Примечание

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

Чтобы использовать определённый таким образом фрагмент, при редактировании кода можно просто ввести имя фрагмента так же, как имя любой другой функции или переменной. Это имя будет доступным для автодополнения, поэтому для фрагмента можно спокойно использовать длинное подробное имя (как в примере выше). При принятии варианта дополнения (для этого достаточно нажать клавишу «Ввод») уже введённая часть названия фрагмента будет заменена его полным названием и снабжена надлежащим отступом:

Обратите внимание, что для работы этой возможности не требуется открывать или делать видимой панель Фрагменты: она нужна только для определения новых фрагментов. Ещё один (но менее удобный) способ развернуть фрагмент — просто щёлкнуть по нему на соответствующей панели.

Примечание

Фрагменты предоставляют и многие другие возможности. Полное описание этих возможностей доступно в подробной документации по инструменту «Фрагменты».