/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Design hjælp: open/close som constructor/d~
Fra : Per Abrahamsen


Dato : 23-12-04 10:22

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.

 
 
Kristian Dupont (13-01-2005)
Kommentar
Fra : Kristian Dupont


Dato : 13-01-05 20:36

Lige netop de ting, du beskriver, er noget af det der slår én som mest
irriterende når man nu ellers er så begejstret for RAII :)

Du kender sikkert Alexandrescu og Petrus ScopeGuard:
http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/

Inspireret herfra kunne du jo lave en makro der gør arbejdet for dig (Se
ON_BLOCK_EXIT i artiklen). Vi er enige om at makroer er onde, men nogle ting
er bare svære at implementere med ren c++...

Kristian Dupont



Per Abrahamsen (17-01-2005)
Kommentar
Fra : Per Abrahamsen


Dato : 17-01-05 13:54

"Kristian Dupont" <kristian@chrylersSpamguarD.com> writes:

> Lige netop de ting, du beskriver, er noget af det der slår én som mest
> irriterende når man nu ellers er så begejstret for RAII :)

Anonyme variable må med i næste C++ version!

> Du kender sikkert Alexandrescu og Petrus ScopeGuard:
> http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/

Næh. Jeg tror heller ikke teknikken vil hjælpe mig, de gange jeg
bruger den "virkelige verdens" kode i stedet for den "politisk
korrekte" kode, er det nok fordi jeg ikke hær tænkt over at koden ikke
er exception sikker, ikke fordi jeg er doven.

> Inspireret herfra kunne du jo lave en makro der gør arbejdet for dig (Se
> ON_BLOCK_EXIT i artiklen). Vi er enige om at makroer er onde, men nogle ting
> er bare svære at implementere med ren c++...

Måske, hvis jeg ellers kunne finde definitionen af ON_BLOCK_EXIT.

Kristian Dupont (17-01-2005)
Kommentar
Fra : Kristian Dupont


Dato : 17-01-05 23:51

>> Inspireret herfra kunne du jo lave en makro der gør arbejdet for dig (Se
>> ON_BLOCK_EXIT i artiklen). Vi er enige om at makroer er onde, men nogle
>> ting
>> er bare svære at implementere med ren c++...
>
> Måske, hvis jeg ellers kunne finde definitionen af ON_BLOCK_EXIT.

Den ser således ud:
#define CONCATENATE_DIRECT(s1, s2) s1##s2
#define CONCATENATE(s1, s2) CONCATENATE_DIRECT(s1, s2)
#define ANONYMOUS_VARIABLE(str) CONCATENATE(str, __LINE__)

#define ON_BLOCK_EXIT ScopeGuard ANONYMOUS_VARIABLE(scopeGuard) = MakeGuard

Som du kan se er det en makro der genererer et navn ud fra linien i koden
som således optræder som "anonym" variabel.

Den eneste tilføjelse det vil kræve i din kode er funktioner der opretter de
forskellige elementtyper i din Format klasse.

Kristian Dupont



Per Abrahamsen (18-01-2005)
Kommentar
Fra : Per Abrahamsen


Dato : 18-01-05 15:26

"Kristian Dupont" <kristian@chrylersSpamguarD.com> writes:

> Den eneste tilføjelse det vil kræve i din kode er funktioner der opretter de
> forskellige elementtyper i din Format klasse.

Jeg har allerede virtuelle open/close for hver tag i Format klassen.
Så en scope-guard lignende ting der tager de to som argumenter. En
ON_CLOCK_EXIT lignende ting der opretter et anonymt scope-guard
object. Og så en per-TAG macro.

Det ville både gøre Format klassen simplere (ingen af de der nestede
klasser), og det ville gøre koden der brugte den simplere.

Men laget indimellem vil være et mareridt.

Det må jeg tænkte lidt mere over.

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste