KDevelop5/Manual/Code generation with templates/uk: Difference between revisions

From KDE Wiki Sandbox
No edit summary
(Created page with "Запускання збирання, виконуваного файла і тестів формує командний рядок дещо інакше. Тести поє...")
 
(29 intermediate revisions by 2 users not shown)
Line 8: Line 8:
=== Створення класу ===
=== Створення класу ===


<div class="mw-translate-fuzzy">
Найпоширенішим випадком використання створення коду за шаблоном є, ймовірно, написання нового класу. Щоб створити новий клас у вже створеному проекті, наведіть вказівник миші на теку проекту, клацніть правою кнопкою миші і виберіть у контекстному меню пункт <menuchoice>Створити з шаблона</menuchoice>. Те саме діалогове вікно може бути відкрито за допомогою меню, пункту <menuchoice>Файл -> Створити з шаблона</menuchoice>, але використання теки проекту має перевагу встановлення базової адреси для вихідних файлів. Виберіть <tt>C++</tt> на панелі вибору ''Мова'', бажану ''Бібліотеку'' і ''Шаблон'' на двох інших панелях. У нижній частині вікна розташовано панель ''Перегляд'', де програма покаже вам файли, які нею створено і дозволить вам здійснювати навігацію файлами. Після того, як виберете усі параметри, вам слід вказати подробиці щодо нового класу у вікні ''Основи класу'' після натискання кнопки <menuchoice> Далі</menuchoice>.
Найпоширенішим випадком використання створення коду за шаблоном є, ймовірно, написання нового класу. Щоб створити новий клас у вже створеному проекті, наведіть вказівник миші на теку проекту, клацніть правою кнопкою миші і виберіть у контекстному меню пункт <menuchoice>Створити з шаблона</menuchoice>. Те саме діалогове вікно може бути відкрито за допомогою меню, пункту <menuchoice>Файл -> Створити з шаблона</menuchoice>, але використання теки проекту має перевагу встановлення базової адреси для вихідних файлів. Виберіть <tt>Клас</tt> на панелі вибору категорії, бажану мову програмування та шаблон. Після вибору шаблона класу вам слід вказати інші характеристики нового класу.
</div>  


[[Image:kdevelop-template-selection.png|thumb|500px|center]]
[[File:Kdevelop-new-from-template.png|500px|thumb|center]]


<div class="mw-translate-fuzzy">
Спочатку слід вказати ідентифікатор нового класу. Це може бути проста назва (наприклад <code>Bus</code>) або повний ідентифікатор у просторі назв (наприклад <code>Transportation::Bus</code>). У останньому випадку '''KDevelop''' виконає обробку ідентифікатора і відповідним чином відокремить простір назв від назви класу. За допомогою цієї самої сторінки ви можете додати основні класи для нового класу. Ви можете зауважити, що у деяких шаблонах уже передбачено вибір основних класів. Ви можете просто вилучити зайві і/або додати інші основні класи. Тут вам слід вказати інструкцію наслідування повністю. Звичайно ж, така інструкція залежить від вибраної мови програмування, це буде <code>public QObject</code> для C++, <code>extends SomeClass</code> для PHP або просто назва класу для Python.  
Спочатку слід вказати ідентифікатор нового класу. Це може бути проста назва (наприклад <code>Bus</code>) або повний ідентифікатор у просторі назв (наприклад <code>Transportation::Bus</code>). У останньому випадку '''KDevelop''' виконає обробку ідентифікатора і відповідним чином відокремить простір назв від назви класу. За допомогою цієї самої сторінки ви можете додати основні класи для нового класу. Ви можете зауважити, що у деяких шаблонах уже передбачено вибір основних класів. Ви можете просто вилучити зайві і/або додати інші основні класи. Тут вам слід вказати інструкцію наслідування повністю. Звичайно ж, така інструкція залежить від вибраної мови програмування, це буде <code>public QObject</code> для C++, <code>extends SomeClass</code> для PHP або просто назва класу для Python.
</div>


<div class="mw-translate-fuzzy">
[[File:Kdevelop-class-basics1.png|500px|thumb|center]]
[[Image:kdevelop-template-inheritance.png|thumb|500px|center]]
</div>


<div class="mw-translate-fuzzy">
За допомогою наступної сторінки ви можете вибрати віртуальні методи з успадкованих класів, а також типові конструктори, деструктори і оператори. Реалізувати метод у новому класі можна простим позначенням пунктів з підписами методів.
За допомогою наступної сторінки ви можете вибрати віртуальні методи з успадкованих класів, а також типові конструктори, деструктори і оператори. Реалізувати метод у новому класі можна простим позначенням пунктів з підписами методів.
</div>


