Broncode schrijven

Omdat KDevelop de broncode in uw project begrijpt, kan het assisteren bij het schrijven van meer code. Hieronder zijn enige manieren beschreven waarop het dat doet.

Automatische aanvulling

Waarschijnlijk het meest gebruikte functionaliteit bij het schrijven van nieuwe code is automatisch aanvullen. Denk bijvoorbeeld aan het volgende stuk code:

class Car {
  // ...
  public:
    std::string get_color () const;
};
void foo()
{
  Car my_ride;
  // ...doe iets met deze variabele...
  std::string color = my_ride.ge

In de laatste regel zal KDevelop weten dat de variabele my_ride van het type Car is en zal automatisch aanbieden om de naam van de member function ge aan te vullen tot get_color. U hoeft slechts door te gaan met typen tot dat de functie automatisch aanvullen het aantal matches heeft beperkt tot één waarna u de Enter-toets kan indrukken:

Merk op dat u op de tooltip kunt klikken om meer informatie te krijgen over de functie zoals het return type en of het public is:

Automatische aanvulling kan u veel tijd besparen als u lange namen voor variabelen en functies gebruikt; bovendien vermijdt u op deze manier spellingsfouten (en de daaruit resulterende compile errors) en het is veel eenvoudiger om de precieze namen van functies te onthouden; bijvoorbeeld, als al uw getters starten met get_, dan zal de automatische aanvulling u alleen een lijst met mogelijke getters tonen nadat u de eerste vier letters heeft ingevoerd, u eraan herinnerend welke van de functies de correcte is. Merk op dat om automatische aanvulling te laten werken het niet nodig is dat de declaratie van de klasse Car of de variabele my_ride in hetzelfde bestand is als waar u op dit moment code bewerkt. KDevelop hoeft alleen te weten dat deze klassen en variabelen ermee verbonden zijn , bijv. de bestanden waarin de verbindingen zijn gemaakt moeten onderdeel maken van het project waaraan u op dit moment werkt.

Opmerking

Soms start KDevelop niet automatisch met het u assisteren van het bewerken van de code. Als de automatische aanvulling tooltip niet automatisch opent, toets dan Ctrl+Spatie om de lijst met automatische aanvulling handmatig te openen. Automatische aanvulling kan pas werken nadat KDevelop uw bronbestanden heeft doorzocht. Dit gebeurt voor alle bestanden van de projecten in deze sessie in de achtergrond nadat u KDevelop heeft gestart, maar ook als u een fractie van een seconde heeft gestopt met typen (de vertraging kunt u instellen).

Opmerking

KDevelop doorzoekt alleen bestanden die het als broncode beschouwt, dit gebeurt aan de hand van het MIME-type van het bestand. Dit type wordt pas ingesteld bij het voor de eerste keer opslaan van het bestand; als consequentie daarvan werkt de automatisch aanvulling niet als u een bestand heeft gestart en hierin code schrijft totdat het voor de eerste keer is opgeslagen.

Opmerking

Zoals eerder opgemerkt, om automatische aanvulling te kunnen laten werken moet het voor KDevelop mogelijk zijn om de declaraties te kunnen vinden in de header-bestanden. Hiervoor doorzoekt het een aantal standaard locaties. Als het geen header-bestand kan vinden dan onderstreept het met rood de naam van een header-bestand; klik daarop in dat geval om KDevelop duidelijk te maken waar het deze bestanden kan vinden en welke informatie deze geven.

Opmerking

De beschrijving van het instellen van de automatische aanvulling vindt u in dit hoofdstuk van deze handleiding.

Nieuwe klassen toevoegen en implementeren van member-functies

KDevelop heeft een hulpmiddel voor het toevoegen van nieuwe klasses. De beschrijving van de procedure vindt u in Een nieuwe klasse aanmaken. U kunt een eenvoudige C++ klasse aanmaken door gebruik van de Basic C++ template uit de Class category. In het hulpmiddel kunnen we voorgedefinieerde member functies uitkiezen zoals bijvoorbeeld een lege constructor, een copy constructor of een destructor.

Na het gebruik van het hulpmiddel zijn de nieuwe bestanden aangemaakt en de editor geopend. Het header-bestand is inclusief guards en de nieuwe klasse heeft alle geselecteerde functies. De volgende twee stappen zijn het documenteren van de klasse en zijn memberfuncties en het implementeren daarvan. Wij zullen de hulpmiddelen voor het documenteren van de klassen en functies hieronder beschrijven. Voor het implementeren van de al aangemaakte speciale functies gaat u naar de tab bus.cpp waar het skelet van de functies al wacht:

Als u nieuwe member functies wilt toevoegen dan gaat u opnieuw naar de tab bus.h en voegt vervolgens de naam van een functie toe. Wij willen bijvoorbeeld het volgende toevoegen:

U merkt dat ik al gestart ben met met de implementatie. Maar in veel codeerstylen is het niet toegestaan dat u de functie implementeert in het headerbestand, in plaats daarvan moet dat gebeuren in het bijbehorende .cpp-bestand. Plaats de cursor op de naam van de functie en selecteer CodeVerplaatsen naar bron of toets Ctrl+Alt+S. Dit verplaatst de code tussen de accolades uit het headerbestand (en vervangt dit door een puntkomma om de functiedefinities af te sluiten) naar het bronbestand:

U merkt op dat ik gewoon gestart ben met typen en dat het mijn bedoeling is dat de variabele students waarschijnlijk een member variabele van de klasse Bus wordt maar dat ik het nu nog niet heb toegevoegd. Merk ook op dat KDevelop het onderstreept omdat er verder nog geen informatie over aanwezig is. Maar dat probleem kunt u oplossen: als u klikt op de naam van de variabele krijgt u de volgende tooltip:

(Hetzelfde kan bereikt worden door er rechts op te klikken en Oplossing: Declareren als te selecteren.) Laat me 3 - private unsigned int selecteren (ofwel met de muis of door Alt+3) in te drukken en kijk dan hoe het uit het header-bestand komt:

Het is het waard op te merken dat KDevelop het type van de variabele voor de declaratie haalt uit de expressie gebruikt om deze te initialiseren. Als we bijvoorbeeld de optelling hadden geschreven op de volgende tamelijk dubieuze manier, dan zou het hebben gesuggereerd om de variabele als type double te declareren:

Een laatste opmerking: De gebruikte methode CodeVerplaatsen naar bron voegt de nieuwe member functie niet altijd op de gewenste locatie in. U wilt het bijvoorbeeld markeren als inline en het onderaan het headerbestand plaatsen. In dit soort gevallen schrijft u de declaratie en start het schrijven van de functie op deze manier:

KDevelop geeft automatisch alle mogelijke aanvullingen voor wat hier zou kunnen komen. Door het selecteren van een van de twee add_students entries krijgt u de volgende code met al de complete lijst met argumenten ingevuld:

Opmerking

Het accepteren van een van de keuzes in het voorbeeld geeft na het automatisch aanvullen de correcte ondertekening maar verwijdert helaas de al eerder geschreven inline-bladwijzer. Dit is gemeld als KDevelop Bug 274245.

Documenteren van declaraties

Goede code is goed gedocumenteerd, zowel op het niveau van het implementeren van de algoritmes in de functies als op het niveau van de interface — bijv., klasses, (member en globaal) functies, en (member of globaal) variabelen moeten gedocumenteerd zijn wat betreft hun doel, mogelijke waarden voor de argumenten, pre- en postconditions, etc. Wat betreft de documentatie van de interface, doxygen is de facto standaard geworden voor de opmaak van commentaar zodat het geëxtraheerd en daarna op doorzoekbare webpagina's getoond kan worden.

KDevelop ondersteund deze stijl van commentaar door het geven van een sneltoets voor het aanmaken van een framework met commentaar voor het documenteren van een klasse of member function. Stel, u heeft al deze code geschreven:

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

U wilt nu documentatie toevoegen aan zowel de klasse en de memberfunctie. Plaats de cursor op de eerste regel en selecteer CodeDocument declaratie of toets Alt+Shift+D. KDevelop zal als volgt reageren:

De cursor staat al in het lichtgrijze gebied waar u een korte beschrijving kunt geven (na het doxygen trefwoord @brief) van deze klasse. U kunt vervolgens uitgebreider documentatie toevoegen aan dit commentaar die meer gedetailleerde informatie geeft over de klasse:

Als het commentaar is geselecteerd in de editor, dan zal de text daarvan groen oplichten (de tekst zal niet meer oplichten als de cursor van het commentaar weg is). Als u aan het eind van de regel de Enter-toets indrukt dan start KDevelop automatisch een nieuwe regel met een sterretje en de cursor een karakter ingesprongen.

Nu gaan we de memberfunctie documenteren, we plaatsen opnieuw de cursor op de regel met de declaratie en selecteren CodeDocument declaratie of toetsen Alt+Shift+D:

Opnieuw genereert KDevelop automatisch het skelet voor een commentaar inclusief de documentatie voor de functie zelf en het return type. In dit geval geeft de naam van de functie vrij duidelijk het doel weer, maar vaak genoeg is dat niet het geval bij de argumenten van een functie en moeten elk apart gedocumenteerd worden. Om dit duidelijker te maken bekijken we een iets interessantere functie en de documentatie die KDevelop automatisch genereert:

De voorgestelde documentatie heeft bijvoorbeeld al alle nodige Doxygen-velden voor de individuele parameters.

Hernoemen van variabelen, functies en klassen

Soms wilt u een functie, klasse of een variabele hernoemen. Stel bijvoorbeeld dat we het volgende al hebben:

We realiseren vervolgens dat we ongelukkig zijn met de naam remove_students en dat de naam (bijvoorbeeld) throw_out_students beter is. We zouden een zoek-en-vervang actie voor de naam kunnen uitvoeren, maar dit heeft twee nadelen:

  • De functie kan voor meer dan één bestand worden gebruikt.

  • We willen alleen deze functie hernoemen en niet de functies die de dezelfde naam hebben in andere klasses of namespaces.

Beide problemen kunt u oplossen door de cursor op een locatie te plaatsen waar deze voorkomt en vervolgens CodeDeclaraties hernoemen te selecteren (of met de rechtermuisknop te klikken op de naam en Bus::remove_students hernoemen selecteren). Er opent een dialoogvenster waarin u de nieuwe naam van de functie kunt invoeren en waar u ook alle plaatsen ziet waar deze daadwerkelijk is gebruikt:

Codefragmenten

In de meeste projecten zijn er stukken code die vaak voorkomen in de broncode. Voorbeelden zijn: voor schrijvers van compilers, een loop met alle instructies; voor schrijvers van user interfaces, controle van de gebruikersinvoer op geldigheid en indien niet geldig het vervolgens geven van een foutmelding; in het project van de auteur van deze tekst, zou het de volgende code kunnen zijn:

for (typename Triangulation::active_cell_iterator
       cell = triangulation.begin_active();
     cell != triangulation.end(); ++cell)
  ... doe iets met de cel ...

In plaats van dat u dit soort teksten iedere keer opnieuw intypt (met het risico van tikfouten), kan het hulpmiddel Fragmenten van KDevelop u daarbij helpen. Open het venster (lees Weergave van hulpmiddelen als u het desbetreffende knop nog niet aantreft rondom het hoofdvenster). Klik vervolgens op de knop Repository toevoegen (een beetje verkeerde naam — hiermee kan u de naam bepalen voor een verzameling van fragmenten mee aanmaken voor bepaalde soorten broncodes, bijv. C++ sources) en vervolgens een lege repository aanmaken. Klik vervolgens op om een fragment toe te voegen, zodat u het volgende dialoogvenster te zien krijgt:

Opmerking

De naam van het fragment mag geen spaties of andere speciale karakters hebben omdat het op de naam van een normale functie of variabele moet lijken (vanwege redenen die duidelijker worden in de volgende paragraaf).

Om een gedefinieerde fragment te gebruiken tijdens het bewerken hoeft u alleen maar de naam van het fragment te typen zoals u dat met een andere functie of variabele zou doen. Deze naam komt beschikbaar voor automatische aanvulling — wat inhoud dat het geen probleem is als u een lange omschrijvende naam voor een fragment gebruikt zoals hierboven — en als u door de automatische aanvulling voorgestelde suggestie accepteert (bijvoorbeeld door op Enter te drukken), dan zal de al ingevoerde gedeelte van de naam van het fragment worden vervangen door de volledige tekst van het fragment met de juiste inspringingen:

Merk op dat voor de juiste werking hiervan is het niet nodig dat het Fragmenten-dialoogvenster geopend of zichtbaar is: u heeft het dialoogvenster alleen nodig om nieuwe fragmenten te definiëren. Als alternatieve, maar minder handige, manier om de volledige tekst van een fragment te krijgen is door te klikken in het desbetreffende dialoogvenster.

Opmerking

Met fragmenten is veel meer mogelijk dan hier uitgelegd. Lees gedetailleerde documentatie van het hulpmiddel voor fragmenten voor een complete uitleg van de mogelijkheden.