Введення коду

Оскільки KDevelop «розуміє» код ваших проєктів, це середовище може допомогти вам у написанні коду. Нижче наведено огляд деяких з цих допоміжних можливостей.

Автозавершення

Ймовірно, найкориснішою можливістю є можливість з автоматичного завершення фрагментів коду. Розглянемо, наприклад, такий фрагмент коду:

class Car {
  // ...
  public:
    std::string get_color () const;
};
void foo()
{
  Car my_ride;
  // ...якісь дії з цією змінною...
  std::string color = my_ride.ge

У останньому рядку KDevelop запам’ятає, що змінна my_ride належить до типу Car і буде автоматично пропонувати доповнення назви вбудованої функції ge у форматі get_color. Фактично, вам достатньо вводити назву, аж доки список знайдених відповідників не починатиметься з потрібного вам виразу, а потім натиснути клавішу Enter:

Зауважте, що ви можете клацнути на панелі підказки, щоб отримати більше даних щодо функції, окрім типу даних, які вона повертає, і те, чи є ця функція відкритою (public):

Автоматичне доповнення може значно скоротити витрату часу на введення даних, якщо у вашому проєкті використано змінні або функції з довгими назвами. Крім того, автоматичне доповнення допомагає запобігти друкарським помилкам у назвах (а отже помилкам під час збирання), за його допомогою простіше запам’ятати точні назви функцій. Наприклад, якщо назви всіх ваших функцій отримання даних починаються з get_, можливість автоматичного доповнення надасть вам змогу скористатися повним списком таких функцій, щойно ви наберете перші чотири літери назви, що, звичайно, допоможе вам згадати, яку з них ви мали намір використати. Зауважте, що для роботи з автоматичним доповненням не обов’язково, щоб оголошення класу Car та змінної my_ride перебували у одному файлі, над яким ви зараз працюєте. KDevelop просто має знати, що ці клас і змінну пов’язано, тобто файли, у яких зберігається код цих елементів програми, мають бути частиною проєкту, над яким ви працюєте.

Примітка

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

Примітка

KDevelop виконує обробку лише тих файлів, які є файлами коду програми, відповідно до типу MIME файла. Цей тип не встановлюється до першого збереження файла. Отже створення нового файла і введення коду до цього файла не увімкне автоматичної обробки файла для використання даних з метою автоматичного доповнення. Щоб увімкнути обробку, файл доведеться зберегти.

Примітка

Для того, щоб можна було скористатися автоматичним доповненням, KDevelop повинен мати доступ до файлів заголовків. Середовище виконає пошук цих файлів у декількох типових теках. Якщо файл заголовка не вдасться знайти автоматично, його пункт у списку буде підкреслено червоною лінією. У такому разі вам слід клацнути на цьому пункті правою кнопкою миші і повідомити KDevelop явним чином, де слід шукати цей файл та дані, які у ньому зберігаються.

Примітка

Налаштування автоматичного доповнення обговорено у іншому розділі цього підручника.

Додавання нових класів та реалізація вкладених функцій

У KDevelop передбачено допоміжну програму для додавання нових класів. Її роботу описано у розділі Створення класу. Простий клас C++ можна створити за допомогою основного шаблону 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) цього класу. Тепер ви можете продовжити додавати документацію до цього коментаря, який краще пояснюватиме призначення класу:

Доки редагування відбуватиметься у коментарі текст коментаря буде позначено зеленим кольором (колір буде знято, щойно ви виведете курсор за межі коментаря). Коли ви наприкінці рядка натиснете клавішу Enter, 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)
  ... якісь дії над cell ...

Замість введення таких фрагментів тексту раз за разом, що може призвести до супутніх друкарських помилок ви можете скористатися інструментом Фрагменти KDevelop. Для цього відкрийте панель інструментів (див. розділ Інструменти і панелі перегляду, якщо відповідної кнопки ще немає на панелях навколо панелі редагування). Натисніть кнопку Додати сховище (трохи невдала назва: за допомогою цієї кнопки ви можете створити іменовану збірку фрагментів коду певного типу, наприклад, фрагментів коду C++) і створіть порожнє сховище. Потім натисніть кнопку , щоб додати фрагмент і відкрити таке діалогове вікно:

Примітка

У назві фрагмента не повинно бути пробілів та інших спеціальних символів, оскільки такий фрагмент повинен мати назву, подібну до назви звичайної функції або змінної (причини цього викладено нижче).

Щоб скористатися таким чином визначеним фрагментом, вам слід просто почати вводити у коді його назву, як ви це робите для будь-яких інших функцій або змінних. Для введених літер буде відкрито панель автоматичного доповнення (це означає, що можна використовувати будь-які достатньо довгі для розрізнення назви фрагментів, зокрема назви, подібні до використаної нами), якщо ви виберете відповідний пункт фрагмента на панелі підказки автоматичного доповнення (наприклад, натисканням клавіші Enter), вже введену частину назви фрагмента буде замінено повним текстом фрагмента з відповідними відступами:

Зауважте, що для користування фрагментами не потрібно тримати відкритою і видимою панель інструмента Фрагменти: цією панеллю слід користуватися, лише для визначення нових фрагментів. Іншим, але менш зручним, способом перегляду фрагментів є просте натискання його пункту на відповідній панелі інструмента.

Примітка

Фрагменти є набагато потужнішими, ніж було пояснено. Повний опис можливостей, які вони надають, ознайомтеся з докладною документацією з інструмента «Фрагменти».