<div class="mw-translate-fuzzy">
Після натискання кнопки <menuchoice>Далі</menuchoice> буде показано сторінку, за допомогою якої ви можете додати до класу методи. Залежно від вибраного шаблона, методи може бути реалізовано у новому класі як змінні-елементи або може бути створено властивості з функціями встановлення та отримання значень. У мовах, де типи змінних слід оголошувати, зокрема у C++, вам слід вказати одразу тип і назву елемента, наприклад <code>int number</code> або <code>QString name</code>. У інших мовах можна не вказувати тип, але все ж варто його визначити, оскільки таке визначення може бути корисним для подальшої роботи з шаблоном. Крім того, ви можете перевпорядкувати учасників класу, позначивши відповідний пункт із наступним натисканням кнопки <menuchoice>Пересунути вище</menuchoice> або <menuchoice>Пересунути нижче</menuchoice>. Вибраний порядок буде використано під час створення файла початкового коду.
Після натискання кнопки <menuchoice>Далі</menuchoice> буде показано сторінку, за допомогою якої ви можете додати до класу методи. Залежно від вибраного шаблона, методи може бути реалізовано у новому класі як змінні-елементи або може бути створено властивості з функціями встановлення та отримання значень. У мовах, де типи змінних слід оголошувати, зокрема у C++, вам слід вказати одразу тип і назву елемента, наприклад <code>int number</code> або <code>QString name</code>. У інших мовах можна не вказувати тип, але все ж варто його визначити, оскільки таке визначення може бути корисним для подальшої роботи з шаблоном.
</div>


<div class="mw-translate-fuzzy">
[[File:Kdevelop-class-members-template.png|500px|thumb|center]]
[[Image:kdevelop-template-members.png|thumb|500px|center]]
</div>


<div class="mw-translate-fuzzy">
За допомогою наступних сторінок ви зможете вибрати умови ліцензування вашого нового класу, встановити нетипові параметри, характерні для вибраного шаблона, та налаштувати місце зберігання виведених даних для всіх створених програмою файлів. Натискання кнопки <menuchoice>Завершити</menuchoice> призведе до завершення роботи допоміжної програми і створення нового класу. Створені допоміжною програмою файли буде одразу відкрито у вікні редактора, отже ви зможете негайно перейти до додавання потрібного коду.
За допомогою наступних сторінок ви зможете вибрати умови ліцензування вашого нового класу, встановити нетипові параметри, характерні для вибраного шаблона, та налаштувати місце зберігання виведених даних для всіх створених програмою файлів. Натискання кнопки <menuchoice>Завершити</menuchoice> призведе до завершення роботи допоміжної програми і створення нового класу. Створені допоміжною програмою файли буде одразу відкрито у вікні редактора, отже ви зможете негайно перейти до додавання потрібного коду.
</div>


[[File:Kdevelop-class-gen-license-choices.png|400px|thumb|center]]
[[File:Kdevelop-class-gen-license-choices.png|400px|thumb|center]]
Line 42: Line 28:
Після створення класу C++ програма запропонує вам додати клас до певної цілі у проекті. Виберіть у діалоговому вікні відповідну ціль або закрийте діалогове вікно і додайте файли до цілі вручну.  
Після створення класу C++ програма запропонує вам додати клас до певної цілі у проекті. Виберіть у діалоговому вікні відповідну ціль або закрийте діалогове вікно і додайте файли до цілі вручну.  


Якщо ви вибрали шаблон <tt>Об’єкт Qt</tt>, вибрали певні типові методи та додали дві змінні-елемента, результат має виглядати так, як це зображено нижче.  
Якщо ви вибрали шаблон <tt>Підклас Qt</tt>, вибрали певні типові методи та додали дві змінні-елемента, результат має виглядати так, як це зображено нижче. Усі автоматично додані заголовки із документацією для кожного з класів, функцій і записів даних було вилучено для ясності викладу.  


[[Image:kdevelop-template-result.png|thumb|500px|center]]
[[File:Kdevelop-after-class-generation-lessdoc.png|500px|thumb|center]]


Як можна бачити, дані-елементи перетворено на властивості Qt з функціями доступу та макросами Q_PROPERTY. Крім того, аргументи функцій встановлення передано з посиланнями на сталі там, де це потрібно. Крім того, оголошено закритий клас (private) та створено закритий вказівник з Q_DECLARE_PRIVATE. Все це зроблено відповідним шаблоном. Вибір іншого шаблона на першому кроці може призвести до зовсім іншого результату.  
Як можна бачити, дані-елементи перетворено на властивості Qt з функціями доступу та макросами Q_PROPERTY. Крім того, аргументи функцій встановлення передано з посиланнями на сталі там, де це потрібно. Якщо вами буде вибрано <tt>підклас pimpl QObject</tt>, буде оголошено закритий клас (private) та створено закритий вказівник з Q_DECLARE_PRIVATE. Все це зроблено відповідним шаблоном. Вибір іншого шаблона на першому кроці може призвести до зовсім іншого результату.  
<span id="Creating a new unit test"></span>
<span id="Creating a new unit test"></span>
=== Створення тесту модуля ===
=== Створення тесту модуля ===


