Hej gruppe.
Jeg vil gerne lave et modul til automatisk generering af
dokumentation. Det design jeg har i tænkt på er noget i den her stil.
Jeg har en generate funktion der tager et formatetingsobjekt som
argument, og genererer dokumentation ved forskellige kald til
objektet. Det er så op til formateringsobjektet at formatere teksten
i et passende markup-sprog.
class Format;
class Format_LaTeX : public Format;
class Format_HTML : public Format;
De fleste markup sprog har både open og close tags som skal matche.
Den slags roder jeg ofte rundt i, så jeg er begyndt at bruge
constructors/destructors for at få compileren til at holde styr på dem
for mig, noget i stil med:
void generate (Format& format)
{
Format::Section dummy (format, "Dette er en overskrift");
format.text ("Her er en liste af relevante ting");
{
Format::UnorderedList dummy (format);
for (size_t i = 0; i < my_items.size (); i++)
{
Format::Item dummy (format);
format.text (my_items[i]->description);
}
}
}
Her er hvordan jeg bruger teknikken nu, til at give et hierarkisk
beskedsystem:
class Treelog
{
// Nesting.
public:
class Open
{
private:
Treelog& log;
public:
Open (Treelog& l, const std::string& name);
~Open ();
};
private:
virtual void open (const std::string& name) = 0;
virtual void close () = 0;
friend struct Treelog:
en;
// Use.
public:
virtual void debug (const std::string&) = 0;
virtual void message (const std::string&) = 0;
virtual void warning (const std::string&) = 0;
virtual void error (const std::string&) = 0;
// Create and Destroy.
public:
Treelog ();
virtual ~Treelog ();
};
Der er nogle problemer med den.
1. Det ser lidt klodset ud både at skulle angive 'Format' og 'format'.
2. Jeg glemmer ofte "dummy" argumentet, hvilket desværre ikke giver
en compile time fejl. Det betyder bare at vi får skabt et anonymt
object, der strakt bliver slettet igen.
3. Der er en del ensformigt arbejde i at lave alle subklasserne til
Format, det ville være rart at kunne gøre det mere elegant.
Inden jeg begynder at implementere Format med samme teknik vil jeg
godt høre om der er nogen her der har ideer til hvordan designet kan
forbedres, specielt med hensyn til de tre punkter.