TDDC76 Programmering och datastrukturer
Kodmallar
Innehåll
- Dokumentationen av program
- Inkluderingsfiler
- Inline-definitionsfiler
- Implementeringsfiler
- Implementeringsfiler med mallkod
- Klassbeskrivningar
- Funktionsbeskrivningar
Dokumentationen av program
Dokumentering är ett viktig inslag i framställning av programvara. Här behandlas den form av dokumentation som utgörs av kommentarer i källkoden.
Källkodskommentarer kan delas in i strategiska och taktiska kommentarer:
-
en strategisk kommentar placeras före ett kodavsnitt, t.ex. före en moduldeklaration eller en funktionsdefinition, och beskriver vad det beskrivna kodavsnittet fyller för funktion.
-
en taktisk kommentar rör vanligtvis vad en enskild rad kod gör. En taktisk kommentar placeras med fördel sist på raden om detta är möjligt, i annat fall före raden ifråga.
Strategiska kommentarer vänder sig i första hand till användare av en modul eller en funktion, medan taktiska kommentarer vänder sig till den som ska underhålla koden. För mycket taktiska kommentarer gör lätt koden oläslig och bör undvikas, och kan ofta undvikas genom den strategiska kommenteringen, väl valda namn och välskriven kod för övrigt. Endast påtagligt komplicerad kod bör kommenteras taktiskt.
Nedan ges exempel på mallar för olika slags filer, inkluderingsfiler, inline-definitionsfiler och implementeringsfiler, samt för strategiska kommentarer till klasser och funktioner. Att standardisera sättet att kommentera kan göra det möjligt att med lämpliga verktyg automatiskt generera annan dokumentation, t.ex. manualsidor.
Underlag för kodmallarna kan, i mer eller mindre direkt återanvändbar form, mycket väl ha producerats under designfasen av ett projekt, t.ex. i form av klass- och funktionsbeskrivningsformulär, vilka utgör delar av designdokumentationen.
Gå till: [ Överst på sidan | Projektplanering ]
Inkluderingsfiler
Förutom relevant dokumentering ska inkluderingsfiler ochså förses med en gard som förhindrar multilpel inkludering. I detta exempel visas också hur man med preprocessorn kan hantera inline-deklarerade funktioner som lagras på separat fil.
/* * IDA Programvaruproduktion AB (u.p.a.) * * IDENTIFIERING * * Filnamn: Foo.h * Enhetsnamn: Foo * Typ: Moduldeklaration * Revision: 2.1 * Skriven av: H. Acker * * * BESKRIVNING * * Denna modul ... * * REVISIONSBERÄTTELSE * * Revision Datum Förändringar * * 1 940319 Ursprungsversion * 1.1 940407 ... * ... * 2.0 940821 ... */ #ifndef FOO_H #define FOO_H /* * REFERERADE BIBLIOTEK OCH MODULER */ #include <*.h> #include "*.h" ... /* * VILLKORLIG INKLUDERING AV INLINE-DEFINITIONSFILEN * * Vid normal kompilering inkluderas inline-definitionsfilen * "Foo.icc" här. Vid kompilering för avlusning inkluderas filen * i stället i "Foo.cc". Detta styrs i kompileringskommandot med * preprocessorflaggan "-D" och "DEBUG" som argument, dvs. "-DDEBUG". */ #ifndef DEBUG #include "Foo.icc" #endif /* * SLUT PÅ FILEN Foo.h */ #endif
Gå till: [ Överst på sidan | Projektplanering ]
Inline-definitionsfiler
Inline-definitionsfiler innehåller inline-deklarerade funktioners definitioner. Sådana funktioner ska inte separatkompileras och länkas utan anrop ska i princip ersättas av funktionernas kod, vilket medför att definitionerna måste vara tillgängliga vid kompilering av program som anropar funktionerna.
Vid kompilering för avlusning ("debugging") å andra sidan vill man ha inline-funktioner anropade som ordinära funktioner. Vissa kompilatorer hanterar detta automatiskt men här visas hur man kan göra sig oberoende av sådana egenskaper med hjälp av preprocessorn.
/* * IDA Programvaruproduktion AB (u.p.a.) * * IDENTIFIERING * * Filnamn: Foo.icc * Enhetsnamn: Foo * Typ: Inline-definitioner hörande till modul Foo * Revision: 2.1 * Skriven av: H. Acker * * * BESKRIVNING * * Denna definitionsfil... * * REVISIONSBERÄTTELSE * * Revision Datum Förändringar * * 1 940319 Ursprungsversion * 1.1 940407 ... * ... * 2.0 940821 ... */ /* * FUNKTION f(...) * ... */ inline int Foo::f(...) { ... } /* * FUNKTION ... * ... */ inline ... /* * SLUT PÅ FILEN Foo.icc */
Gå till: [ Överst på sidan | Projektplanering ]
Implementeringsfiler
Implementeringsfiler innehåller funktioner vilka kan separatkompileras för att senare länkas med övriga programdelar.
/* * IDA Programvaruproduktion AB (u.p.a.) * * IDENTIFIERING * * Filnamn: Foo.cc * Enhetsnamn: Foo * Typ: Definitioner hörande till modul Foo, ej inline * Revision: 2.1 * Skriven av: H. Acker * * * BESKRIVNING * * Denna implementeringsfil... * * REVISIONSBERÄTTELSE * * Revision Datum Förändringar * * 1 940319 Ursprungsversion * 1.1 940407 ... * ... * 2.0 940821 ... */ /* * REFERERADE BIBLIOTEK OCH MODULER */ #include "Foo.h" /* * VILLKORLIG INKLUDERING AV INLINE-DEFINITIONSFILEN * * Vid kompilering för avlusning inkluderas inline-definitionsfilen * "Foo.icc" här, samtidigt som inline-deklarationerna avlägsnas. * Vid normal kompilering inkluderas filen i stället i "Foo.h". * Detta styrs i kompileringskommandot med preprocessorflaggan "-D" * och "DEBUG" som argument, dvs. "-DDEBUG". */ #ifdef DEBUG #define inline #include "Foo.icc" #undef inline #endif /* * LOKALA DEFINITIONER * * BESKRIVNING * ... */ /* * LOKALA OBJEKT */ namespace { ... // ... } /* * LOKALA FUNKTIONER (DEKLARATIONER) */ void f(...); // ... ... /* * KONSTRUKTOR Foo() * ... */ template <class T> Foo::Foo() { ... } /* * LOKALA FUNKTIONER (DEFINITIONER) */ /* * FUNKTION fie(...) * ... */ void fie(...) { ... } /* * SLUT PÅ FILEN Foo.cc */
Gå till: [ Överst på sidan | Projektplanering ]
Implementeringsfiler med mallkod
Hur mallkod hanteras skiljer mellan olika kompliatorer. Det finns två huvudmodeller, separatkompileringsmodellen och inkluderingsmodellen.
Inkluderingsmodellen innebär att all mallkod ska inkluderas i de filer där koden används. För att ändå kunna använda den vanliga modellen med inkluderingsfil och tillhörande implementeringsfil kan man göra enligt följande, dvs låta inkluderingsfilen (Foo.h) inkludera den tillhörande implementeringsfilen (Foo.tcc, 't' som i "template").
/* * IDA Programvaruproduktion AB (u.p.a.) * * IDENTIFIERING * * Filnamn: Foo.h * ... */ #ifndef FOO_H #define FOO_H ... template<typename T> class C { ... }; #include "Foo.tcc"
Inkluderingen av Foo.tcc kan göras villkorlig, med hjälp av preprocessorn, så att både inkluderingsmodellen och separatkompileringsmodellen hanteras. I så fall utnyttjar man att information om vilken kompilator som används vanligtvis är tillgänglig för preprocessorn i form av ett enkelt makro.
Gå till: [ Överst på sidan | Projektplanering ]
Klassbeskrivningar
Nedan visas hur klasser kan dokumenteras i inkluderingsfilen.
/* * KLASS X * * BASKLASSER * * ... * * BESKRIVNING * * ... * * TILLSTÅND * * ... * * KONSTRUKTORER * * ... * * OPERATIONER * * ... * * DATAMEDLEMMAR * * ... * * REVISIONSBERÄTTELSE * * Revision Datum Förändringar * * 1 940319 Ursprungsversion * ... */ class X { friend ... ... public: ... protected: ... private: ... }; // class X
Gå till: [ Överst på sidan | Projektplanering ]
Funktionsbeskrivningar
I filmallarna ovan har strategiska kommentarer för funktioner markerats med t.ex.:
/* * FUNKTION funktionsnamn * ... */
I realiteten ska på en fullständig funktionsbeskrivning finnas, vilken kan se ut enligt följande.
/* * FUNKTION fie(int i, ...) * * BESKRIVNING * * Denna funktion... * * INDATA * * ... * * UTDATA * * ... * * SIDOEFFEKTER * * ... (helst inga) * * UTNYTTJAR * * Modul: iostream * Modul: ... * Funktion: fum * Funktion: ... * * REVISIONSBERÄTTELSE * * Revision Datum Förändringar * * 1 940319 Ursprungsversion * ... */ void fie(int i, ...) { ... } // fie
Sidansvarig: Jonas Lindgren
Senast uppdaterad: 2015-08-18