<div class="mw-translate-fuzzy">
Хоча у більшості комплексів для тестування кожен з тестів має бути окремим класом, у '''KDevelop''' передбачено метод спрощення створення тестів для модулів програми. Щоб створити новий тест, наведіть вказівник миші на теку проекту, клацніть правою кнопкою миші і виберіть у контекстному меню пункт <menuchoice>Створити з шаблона</menuchoice>. На сторінці <tt>Мова і шаблон</tt> виберіть мову програмування, вашу бібліотеку і шаблон, а потім натисніть кнопку <menuchoice>Далі</menuchoice>.
Хоча у більшості комплексів для тестування кожен з тестів має бути окремим класом, у '''KDevelop''' передбачено метод спрощення створення тестів для модулів програми. Щоб створити новий тест, наведіть вказівник миші на теку проекту, клацніть правою кнопкою миші і виберіть у контекстному меню пункт <menuchoice>Створити з шаблона</menuchoice>. На сторінці вибору шаблона у полі категорії виберіть <tt>Перевірка</tt>, потім виберіть мову програмування і шаблона та натисніть кнопку <menuchoice>Далі</menuchoice>.
</div>


Вас попросять ввести назву перевірки і список варіантів перевірки. Для варіантів вам слід вказати список назв. У деяких комплексах для тестування модулів, зокрема PyUnit і PHPUnit, слід назви варіантів перевірки мають починатися з особливого префікса. У '''KDevelop''' за додавання префіксів відповідає шаблон, отже вам не потрібно вказувати префікс для варіантів. Після натискання кнопки <menuchoice>Далі</menuchoice> вкажіть умови ліцензування і розташування файлів виведених даних. '''KDevelop''' виконає решту роботи у автоматичному режимі.  
[[File:Kdevelop-test-selection.png|500px|thumb|center]]


Створені таким чином тести модулів не буде автоматично додано до жодної з цілей проекту. Якщо ви користуєтеся CTest або якимось іншим комплексом для тестування, не забудьте додати нові файли до цілі. У KDevelop передбачено [[KDevelop5/Manual/Tool_list/Unit_Tests|набір інструментів тестування модулів]], який інтегрується із CTest.  
Вас попросять ввести назву перевірки і список варіантів перевірки. Для варіантів вам слід вказати список назв. У деяких комплексах для тестування модулів, зокрема PyUnit і PHPUnit, слід назви варіантів перевірки мають починатися з особливого префікса. У '''KDevelop''' за додавання префіксів відповідає шаблон, отже вам не потрібно вказувати префікс для варіантів. Після натискання кнопки <menuchoice>Далі</menuchoice> вкажіть умови ліцензування і розташування файлів виведених даних. '''KDevelop''' виконає решту роботи у автоматичному режимі.
 
[[File:Kdevelop-testcases.png|500px|thumb|center]]
 
Додавання модулів перевірки та файла <tt>CMakeLists.txt</tt> для додавання модулів перевірки до проєкту Bus дасть вказаний нижче файл <tt>CMakeLists.txt</tt> для проєкту Bus, теки src та теки tests:
* Проєкт Bus:<syntaxhighlight lang="CMake" line>cmake_minimum_required(VERSION 3.0)
 
project(Bus LANGUAGES CXX)
 
set(QT_REQUIRED_VERSION "5.14.0")
find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Core Test)
 
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
 
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
# Документація доступна, лише якщо це основна програма
find_package(Doxygen)
if(Doxygen_FOUND)
add_subdirectory(docs)
else()
message(STATUS "Doxygen not found, not building docs")
endif()
 
add_subdirectory(src)
 
enable_testing()
add_subdirectory(tests)</syntaxhighlight>
 
* Тека src:<syntaxhighlight lang="CMake" line>set(HEADER_LIST "bus.h")
add_executable(bus main.cpp bus.cpp)
 
target_link_libraries(bus PRIVATE Qt5::Core)
</syntaxhighlight>
 
* tests folder:<syntaxhighlight lang="CMake" line>include_directories("../src")
 
add_executable(TestBus testbus.cpp ../src/bus.cpp)
 
add_test(NAME TestBus COMMAND TestBus)
 
