c't

c't-Projekte - Mailinglisten


[Voriger (Datum)] [Nächster (Datum)] [Voriger (Thread)] [Nächster (Thread)]
[Nach Datum][Nach Thread]

Re: [ct-bot] Ein kleiner Korrekturvorschläge

Absender: Timo Sandmann
Datum: Do, 17.03.2011 17:39:58
In-reply-to: <1300373124.1889.30.camel@wbam-laptop>
References: <1300351734.1889.7.camel@wbam-laptop> <B4B15A51-ED01-4DF1-8F7C-3F8FE2BBE60B@xxxxxxxxxxxxxxx> <1300373124.1889.30.camel@wbam-laptop>


Hallo Simon,

Am 17.03.2011 um 15:45 schrieb Simon Siemens:
> Hallo Timo,
> 
> ich sehe den Punkt eher im Folgenden: Mir sind drei übliche Varianten
> bekannt, mit Headerdateien umzugehen:
> 
>     1. Eine Headerdatei bindet keine weiteren Headerdateien ein. Das
>        ist den C-Dateien überlassen. Dies entspricht in etwa deinem
>        Vorschlag, global.h in jede C-Datei einzubinden. Hier muss jede
>        C-Datei dann selbst wissen, in welcher Reihenfolge die Header
>        eingebunden werden müssen.
>     2. Eine Headerdatei bindet alle anderen Headerdateien ein, deren
>        Typen und Funktionen sie benutzt. Die Headerdatei ist dann in
>        sich geschlossen.
>     3. Bibliotheken (z.B. GTK+) benutzen auch teilweise das Schema,
>        dass der Anwender nur eine Headerdatei (gtk.h) einbinden soll,
>        die sich um die richtige Reihenfolge aller Headerdateien
>        kümmert.
> 
> Bisher schien mir, dass der ct-Bot-Code das zweite Schema umsetzt.
> Beispielsweise ist ct-Bot.h in fast allen anderen Headerdateien direkt
> eingebunden. Und auch global.h ist in vielen Headerdateien (adc.h,
> ena.h, fifo.h, ir-rc5.h, math_utils.h, motor.h, motor-low.h,
> pos_store.h, sensor.h, sp03.h srf10.h, tcp.h und twi.h). In der
> Konsequenz würde ich sagen, bei display.h fehlt sie. (Sonst müsste sie
> auch nicht in motor.h sein.)
> 
> *Es geht also lediglich um Konsistenz.* Das ganze ist dann relevant,
> wenn man nicht die bestehenden Behaviour-Codes benutzen will, sondern
> selbst welche schreiben will. Der Code soll sich dann wie aus einem Guss
> anfühlen und einfach zu handhaben sein.

ja du hast völlig Recht, dass das im Bot-Code nicht konsistent ist. Im devel-Zweig ist es schon ein wenig aufgeräumter, aber auch nicht vollständig. Letztlich hat das eben keine so hohe Priorität, solange alles funktioniert. 
Hinzu kommt, dass wir Eclipse als Editor benutzen, welches inaktive #if-Zweige automatisch ausblenden oder anders einfärben kann. Das ist extrem hilfreich bei den vielen #define-Konfigurationen im Bot-Code. Damit das auch für Header-Dateien vernünftig klappt, muss aber die Headerdatei, die den #ifdef-Schalter enthält, eingebunden sein, sonst kann der Eclipse-Indexer nicht beurteilen, welche Zweige aktiv sind und welche nicht. Gleiches gilt für die Makro-Expansion. Auch daher gibt es teilweise unnötige #includes in einigen Headerdateien. 
Grundsätzlich hat das Schema 2. die Nachteile, dass a) zirkuläre Abhängigkeiten entstehen können und b) mehr Zeit zum Compilieren benötigt wird, wenn eine Headerdatei durch viele Indirektionen x-mal eingebunden wird. Ich würde das daher lieber auf ein Minimum beschränken. Auch der bestehende Code müsste da noch mal stärker aufgeräumt werden (insbesondere bei den Verhalten ist das sonst nervig - daher gab es da bisher auch die meiste Aufräumaktivität). Blöd ist nur immer, wenn dann in einem per default abgeschaltetem Teil ein #include fehlt, was nicht sofort auffällt und dann bei jemand anderem zum Fehler führt. 

Gerade, wenn ihr Teile zusammen mit anderem Code nutzen wollt, ist es doch besser, wenn die Headerdateien von möglichst wenigen anderen abhängen. Hängen sie von anderen ab, die ihr evtl. gar nicht braucht, könnt ihr sie wegen der #includes trotzdem nicht weglassen. 

Variante 3. ist sicherlich perfekt, wenn sie unter allen Konfigurationen auch funktioniert, macht aber auch die meiste Arbeit. Der Bot-Code ist eigentlich nicht als Bibliothek designed, vieles (wie auch das Include-Schema), hat sich historisch einfach so entwickelt. 

> Was meinst du?

Wenn ihr die nötigen Headerdateien in euren C-Datein einbindet, seid ihr unabhängig davon, wenn im ct-Bot-Code mal aufgeräumt wird. So würde ich es jedenfalls machen, weil der Aufwand recht gering ist. 

Grüße,
Timo