target_link_libraries(TestBus PRIVATE Qt5::Test) </syntaxhighlight>
 
У файлі <tt>testbus.h</tt> ви побачите комплекти тестових даних, які було визначено під час додавання кроків послідовності тестування, префікс тесту було додано шаблоном:
 
<syntaxhighlight lang="cpp" line>class TestBus: public QObject
{
    Q_OBJECT
 
// кожен приватний слот є тестом
private slots:
    // -- тести для виконання на слотах --
    void testNumberOfPassengers();
    void testNameOfDriver();
    // -- тести для виконання на сигналах --
    void testNumberOfPassengersChanged();
    void testNameOfDriverChanged();
private:
    Transportation::Bus m_bus;
};</syntaxhighlight>
 
Повні функції у testbus.cpp у деталях наведено нижче:
 
* testNumberOfPassengers<syntaxhighlight lang="cpp" line>void TestBus::testNumberOfPassengers()
{
    m_bus.setNumberOfPassengers(1);
    QVERIFY(m_bus.numberOfPassengers() == 1);
}</syntaxhighlight>
 
* testNameOfDriver<syntaxhighlight lang="cpp" line>void TestBus::testNameOfDriver()
{
    m_bus.setNameOfDriver(QString("Billy"));
    QVERIFY(m_bus.nameOfDriver() == QString("Billy"));
}</syntaxhighlight>
 
* testNumberOfPassengersChanged<syntaxhighlight lang="cpp" line>void TestBus::testNumberOfPassengersChanged()
{
    // створюємо об'єкт spy
    QSignalSpy spy1(&m_bus,
                    &Transportation::Bus::numberOfPassengersChanged);
    // тепер змінюємо кількість пасажирів
    m_bus.setNumberOfPassengers(4);
    // перевіряємо виконання перевірки
    QVERIFY(m_bus.numberOfPassengers() == 4);
    // перевіряємо надсилання сигналу
    QCOMPARE(spy1.count(), 1);
}</syntaxhighlight>
 
* testNameOfDriverChanged<syntaxhighlight lang="cpp" line>void TestBus::testNameOfDriverChanged()
{
    // створюємо об'єкт spy
    QSignalSpy spy1(&m_bus,
                    &Transportation::Bus::nameOfDriverChanged);
    // тепер змінюємо ім'я водія
    m_bus.setNameOfDriver(QString("Jim"));
    // перевіряємо виконання перевірки
    QVERIFY(m_bus.nameOfDriver() == QString("Jim"));
    // перевіряємо надсилання сигналу
    QCOMPARE(spy1.count(), 1);
   
}</syntaxhighlight>
 
На цьому кроці збирання проєкту також призведе до збирання тестів. Ви можете запускати Bus і TestBus окремо. Клацання на цілі TestBus правою кнопкою відкриє контекстне меню, у якому ви можете вибрати <menuchoice>Виконати як...</menuchoice>, далі <menuchoice>Зібраний виконуваний файл</menuchoice>. У відповідь буде відкрито панель інструмента <tt>Запуск</tt> із такими виведеними даними:
 
{{Input|1=<nowiki>********* Start testing of TestBus *********
Config: Using QtTest library 5.14.1, Qt 5.14.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 7.4.0)
PASS  : TestBus::initTestCase()
PASS  : TestBus::testNumberOfPassengers()
PASS  : TestBus::testNameOfDriver()
PASS  : TestBus::testNumberOfPassengersChanged()
PASS  : TestBus::testNameOfDriverChanged()
PASS  : TestBus::cleanupTestCase()
Totals: 6 passed, 0 failed, 0 skipped, 0 blacklisted, 8ms
********* Finished testing of TestBus *********
*** Finished ***</nowiki>}}
 
Запускання збирання, виконуваного файла і тестів формує командний рядок дещо інакше. Тести поєднуються у один файловий тест. Зазирнувши до <tt>build/Testing/Temporary</tt>, ви знайдете <tt>LastTest.log</tt>, де кожен тест буде показано подібно до наведеного вище варіанта.
 
[[File:kdevelop-bus-command-line.png|500px|thumb|center]]
 
Якщо ви користуєтеся CTest або якимось іншим комплексом для тестування, не забудьте додати нові файли до цілі. У KDevelop передбачено [[KDevelop5/Manual/Tool_list/Unit_Tests|набір інструментів тестування модулів]], який інтегрується із CTest.  
<span id="Other files"></span>
<span id="Other files"></span>
=== Інші файли ===
=== Інші файли ===
Line 66: Line 173:
Ви можете отримати додаткові файли шаблонів безпосередньо з вікна, яке можна відкрити за допомогою пункту меню <menuchoice>Файл -> Створити з шаблона</menuchoice>: достатньо натиснути кнопку <menuchoice>Отримати додаткові шаблони...</menuchoice>. У відповідь буде відкрито вікно отримання нових даних, за допомогою якого ви зможете встановити додаткові шаблони, оновити вже встановлені шаблони або вилучити непотрібні вам шаблони. Також передбачено модуль налаштовування для шаблонів. Доступ до цього модуля можна отримати за допомогою пункту меню <menuchoice>Параметри -> Налаштувати KDevelop -> Шаблони</menuchoice>. За допомогою цього модуля ви можете керувати шаблонами файлів (описано вище) і шаблонами проектів (використовується для створення проектів).  
Ви можете отримати додаткові файли шаблонів безпосередньо з вікна, яке можна відкрити за допомогою пункту меню <menuchoice>Файл -> Створити з шаблона</menuchoice>: достатньо натиснути кнопку <menuchoice>Отримати додаткові шаблони...</menuchoice>. У відповідь буде відкрито вікно отримання нових даних, за допомогою якого ви зможете встановити додаткові шаблони, оновити вже встановлені шаблони або вилучити непотрібні вам шаблони. Також передбачено модуль налаштовування для шаблонів. Доступ до цього модуля можна отримати за допомогою пункту меню <menuchoice>Параметри -> Налаштувати KDevelop -> Шаблони</menuchoice>. За допомогою цього модуля ви можете керувати шаблонами файлів (описано вище) і шаблонами проектів (використовується для створення проектів).  


[[Image:kdevelop-template-manager.png|thumb|500px|center]]
[[File:Kdevelop-templatemanager.png|500px|thumb|center]]


<div class="mw-translate-fuzzy">
Звичайно ж, якщо потребам вашого проекту не відповідає жоден шаблон, ви можете створити новий. Ймовірно, найпростішим способом буде копіювання вже створеного шаблона з наступним внесенням до нього змін. Вам можуть допомогти короткі [http://techbase.kde.org/Development/Tutorials/KDevelop/Creating_a_class настанови] та розгорнутий [http://techbase.kde.org/Projects/KDevelop5/File_template_specification довідковий документ]. Щоб скопіювати встановлений шаблон, відкрийте вікно керування шаблонами за допомогою пункту меню <menuchoice>Параметри -> Налаштувати KDevelop... -> Шаблони</menuchoice>, виберіть шаблон, який слід скопіювати, потім натисніть кнопку <menuchoice>Видобути шаблон</menuchoice>. Виберіть теку призначення, потім натисніть кнопку <menuchoice>Гаразд</menuchoice>. Вміст шаблона буде видобуде до вказаної вами теки. Тепер ви можете почати редагування шаблона: відкривати і змінювати видобуті файли. Щойно потрібні зміни буде внесено, ви можете імпортувати ваш новий шаблон до &kdevelop;: відкрийте засіб керування шаблонами, перейдіть на відповідну вкладку (<menuchoice>Шаблони проектів</menuchoice> або <menuchoice>Шаблони файлі</menuchoice>) і натисніть кнопку <menuchoice>Завантажити шаблон</menuchoice>. Відкрийте файл опису шаблона, тобто файл з суфіксом назви <tt>.kdevtemplate</tt> або <tt>.desktop</tt>. '''KDevelop''' стисне всі файли до архіву шаблона і імпортує його дані.  
Звичайно ж, якщо потребам вашого проекту не відповідає жоден шаблон, ви можете створити новий. Ймовірно, найпростішим способом буде копіювання вже створеного шаблона з наступним внесенням до нього змін. Вам можуть допомогти короткі [http://techbase.kde.org/Development/Tutorials/KDevelop/Creating_a_class настанови] та розгорнутий [http://techbase.kde.org/Projects/KDevelop5/File_template_specification довідковий документ]. Щоб скопіювати встановлений шаблон, відкрийте вікно керування шаблонами за допомогою пункту меню <menuchoice>Параметри -> Налаштувати KDevelop... -> Шаблони</menuchoice>, виберіть шаблон, який слід скопіювати, потім натисніть кнопку <menuchoice>Видобути шаблон</menuchoice>. Виберіть теку призначення, потім натисніть кнопку <menuchoice>Гаразд</menuchoice>. Вміст шаблона буде видобуде до вказаної вами теки. Тепер ви можете почати редагування шаблона: відкривати і змінювати видобуті файли. Щойно потрібні зміни буде внесено, ви можете імпортувати ваш новий шаблон до &kdevelop;: відкрийте засіб керування шаблонами, перейдіть на відповідну вкладку (<menuchoice>Шаблони проектів</menuchoice> або <menuchoice>Шаблони файлі</menuchoice>) і натисніть кнопку <menuchoice>Завантажити шаблон</menuchoice>. Відкрийте файл опису шаблона, тобто файл з суфіксом назви <tt>.kdevtemplate</tt> або <tt>.desktop</tt>. '''KDevelop''' стисне всі файли до архіву шаблона і імпортує його дані.
</div>


<div class="mw-translate-fuzzy">
{{Note_(uk)|1=Якщо ви копіюєте вже створений шаблон, не забудьте перейменувати його до повторного імпортування. Якщо ви цього не зробите, попередній шаблон буде перезаписано або у списку з’являться два шаблони з однаковими назвами. Щоб перейменувати шаблон, перейменуйте файл опису так, щоб він мав унікальну назву (суфікс слід зберегти), і змініть запис <tt>Name</tt> у файлі опису.}}
{{Note_(uk)|1=Якщо ви копіюєте вже створений шаблон, не забудьте перейменувати його до повторного імпортування. Якщо ви цього не зробите, попередній шаблон буде перезаписано або у списку з’являться два шаблони з однаковими назвами. Щоб перейменувати шаблон, перейменуйте файл опису так, щоб він мав унікальну назву (суфікс слід зберегти), і змініть запис <tt>Name</tt> у файлі опису.}}
</div>


Якщо вам потрібно створити шаблон «з нуля», ви можете почати зі зразка шаблона класу C++: [[Special:myLanguage/KDevelop5/Manual/Sessions and projects#Creating projects from scratch|створіть новий проект]] і виберіть проект <tt>Шаблон класу C++</tt> у категорії <tt>KDevelop</tt>.  
Якщо вам потрібно створити шаблон «з нуля», ви можете почати зі зразка шаблона класу C++: [[Special:myLanguage/KDevelop5/Manual/Sessions and projects#Creating projects from scratch|створіть новий проект]] і виберіть проект <tt>Шаблон класу C++</tt> у категорії <tt>KDevelop</tt>.  

Latest revision as of 09:21, 8 October 2020

Other languages:
Under Construction
This is a new page, currently under construction!


Створення коду за допомогою шаблонів

У KDevelop для створення початкового коду можна використовувати шаблони. Отже, за допомогою шаблонів ви можете уникнути повторного написання поширених частин коду.

Створення класу

Найпоширенішим випадком використання створення коду за шаблоном є, ймовірно, написання нового класу. Щоб створити новий клас у вже створеному проекті, наведіть вказівник миші на теку проекту, клацніть правою кнопкою миші і виберіть у контекстному меню пункт Створити з шаблона. Те саме діалогове вікно може бути відкрито за допомогою меню, пункту Файл -> Створити з шаблона, але використання теки проекту має перевагу встановлення базової адреси для вихідних файлів. Виберіть C++ на панелі вибору Мова, бажану Бібліотеку і Шаблон на двох інших панелях. У нижній частині вікна розташовано панель Перегляд, де програма покаже вам файли, які нею створено і дозволить вам здійснювати навігацію файлами. Після того, як виберете усі параметри, вам слід вказати подробиці щодо нового класу у вікні Основи класу після натискання кнопки Далі.

Спочатку слід вказати ідентифікатор нового класу. Це може бути проста назва (наприклад Bus) або повний ідентифікатор у просторі назв (наприклад Transportation::Bus). У останньому випадку KDevelop виконає обробку ідентифікатора і відповідним чином відокремить простір назв від назви класу. За допомогою цієї самої сторінки ви можете додати основні класи для нового класу. Ви можете зауважити, що у деяких шаблонах уже передбачено вибір основних класів. Ви можете просто вилучити зайві і/або додати інші основні класи. Тут вам слід вказати інструкцію наслідування повністю. Звичайно ж, така інструкція залежить від вибраної мови програмування, це буде public QObject для C++, extends SomeClass для PHP або просто назва класу для Python.

За допомогою наступної сторінки ви можете вибрати віртуальні методи з успадкованих класів, а також типові конструктори, деструктори і оператори. Реалізувати метод у новому класі можна простим позначенням пунктів з підписами методів.

Після натискання кнопки Далі буде показано сторінку, за допомогою якої ви можете додати до класу методи. Залежно від вибраного шаблона, методи може бути реалізовано у новому класі як змінні-елементи або може бути створено властивості з функціями встановлення та отримання значень. У мовах, де типи змінних слід оголошувати, зокрема у C++, вам слід вказати одразу тип і назву елемента, наприклад int number або QString name. У інших мовах можна не вказувати тип, але все ж варто його визначити, оскільки таке визначення може бути корисним для подальшої роботи з шаблоном. Крім того, ви можете перевпорядкувати учасників класу, позначивши відповідний пункт із наступним натисканням кнопки Пересунути вище або Пересунути нижче. Вибраний порядок буде використано під час створення файла початкового коду.

За допомогою наступних сторінок ви зможете вибрати умови ліцензування вашого нового класу, встановити нетипові параметри, характерні для вибраного шаблона, та налаштувати місце зберігання виведених даних для всіх створених програмою файлів. Натискання кнопки Завершити призведе до завершення роботи допоміжної програми і створення нового класу. Створені допоміжною програмою файли буде одразу відкрито у вікні редактора, отже ви зможете негайно перейти до додавання потрібного коду.

Після створення класу C++ програма запропонує вам додати клас до певної цілі у проекті. Виберіть у діалоговому вікні відповідну ціль або закрийте діалогове вікно і додайте файли до цілі вручну.

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

Як можна бачити, дані-елементи перетворено на властивості Qt з функціями доступу та макросами Q_PROPERTY. Крім того, аргументи функцій встановлення передано з посиланнями на сталі там, де це потрібно. Якщо вами буде вибрано підклас pimpl QObject, буде оголошено закритий клас (private) та створено закритий вказівник з Q_DECLARE_PRIVATE. Все це зроблено відповідним шаблоном. Вибір іншого шаблона на першому кроці може призвести до зовсім іншого результату.

Створення тесту модуля

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

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

Додавання модулів перевірки та файла CMakeLists.txt для додавання модулів перевірки до проєкту Bus дасть вказаний нижче файл CMakeLists.txt для проєкту Bus, теки src та теки tests:

  • Проєкт Bus:
    cmake_minimum_required(VERSION 3.0)
    
    project(Bus LANGUAGES CXX)
    
    set(QT_REQUIRED_VERSION "5.14.0")
    find_package(Qt5 ${QT_REQUIRED_VERSION} CONFIG REQUIRED COMPONENTS Core Test)
    
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    # Документація доступна, лише якщо це основна програма
    find_package(Doxygen)
    if(Doxygen_FOUND)
    	add_subdirectory(docs)
    else()
    	message(STATUS "Doxygen not found, not building docs")
    endif()
    
    add_subdirectory(src)
    
    enable_testing()
    add_subdirectory(tests)
    
  • Тека src:
    set(HEADER_LIST "bus.h")
    add_executable(bus main.cpp bus.cpp)
    
    target_link_libraries(bus PRIVATE Qt5::Core)
    
  • tests folder:
    include_directories("../src")
    
    add_executable(TestBus testbus.cpp ../src/bus.cpp)
    
    add_test(NAME TestBus COMMAND TestBus)
    
    target_link_libraries(TestBus PRIVATE Qt5::Test)
    

У файлі testbus.h ви побачите комплекти тестових даних, які було визначено під час додавання кроків послідовності тестування, префікс тесту було додано шаблоном:

class TestBus: public QObject
{
    Q_OBJECT

// кожен приватний слот є тестом
private slots:
    // -- тести для виконання на слотах --
    void testNumberOfPassengers();
    void testNameOfDriver();
    // -- тести для виконання на сигналах --
    void testNumberOfPassengersChanged();
    void testNameOfDriverChanged();
private:
    Transportation::Bus m_bus;
};

Повні функції у testbus.cpp у деталях наведено нижче:

  • testNumberOfPassengers
    void TestBus::testNumberOfPassengers()
    {
        m_bus.setNumberOfPassengers(1);
        QVERIFY(m_bus.numberOfPassengers() == 1);
    }
    
  • testNameOfDriver
    void TestBus::testNameOfDriver()
    {
        m_bus.setNameOfDriver(QString("Billy"));
        QVERIFY(m_bus.nameOfDriver() == QString("Billy"));
    }
    
  • testNumberOfPassengersChanged
    void TestBus::testNumberOfPassengersChanged()
    {
        // створюємо об'єкт spy
        QSignalSpy spy1(&m_bus,
                        &Transportation::Bus::numberOfPassengersChanged);
        // тепер змінюємо кількість пасажирів
        m_bus.setNumberOfPassengers(4);
        // перевіряємо виконання перевірки
        QVERIFY(m_bus.numberOfPassengers() == 4);
        // перевіряємо надсилання сигналу
        QCOMPARE(spy1.count(), 1);
    }
    
  • testNameOfDriverChanged
    void TestBus::testNameOfDriverChanged()
    {
        // створюємо об'єкт spy
        QSignalSpy spy1(&m_bus,
                        &Transportation::Bus::nameOfDriverChanged);
        // тепер змінюємо ім'я водія
        m_bus.setNameOfDriver(QString("Jim"));
        // перевіряємо виконання перевірки
        QVERIFY(m_bus.nameOfDriver() == QString("Jim"));
        // перевіряємо надсилання сигналу
        QCOMPARE(spy1.count(), 1);
        
    }
    

На цьому кроці збирання проєкту також призведе до збирання тестів. Ви можете запускати Bus і TestBus окремо. Клацання на цілі TestBus правою кнопкою відкриє контекстне меню, у якому ви можете вибрати Виконати як..., далі Зібраний виконуваний файл. У відповідь буде відкрито панель інструмента Запуск із такими виведеними даними:

********* Start testing of TestBus *********
Config: Using QtTest library 5.14.1, Qt 5.14.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 7.4.0)
PASS   : TestBus::initTestCase()
PASS   : TestBus::testNumberOfPassengers()
PASS   : TestBus::testNameOfDriver()
PASS   : TestBus::testNumberOfPassengersChanged()
PASS   : TestBus::testNameOfDriverChanged()
PASS   : TestBus::cleanupTestCase()
Totals: 6 passed, 0 failed, 0 skipped, 0 blacklisted, 8ms
********* Finished testing of TestBus *********
*** Finished ***

Запускання збирання, виконуваного файла і тестів формує командний рядок дещо інакше. Тести поєднуються у один файловий тест. Зазирнувши до build/Testing/Temporary, ви знайдете LastTest.log, де кожен тест буде показано подібно до наведеного вище варіанта.

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

Інші файли

Хоча роботу засобів створення коду на основі шаблонів акцентовано на створенні класів та тестів модулів, подібну методику можна застосувати для створення будь-яких фрагментів файлів коду. Наприклад, можна скористатися шаблонами для модулів пошуку CMake або файлів .desktop. Для цього просто виберіть пункт Створити з шаблона, а потім позначте відповідну категорію і шаблон. Якщо шаблон не належить до категорій Клас або Перевірка, вам достатньо буде вибрати умови ліцензування, значення додаткових параметрів шаблона та розташування файлів результату. Як і для класів з тестами, на завершення роботи допоміжної програми буде створено відповідні файли і відкрито їх у вікні редактора.

Керування шаблонами

Ви можете отримати додаткові файли шаблонів безпосередньо з вікна, яке можна відкрити за допомогою пункту меню Файл -> Створити з шаблона: достатньо натиснути кнопку Отримати додаткові шаблони.... У відповідь буде відкрито вікно отримання нових даних, за допомогою якого ви зможете встановити додаткові шаблони, оновити вже встановлені шаблони або вилучити непотрібні вам шаблони. Також передбачено модуль налаштовування для шаблонів. Доступ до цього модуля можна отримати за допомогою пункту меню Параметри -> Налаштувати KDevelop -> Шаблони. За допомогою цього модуля ви можете керувати шаблонами файлів (описано вище) і шаблонами проектів (використовується для створення проектів).

Звичайно ж, якщо потребам вашого проекту не відповідає жоден шаблон, ви можете створити новий. Ймовірно, найпростішим способом буде копіювання вже створеного шаблона з наступним внесенням до нього змін. Вам можуть допомогти короткі настанови та розгорнутий довідковий документ. Щоб скопіювати встановлений шаблон, відкрийте вікно керування шаблонами за допомогою пункту меню Параметри -> Налаштувати KDevelop... -> Шаблони, виберіть шаблон, який слід скопіювати, потім натисніть кнопку Видобути шаблон. Виберіть теку призначення, потім натисніть кнопку Гаразд. Вміст шаблона буде видобуде до вказаної вами теки. Тепер ви можете почати редагування шаблона: відкривати і змінювати видобуті файли. Щойно потрібні зміни буде внесено, ви можете імпортувати ваш новий шаблон до &kdevelop;: відкрийте засіб керування шаблонами, перейдіть на відповідну вкладку (Шаблони проектів або Шаблони файлі) і натисніть кнопку Завантажити шаблон. Відкрийте файл опису шаблона, тобто файл з суфіксом назви .kdevtemplate або .desktop. KDevelop стисне всі файли до архіву шаблона і імпортує його дані.

Зауваження
Якщо ви копіюєте вже створений шаблон, не забудьте перейменувати його до повторного імпортування. Якщо ви цього не зробите, попередній шаблон буде перезаписано або у списку з’являться два шаблони з однаковими назвами. Щоб перейменувати шаблон, перейменуйте файл опису так, щоб він мав унікальну назву (суфікс слід зберегти), і змініть запис Name у файлі опису.


Якщо вам потрібно створити шаблон «з нуля», ви можете почати зі зразка шаблона класу C++: створіть новий проект і виберіть проект Шаблон класу C++ у категорії KDevelop.