Forum: PC-Programmierung Funktionen in C richtig Komentieren


von m. S. (marek)


Lesenswert?

Hi @ all,

ich hab da eine Frage. Ich bin fleißig am Programmieren setze auch schön 
Kommentare wie es sich gehört. Meine Frag jetzt eigentlich ist wie 
werden Funktionen Richtig kommentiert bzw. Beschrieben ich hab das 
Vergessen. Auf die Schnelle finde ich nichts im Internet wahrscheinlich 
weil ich die Falschen Schlagwörter verwende.
Ich weiß da gehört sowas wie  Rückgabetyp rein was die Funktion macht 
aber halt nicht mehr genau was alles. Kann mir jemand freundlicher weise 
eine link schicken oder so weiter helfen. Ich danke schon mal jetzt für 
eure Unterstützung.

mfg
m.s.

von Vlad T. (vlad_tepesch)


Lesenswert?

doxygen ist recht verbreitet und auch praktisch

von DirkB (Gast)


Lesenswert?

Du kannst diese Kästen mit * und - machen, oder du schaust nach einem 
Tool, das mit deinen Angaben eine hübsche Doku machen kann.
Dann musst du den Syntax von diesem Tool nehmen.

Wie Vlad schon schrieb, ist doxygen eine Möglichkeit.

von Sven H. (dsb_sven)


Lesenswert?

Wichtig bei Kommentaren:

Beschreibe nicht, was du machst, das sagt der Quellcode. (Ausnahme: Ein 
besonders ausgefuchster Algorithmus evtl.)
Beschreibe statt dessen, warum du etwas machst und in was für einem 
Zusammenhang es steht. Das sind die Dinge, die du dir nur denkst, die 
aber nicht im Quellcode zu sehen sind.

von m. S. (marek)


Lesenswert?

Jo danke für eure Hilfe.

mfg
m.s.

von Sven H. (dsb_sven)


Lesenswert?

Edit:
1
int tuWas()

Ein unnützter Kommentar wäre: "Die Funktion gibt einen Integer zurück."
Sinnvoll hingegen: "Die Funktion ist eine Hilfsfunktion, die die 
aktuelle Uhrzeit vom Zeitpunk des Programmstarts abzieht.

Rückgabewert: Die Differenz in Millisekunden."

Edit2:

Der Funktionsname ist auch schon denkbar ungeeignet ;-)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sven H. schrieb:
> Der Funktionsname ist auch schon denkbar ungeeignet

Wenn noch Funktionen wie machWas, lassWas und machNix dazukommen, 
wird das Namensquartett vollständig ...

von Jean P. (fubu1000)


Lesenswert?

Moin, für Doxygen habe ich mir diese Kommentar Einstellungen zusammen 
gefriemelt, falls interesse:
1
/**********************************************************************//**
2
<B>Function Name</B>    : UsbReceive
3
<BR><B>Description</B>  : when data is received in function 
4
                          "void EP3_OUT_Callback(void)"
5
                          in file usb_endp.c this function will 
6
                          call for data set
7
@param Input            : received data and the length of data 
8
                          for the ring puffer
9
@param Output           : None
10
@param Return           : None
11
*//***********************************************************************/
12
void UsbReceive(uint8_t* data, uint16_t size)
13
{
14
...
15
}


Gruß

von Vlad T. (vlad_tepesch)


Lesenswert?

Jean Player schrieb:
> <B>Function Name</B>    : UsbReceive
<BR><B>Description</B>  : when data is received in function

das ist ziemlich Sinnfrei, weil das Doxygen schom mitgeneriert und im 
Code direkt drunter steht.

die doppelpunkte sind auch ziemlich sinnlos, die stehen nachher am 
anfang des generierten Abschnitts

folgendes:
Jean Player schrieb:
> @param Input            : received data and the length of data
>                           for the ring puffer
> @param Output           : None
> @param Return           : None


produziert sogar jede menge Doxygen fehler.
Das ganze Beispiel ist ein gutes Beispiel dafür, wie man Doxygen nicht 
benutzt

von Olaf (Gast)


Lesenswert?

Zuerst mal, warum schreibt man nicht USB-Receive statt UsbReceive ?

Nur um der Konvention GroßbuchstabeZuAnfang zwanghaft zu folgen?

Dann, warum muss man sich dem Schema einer Dokumantationssoftware fügen?

Eine Beschreibung wie man sie anderen "erzählen" würde klingt doch 
irgendwie eingängiger:


Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld übergeben 
und die Datenfeldgröße. Der Rückgabewert ist void. Sie ruft ihrerseits 
die Funktion EP3_OUT_Callback() auf.


Wegen mir kann man auch noch den Zeigertyp und die den Datentyp für die 
Feldgröße dazuschreiben, z.B.

Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld vom Typ 
uint8_t übergeben und die Datenfeldgröße vom Typ uint16_t. Der 
Rückgabewert ist void. Sie ruft ihrerseits die Funktion 
EP3_OUT_Callback() auf.

von Benjamin U. (utzus)


Lesenswert?

Vlad Tepesch schrieb:
> Das ganze Beispiel ist ein gutes Beispiel dafür, wie man Doxygen nicht
> benutzt

sondern?

von Vlad T. (vlad_tepesch)


Lesenswert?

die Bescreibung selbst sit auch extrem sinnfrei.
Es bringt nix hinzuschreiben, von wo eine Funktion gecallt wird (das 
findet Doxygen auch alleine durch Codeanalyse heraus).
Man sollte schreiben, wozu die Funktion gut, wie sie es erledigt und 
eventuell wie aufwendig sie ist.

ein schöneres Beispiel aus dem Quellcode (den saubereren Teilen) der 
Word Clock:
1
/**
2
 *  Sets the given brightness and ignores further changes 
3
 *  of brightness until pwm_release_brightness is called.
4
 *
5
 *  @details  Other changes of brighness (other than with this function)
6
 *            will be recognized but not considerd.\n
7
 *            The change takes effect after pwm_release_brightness
8
 *            was called.
9
 *  @param val   the brightness to set [0..255]
10
 */
11
extern void                   pwm_lock_brightness_val(uint8_t val);

oder
1
/**
2
 *  sets the display to the given state
3
 *  @details This function can be used to set a special image on the display independent of current time
4
 *           This is especially usefull for provide some feesback for user interactions
5
 *           eg. set time, or set Color
6
 *           f_call: extern irregularly  (internal: when called setNewTime)
7
 *  @param    i_showStates   defined which words should be shown at all
8
 *  @param    i_blinkstates  defines which words should blink with DISPLAY_BLINK_INT_ms
9
 *                           only words that should be displayed will blink 
10
 *                           words_that_will_blink = blinkstates & showStates
11
 */
12
extern void    display_setDisplayState( DisplayState i_showStates, DisplayState i_blinkstates);

von Arc N. (arc)


Lesenswert?

Olaf schrieb:
> Zuerst mal, warum schreibt man nicht USB-Receive statt UsbReceive ?

Konvention, Style-Guide, Bindestrich nicht erlaubt (bzw. theoretisch 
erlaubt, Quelltext aber nur ASCII d.h. Bindestrich = Minus), was ist 
wenn z.B. lokale Variablen mit einer Abkürzung anfangen z.B. 
uSBIrgendwas, dann ist es einfacher (und sieht besser aus) auch 
Abkürzungen generell mit Kleinbuchstaben zu schreiben: usbIrgendwas

> Dann, warum muss man sich dem Schema einer Dokumantationssoftware fügen?
>
> Eine Beschreibung wie man sie anderen "erzählen" würde klingt doch
> irgendwie eingängiger:
>
>
> Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld übergeben
> und die Datenfeldgröße. Der Rückgabewert ist void. Sie ruft ihrerseits
> die Funktion EP3_OUT_Callback() auf.

Das ist redundant
Die Typen stehen da schon, der Aufruf ist auch ersichtlich

> Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld vom Typ
> uint8_t übergeben und die Datenfeldgröße vom Typ uint16_t.

Auch überflüssig, wenn die Parameternamen selbstsprechend sind

von Vlad T. (vlad_tepesch)


Lesenswert?

Olaf schrieb:
> Dann, warum muss man sich dem Schema einer Dokumantationssoftware fügen?
weil man dann daraus ganz einfach ansprechende, übersichtliche 
Dokumentationen für Bibliotheken erzeugen kann

>
> Eine Beschreibung wie man sie anderen "erzählen" würde klingt doch
> irgendwie eingängiger:

nicht wirklich.
einer stichpunktartigen Auflistung, die immer nach dem gleichen Schema 
aufgebaut wird, kann man viel schneller Informationen entnehmen, als 
wenn man erst sätzeweise Prosa durchforsten muss.

und Funktionen von anderen beschrieben zu bekommen bringt meiner Meinung 
nach, auch nicht wirklich viel.
Wenn das nötig ist, um den Code zu verstehen, ist dieser schlecht 
geschrieben oder nicht aussagekräftig genug dokumentiert.

von Olaf (Gast)


Lesenswert?

Arc Net (arc) schrieb:

Olaf schrieb:
>> Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld übergeben
>> und die Datenfeldgröße. Der Rückgabewert ist void. Sie ruft ihrerseits
>> die Funktion EP3_OUT_Callback() auf.

> Das ist redundant
> Die Typen stehen da schon, der Aufruf ist auch ersichtlich

>> Der Funktion UsbReceive() wird ein Zeiger auf ein Datenfeld vom Typ
>> uint8_t übergeben und die Datenfeldgröße vom Typ uint16_t.

> Auch überflüssig, wenn die Parameternamen selbstsprechend sind

Redundant != überflüssig oder betrachtest du redundante 
Sicherheitssystem als "überflüssig"?

Zu erst einmal, worüber sprechen wir hier eigentlich? Über eine 
Dokumentation für den Arbeitgeber oder andere "Fremde Leute" oder 
sprechen wir hier über die Dokumentation die einem selber dient, um sich 
im eigenen Programm bei Gelegenheit wieder zurechtzufinden? Das ist 
nämlich nicht das gleiche. Für mich liest sich so eine "humanoid 
gestaltete" Beschreibung wie im Beispiel von mir wesentlich eingängiger, 
als eine Abstrakte Schnittstellenbeschreibung. Ich würde vielleicht noch 
dazuschreiben was die Funktion genau macht. Mir gehen diese Texte auf 
den Keks, die selber eher komplizierter sind als ein Blick in den 
Quelltext, sowas möchte ich nicht haben.

Gib also mal ein Beispiel an wie DU es besser machen würdest, anstatt 
einfach nur zu schreiben "ist redundant, also überflüssig". Und bedenke 
auch mal, dass viele Fehler gerade im Umgang mit Zeigern geschehen, 
deshalb habe ich eine verbale Formulierung wie oben gerne beleitend mit 
drin. Es ist nicht jeder ein SW-Crack wie du es vielleicht bist.

von Olaf (Gast)


Lesenswert?

Vlad Tepesch (vlad_tepesch) schrieb:

>> Eine Beschreibung wie man sie anderen "erzählen" würde klingt doch
>> irgendwie eingängiger:

> nicht wirklich.
> einer stichpunktartigen Auflistung, die immer nach dem gleichen Schema
> aufgebaut wird, kann man viel schneller Informationen entnehmen, als
> wenn man erst sätzeweise Prosa durchforsten muss.

Das will ich erst mal sehen. Gib mal dein Beispiel an.

von Vlad T. (vlad_tepesch)


Lesenswert?

Olaf schrieb:
> Redundant != überflüssig oder betrachtest du redundante
> Sicherheitssystem als "überflüssig"?
Was hat das ganze mit Sicherheit zu tun?
redundante Information == überflüssige Information
irgendwann passiert es zwangsläufig, dass man vergisst eins mitzuändern 
und schon sind die Infos nicht mehr redundant, sondern widersprüchlich.

Olaf schrieb:
> Das will ich erst mal sehen. Gib mal dein Beispiel an.

bist du blind?
Ein besipiel habe ich doch gepostet?
warum soll ich im Text (wo ich es erst suchen müsste) schreiben, dass 
der Rückgabewert void ist, wenn genau dass eine Zeile drunter in der 
Deklaration bereits steht?
selbiges gilt für die Typen der Argumente.
da ist es nicht wichtig zu schreiben, was für ein Typ ist es - das steht 
bereits da, sondern was bewirkt das Argument und eventuell 
Metainformationen zum Argument, die die Sprache nicht direkt 
unterstützen, wie zB eingeschränkte Wertebereiche, Umrechnungsfaktoren,

von P. S. (Gast)


Lesenswert?

Vlad Tepesch schrieb:

> und Funktionen von anderen beschrieben zu bekommen bringt meiner Meinung
> nach, auch nicht wirklich viel.
> Wenn das nötig ist, um den Code zu verstehen, ist dieser schlecht
> geschrieben oder nicht aussagekräftig genug dokumentiert.

Das ist der groesste Unsinn, der je verbreitet wurde und kostet jedes 
Jahr Milliarden. Es waere schon, wenn Leute die sowas glauben nie ein 
Handbuch gelesen haetten, denn dann wuerden sie ueberhaupt keine 
Programme schreiben koennen und die Welt mit ihrem Mist verschonen. In 
Wirklich dient diese "Philosophie" aber nur eine faule Ausrede 
selbstverliebter Hacker - eigener Code ist stets Prosa und muss nicht 
dokumentiert werden, fremder Code ist prinzipiell einfach nur Muell, 
sonst wuerde man ihn ja ohne Dokumentation verstehen.

Es gibt genau 2 Situationen, bei denen ich mit fremdem Code in Kontakt 
komme:

1) Wenn ich ihn benutze. Dann muss ich auf keinen Fall in den Code 
gucken, da ich lediglich mit der Schnittstellenbeschreibung arbeite und 
mich auch nur darauf verlassen darf, was die Funktion eventuell sonst 
noch tut.

2) Wenn ich ihn warte - dann ist die Dokumentation die Referenz und 
niemals der Code.

Das Wort "selbsterklaerend" gehoert in der Informatik verboten - selbst 
einfachste Funktionen sind das nicht. Wer das glaubt, hat schlicht nicht 
genug Erfahrung. Schon triviale Funktionen stecken voller 
Randbedingungen, die dokumentiert werden muessen. Oft ist sogar viel 
wichtiger, was eine Funktion nicht kann oder wann sie nicht 
funktioniert, als die Beschreibung ihres Hauptzwecks.

Leider ist es so, dass sich in der Informatik selbst die groessten 
Gruenschnaebel fuer grossartige Hacker halten. Ich weiss nicht woran es 
liegt, aber wohl nirgends sonst ist der Gottkomplex so verbreitet. Und 
so wird wild drauflos gehackt, ja nicht auf andere gehoert oder 
Ruecksicht genommen. Das Forum hier ist das beste Beispiel dafuer.

von (prx) A. K. (prx)


Lesenswert?

Peter Stegemann schrieb:

> 2) Wenn ich ihn warte - dann ist die Dokumentation die Referenz und
> niemals der Code.

Noch nie über Code gestolpert, desse exzellente Dokumentation dem realen 
Code ein paar Jahre hinterher hinkte (Betonung auf "hinkte")?

> Leider ist es so, dass sich in der Informatik selbst die groessten
> Gruenschnaebel fuer grossartige Hacker halten. Ich weiss nicht woran es
> liegt, aber wohl nirgends sonst ist der Gottkomplex so verbreitet.

Auf die Idee, einen kilometergrossen Beschleunigerring in den Boden zu 
buddeln kommt man ausserhalb finanzkräftiger Institute nicht so schnell. 
In solchen Bereichen kommt für Normalmenschen einfach nichts bei raus. 
Fürs Programmieren braucht man jedoch nur einen einfachen Computer. Und 
irgendwann kommt sogar was dabei raus, was von Aussen nicht sofort nach 
Müll aussieht.

Also kann da jeder ran. Und mokiert sich anschliessend lautstark im 
Forum drüber, dass das doch nun wirklich jeder könne, wozu also 
Informatik. ;-)

von Olaf (Gast)


Lesenswert?

Vlad Tepesch (vlad_tepesch) schrieb:

> bist du blind?
> Ein besipiel habe ich doch gepostet?

Naja, ehrlich gesagt mit deiner Doku (deinem Beispiel) kann ich auch 
nicht viel anfangen. So würde ich nicht kommentieren.

Ich hab übrigens Redundanz ganz gerne. Liegt wohl daran, dass ich mir 
Sätze auch gerne zwei mal oder mehrfach durchlese bis der Groschen 
gefallen ist. Ihr mit euerm IQ > 150 braucht das wohl nicht. ;)

@ Peter Stegemann (pst)

Was du schreibst klingt für mich schon viel nachvollziehbarer.

von einer mit Gottkomplex (Gast)


Lesenswert?

Mahlzeit,

mal ein paar Bemerkungen zu obigen Beiträgen/verwendeten Begriffen:

"selbsterklärend":
Natürlich sollte ein Programmtext selbsterklärend sein! Wer ein Programm 
nicht versteht, sollte erst mal einen Informatikkurs besuchen bzw. sich 
ein entsprechendes Buch o.ä. besorgen.
Und ist ein Stück Quelltext auf den ersten Blick nicht selbserklärend, 
weil Ideeblitz kurz vor dem Einschlafen und man vergißt ja auch mit der 
Zeit wieder etwas, dann kommentiert man genau diese Stelle.

"nur die Dokumentation ist relevant und lese ich...":
Ja klar hoffentlich hat derjenige auch wirklich alles vollständig und 
fehlerfrei beschrieben... --> Programmierer sind zwar Götter, aber auch 
nur Menschen!
Wenn der Code nicht das macht, was in der Beschreibung steht, dann 
wirfst du ihn wieder raus? Nicht schlecht, hoffentlich machst du das 
nicht so oft, denn das kostet auch ein paar Millarden (global 
gesehen...).

(wiederverwendbare) "Schnittstellenbeschreibung":
Da gebe ich recht, da sollte eine vorhandene Beschreibung schon das 
widerspiegeln, was die Funktion macht und wie sie einzusetzen ist. Am 
Besten macht man das, meiner Meinung, auch über ein kommentiertes 
Beispiel!

"Wartung":
Wann spricht man von Code-Wartung?
Dann wenn ein Fehler auftritt. (Dann stimmt auch die eventuell 
vorhandene Beschreibung nicht!)
Wenn eine Funktion erweitert/geändert werden soll.
In beiden Fällen sollte man dann den (hoffentlich 
selbsterklärenden)Programmtext verstehen oder die Finger von lassen und 
den ursprünglichen Autor kontaktieren!


Grüße von einem, der seit 25 Jahren Gottkomplexe hat...

von P. S. (Gast)


Lesenswert?

A. K. schrieb:
> Peter Stegemann schrieb:

>> 2) Wenn ich ihn warte - dann ist die Dokumentation die Referenz und
>> niemals der Code.
> Noch nie über Code gestolpert, desse exzellente Dokumentation dem realen
> Code ein paar Jahre hinterher hinkte (Betonung auf "hinkte")?

Doch. Und warum? Weil die 2 Regeln ignoriert wurden.

> Also kann da jeder ran. Und mokiert sich anschliessend lautstark im
> Forum drüber, dass das doch nun wirklich jeder könne, wozu also
> Informatik. ;-)

Ich habe leider feststellen muessen, dass auch ein Studium oder eine 
Lehre bei dem Problem nicht hilft. Auch viel Jahre Praxis hilft leider 
bei vielen Entwicklern nicht. Vieleicht liegt es daran, dass man in der 
Branche zu selten auf die eigenen Hinterlassenschaften stoesst.

von Kleines Beispiel (Gast)


Lesenswert?

Sowas:
1
  int zwerg;
2
  int dwarf;
gibt 'nen Anschiss vom Scheff...

So hingegen überlebts den Codereview:
1
  int zwerg; // ZWischenERGebnis
2
  int dwarf; // Data With(out) A Reasonable Function

von Vlad T. (vlad_tepesch)


Lesenswert?

Peter Stegemann schrieb:
>[...]

kann es sein, dass du mich falsch verstanden hast?
Ich habe von code erklären geredet, nicht code dokumentieren.
Die Aussage war, dass es besser ist, Code so zu dokumentieren, wie man 
ihn erklären würde: in Prosa.
die Deklaration einer Schnittstelle in Prosa zu wiederholen ist in jedem 
Fall sinnlos.

> Es gibt genau 2 Situationen, bei denen ich mit fremdem Code in Kontakt
> komme:
>
> 1) Wenn ich ihn benutze. Dann muss ich auf keinen Fall in den Code
> gucken, da ich lediglich mit der Schnittstellenbeschreibung arbeite und
> mich auch nur darauf verlassen darf, was die Funktion eventuell sonst
> noch tut.
>
> 2) Wenn ich ihn warte - dann ist die Dokumentation die Referenz und
> niemals der Code.
genau das ist das Ziel einer Dokumentation.

wenn du darauf angewiesen bist, dass dir zusätzlich zu dieser 
Dokumentation noch jemand den Code erklärt, dass ist der Code oder die 
Dokumentation schlecht.

>
> Das Wort "selbsterklaerend" gehoert in der Informatik verboten - selbst
> einfachste Funktionen sind das nicht.
Code sollte selbst sprechen. in vielen Fällen könnte man Kommentare 
vermeiden, wenn man den Code besser schreibt:

Beispiel:
Gut:
1
  if(   (data.flags & DF_successfulRead)   // data processing was successful
2
     && (data.flags & DF_successfulStored)
3
     && (data.flags & DF_successfulSend) )
4
  { ... }

besser:
1
  if( dataProcessingSuccessful(&data) )
2
  {...}

> Wer das glaubt, hat schlicht nicht genug Erfahrung.
wie obiges Beispiel zeigt, könnte aber auch der umgekehrte Fall gelten.
> Schon triviale Funktionen stecken voller Randbedingungen,
> die dokumentiert werden muessen.
Randbedingungen müssen natürlich dokumentiert werden.

> Oft ist sogar viel
> wichtiger, was eine Funktion nicht kann oder wann sie nicht
> funktioniert, als die Beschreibung ihres Hauptzwecks.
sicher, das und die Randbedingungen gehören zur 
Schnittstellendokumentation der Funktion, nicht in die eigentlichen 
Code-Kommentare

von Vlad T. (vlad_tepesch)


Lesenswert?

Olaf schrieb:
> Vlad Tepesch (vlad_tepesch) schrieb:
>
>> bist du blind?
>> Ein besipiel habe ich doch gepostet?
>
> Naja, ehrlich gesagt mit deiner Doku (deinem Beispiel) kann ich auch
> nicht viel anfangen. So würde ich nicht kommentieren.

was gefält dir denn daran weniger gut als:
"Die funktion pwm_lock_brightness_val ist als extern definiert, bekommt 
ein uint8_t als Eingangsparameter und hat keinen Rückgabewert"
?

Es werden in einer definierten Art und Weise eine Kurzbeschreibung für 
Übersichten, eine Langbeschreibung mit (gewollten) Seiteneffekten, zur 
verwendung, sowie detailierte Informationen zu den Parametern gegeben

>
> Ich hab übrigens Redundanz ganz gerne. Liegt wohl daran, dass ich mir
> Sätze auch gerne zwei mal oder mehrfach durchlese bis der Groschen
> gefallen ist.
> Ihr mit euerm IQ > 150 braucht das wohl nicht. ;)
genau das ist doch der Punkt:
warum sollte ich Sätze lesen wollen, deren Verschachtelung und Struktur 
der in mir integrierte Syntaxparser erst zerlegen muss (und die ich 
dafür, je nach Autor, auch mal mehrmals lesen muss), wenn ich 
stattdessen auf eine klar und immer ähnlich aufgebaute Struktur schauen 
kann und sofort weiß, da steht die Information, die ich gerade benötige.

Angenommen, ich weiß, wie die Funktion heißt und was sich macht, will 
nur noch wissen, wie die Inputs formatiert sind.
Dann schau ich auf den Kommentar, sehe die @input tags, und lese die 
Beschreibung. Anderernfalls gehe ich zum Kommentar, lese erstmal 
mindestens (bei vernünftiger Dokumentation) 7-10 Zeilen Prosa in denen 
die Info eingeflochten ist.



Kleines Beispiel schrieb:
> Sowas:
>   int zwerg;
>   int dwarf;
> gibt 'nen Anschiss vom Scheff...
>
> So hingegen überlebts den Codereview:
>   int zwerg; // ZWischenERGebnis
>   int dwarf; // Data With(out) A Reasonable Function
Also so ein Englisch-Deutsch-Mischmasch würde bei uns kein Codereview 
überleben

von Olaf (Gast)


Lesenswert?

> die Deklaration einer Schnittstelle in Prosa zu wiederholen ist in jedem
> Fall sinnlos.

Prosa liest sich aber viel schöner :) und ist vor allem auf Anhieb 
fehlerfreier als dein Doxygen wie du selber festgestellt hast

"produziert sogar jede menge Doxygen fehler.
Das ganze Beispiel ist ein gutes Beispiel dafür, wie man Doxygen nicht
benutzt"

Ist also ein Tool das selber wieder anfällig für (neue) Fehler ist. Dann 
lieber ein bisschen Prosa samt Erläuterung (die ich weglies; hatte ja 
auch keine Info darüber). Ist eh nur für mich. Aber ihr stilisiert ja 
gerne jeden noch so unbedeutenden Akt zum Weltereignis hoch. By the way, 
ist eigentlich die hungary notation schon out? MS hat die doch gerne 
verwendet und hier in meinem Büchlein steht se auch noch drin.

> So hingegen überlebts den Codereview:

>  int zwerg; // ZWischenERGebnis
>  int dwarf; // Data With(out) A Reasonable Function

ist auch nicht besser als vorher

Zwischenergebnis

int i_tmp, j_tmp, tmp_data, tmp_value;

sonstiges Datum

irgend einen Sinn wird dein Datum schon haben, also benenne es doch nach 
diesem (Sinn)

bFlagPleite
Kto_stand
nTage_bis_Raeumung
percentVal

von Jean P. (fubu1000)


Angehängte Dateien:

Lesenswert?

Vlad Tepesch schrieb:
> Jean Player schrieb:
>> <B>Function Name</B>    : UsbReceive
> <BR><B>Description</B>  : when data is received in function
>
> das ist ziemlich Sinnfrei, weil das Doxygen schom mitgeneriert und im
> Code direkt drunter steht.

Naja das mag jeder sehen wie er will.

> die doppelpunkte sind auch ziemlich sinnlos, die stehen nachher am
> anfang des generierten Abschnitts

Nö, das ist Schwachsinn! Siehe meinem Anhang.

> Jean Player schrieb:
>> @param Input            : received data and the length of data
>>                           for the ring puffer
>> @param Output           : None
>> @param Return           : None
> produziert sogar jede menge Doxygen fehler.
> Das ganze Beispiel ist ein gutes Beispiel dafür, wie man Doxygen nicht
> benutzt

Auch das ist Schwachsinn, lerne erstmal Doxygen zu bedienen.
Ansonsten würde wohl kaum mein Anhang generiert werden.

Zudem siehst du , das ein Link automatisch zu der Datei usb_endp.c 
erzeugt wird , von der Sie aufgerufen wird, also sinnvoll, das 
einzutragen.
Meine Meinung zumindest.

Gruß

von Vlad T. (vlad_tepesch)


Lesenswert?

Olaf schrieb:
> Ist also ein Tool das selber wieder anfällig für (neue) Fehler ist.
Im Gegenteil:
Es sagt dir, wenn deine Dokumentation fehler enthält, wie zB die 
dokumentation eines Rückgabewertes, wo keiner ist.
Oder die fehleden Dokumentation eines Parameters.

In Java erzeugt sowas sogar standardmäßig Warnungen, ohne Zusatztools

> By the way,
> ist eigentlich die hungary notation schon out? MS hat die doch gerne
> verwendet und hier in meinem Büchlein steht se auch noch drin.
Ja sie ist out.
Ich hab mal gelesen oder gehört, dass sie nie so gemeint war, wie sie 
umgesetzt wurde.
den Typ einer Variable vorranzustellen ist sinnlos.
Bei einer Typänderung muss alles  umbenannt werden.
Außerdem zeigt jede moderne IDE die Deklaration an, wenn man über eine 
Variable geht.
Sinn machen Präfixes dennoch.
zB um bei Funktionen read only, write only und read/write Parameter zu 
kennzeichnen (i_ o_ io_) Das kann nämlich auch keine IDE.
oder auch um auf Besonderheiten hinzuweisen, wie einen besonderen Scope, 
wie global, oder statische (g_ s_ gs_).
Aber das ist Geschmackssache.


Olaf schrieb:
> bFlagPleite
> Kto_stand
> nTage_bis_Raeumung
> percentVal

die Verwendung deskriptiver Variablennamen ist doch schon ein guter 
Schritt - das spart auch Kommentare
Ich würde aber konsequent auf lower camel case setzen und Unterstriche 
nur in Makros und zur Abtrennung von Prefixes zu verwenden

von (prx) A. K. (prx)


Lesenswert?

Microsoft als Vorbild für Programmierkonventionen zu verwenden ist 
ohnhin etwas mutig. Denen haben wird immerhin zu verdanken, dass auch 
64-Bit Prozessoren eine Wortbreite von 16 Bits haben und man dank dieser 
ungarischen Notation in fast jeder einzelnen verdammten Quellcodezeile 
an jene uralten Zeiten erinnert wird, in denen das mal stimmte.

von Vlad T. (vlad_tepesch)


Lesenswert?

Jean Player schrieb:
>> das ist ziemlich Sinnfrei, weil das Doxygen schom mitgeneriert und im
>> Code direkt drunter steht.
>
> Naja das mag jeder sehen wie er will.

Jean Player schrieb:
>> die doppelpunkte sind auch ziemlich sinnlos, die stehen nachher am
>> anfang des generierten Abschnitts
>
> Nö, das ist Schwachsinn! Siehe meinem Anhang.

ja ok, vor deinen Doppelpunkten steht text.
würdest du schreiben
@details : sasdsad
würden die Doppelpunkte am Anfang des Absatzes stehen

Jean Player schrieb:
>> produziert sogar jede menge Doxygen fehler.
>> Das ganze Beispiel ist ein gutes Beispiel dafür, wie man Doxygen nicht
>> benutzt
>
> Auch das ist Schwachsinn, lerne erstmal Doxygen zu bedienen.
> Ansonsten würde wohl kaum mein Anhang generiert werden.

Dann schau dir mal die Meldungen an, den Doxygen produziert.
Da wird etwas stehehn, wie (den genauen Wortlaut kenne ich nicht)
Warning function UsbReceive does not have parameter Input
Warning function UsbReceive does not have parameter Output
Warning function UsbReceive does not have parameter Return
Warning No documentation for parameter data in function UsbReceive found
Warning No documentation for parameter size in function UsbReceive found


Doxygen ist was Warnungen angeht leider zu tolerant und erzeugt trotzdem 
jede menge Output.

Jean Player schrieb:
> Zudem siehst du , das ein Link automatisch zu der Datei usb_endp.c
> erzeugt wird , von der Sie aufgerufen wird, also sinnvoll, das
> einzutragen.
> Meine Meinung zumindest.

wenn du im  "Caller Graph" schauen würdest, würdest du sofort sehen, wer 
die Funktion aufruft, kannst draufklicken und die auch die Sourcen 
anschauen, insofern in die Dokumentation inkludiert.
und das ganz ohne jeden Aufruf jeder Funtkion in jedem Kommenar von Hand 
nachzupflegen. Das funktioniert auf Dauer nämlich nicht - und erst recht 
nicht in größeren SW-Projekten und erst recht nicht, wenn mehr als einer 
daran arbeitet.

von Vlad T. (vlad_tepesch)


Lesenswert?

A. K. schrieb:
> Microsoft als Vorbild für Programmierkonventionen zu verwenden ist
> ohnhin etwas mutig. Denen haben wird immerhin zu verdanken, dass auch
> 64-Bit Prozessoren eine Wortbreite von 16 Bits haben und man dank dieser
> ungarischen Notation in fast jeder einzelnen verdammten Quellcodezeile
> an jene uralten Zeiten erinnert wird, in denen das mal stimmte.

das ist ja eher der Abwärtskompatibilität der WinAPI geschuldet

von m. S. (marek)


Lesenswert?

Man hab ich mit meiner Frage ne diskusion breitgetreten ist aber echt 
interesant.

mfg
m.s.

von MaWin (Gast)


Lesenswert?

> Funktionen in C richtig Komentieren

Mit 2 m

> Meine Frag jetzt eigentlich ist wie
> werden Funktionen Richtig kommentiert

Im Prinzip: Gar nicht.
Wenn es dir nicht gelingt, in C verständlichen Code zu schreiben,
wirst du auch keinen verständlichen Kommentar dazu verfassen können.

Wenn du jedoch beim Schreiben der Funktion schon bemerkst,
daß es ein merkwürdiges unverständliches Verhlaten hat,
welches später mal zu Problemen führen könnte, DANN solltest
du dazu einen Kommentar schreiben.

Das sollte bei einem guten Programm aber eher selten der Fall sein.

Merke: Was im Kommentar steht, ist meinstens doppelt gemoppelt,
es steht doch viel genauer schon im Code dadrunter.
Und meistens ist es dann auch noch flasch, denn 2 Sätze sagen selten 
dasselbe aus.

Manchmal kann es nützlich sein, Dinge graphisch aufzuschreiben
"ein Bild sagt mehr als 1000 Worte" doch dazu hilft dir die
Koomentarfunktion selten weil in ACSII eben schlecht zu zeichnen ist.

von (prx) A. K. (prx)


Lesenswert?

Vlad Tepesch schrieb:

> das ist ja eher der Abwärtskompatibilität der WinAPI geschuldet

Eben. Benenne die Dinger nach der Funktion, nicht nach der Grösse. Die 
Funktion bleibt, die Grösse aber oft nicht. Wenn jede Variable die 
Grösse mitschleppt, dann musst du queerbeet durch den ganzen Code 
sämtliche Variablen umbenennen, die einfach bloss die natürliche 
Wortgrösse der Maschine reflektieren, wenn du von n-Bit auf k-Bit 
Maschinen portierst. Was für ein Blödsinn.

Sowas gehört in den Datentyp und nur dorthin. Dort kannst du per typedef 
solche Abhängigkeiten sauber an zentraler Stelle klären. Wenn du dann 
den typedef an dieser zentralen Stelle von dw auf qw vergrösserst und 
die ungarischen Variablen auf dw lässt, dann hast du verloren weil 
Verarsche, und wenn du sie umbenennst heisst du Sysiphos.

von Olaf (Gast)


Lesenswert?

Vlad Tepesch (vlad_tepesch) schrieb:

.. hungary notation schon out?

> Ja sie ist out.
> Ich hab mal gelesen oder gehört, dass sie nie so gemeint war, wie sie
> umgesetzt wurde.

> den Typ einer Variable vorranzustellen ist sinnlos.
> Bei einer Typänderung muss alles  umbenannt werden.

Na komm, letzteres ist doch mit jedem Editor in Windeseile erledigt.
In älteren MS Fibeln findet man schon noch Ansätze der HN wie

iLength, iTime, iDate, iCmdShow (aus Win32-Code)
pText (p = pointer)

Also ich deklariere einen
- String noch immer gerne als: strHlp
- ein Zeichen als chKeybrd oder cKeybrd

Olaf schrieb:
>> bFlagPleite
>> Kto_stand
>> nTage_bis_Raeumung
>> percentVal

> die Verwendung deskriptiver Variablennamen ist doch schon ein guter
> Schritt - das spart auch Kommentare

gefällt mir auch sehr gut ;)

> Ich würde aber konsequent auf lower camel case setzen und Unterstriche
> nur in Makros und zur Abtrennung von Prefixes zu verwenden

gelingt mir nicht so streng das einzuhalten

Zugegeben, bei der Kommentierung hadere ich oft genug noch mit mir.

Huch .. jetzt ist Gewitter ; schluss vorerst ;)

von Vlad T. (vlad_tepesch)


Lesenswert?

@A.K.
die Typen hätten sie aber auch nicht ändern können, da ja die 
Binärkompatibilität sonst nicht gewart wäre - unabhängig von der 
benennung

von (prx) A. K. (prx)


Lesenswert?

Olaf schrieb:

> Na komm, letzteres ist doch mit jedem Editor in Windeseile erledigt.

Keineswegs einfach, denn du änderst den zentral definierten Datentyp und 
musst dann zwecks Umbenennung in sämtlichen Quellcodefiles nach allen 
Variable dieses Typs suchen.

Ausserdem macht dieses Verfahren es unmöglich, Code zu schreiben, der 
unabhängig von Wortbreiten einsetzbar ist. Statt dessen brauchst du 
diverse Versionen, die sich funktional überhaupt nicht unterscheiden, 
nur im Typ und im ungarischen Präfix.

> Also ich deklariere einen
> - String noch immer gerne als: strHlp
> - ein Zeichen als chKeybrd oder cKeybrd

Vertretbar ist es, Typen unterschiedlicher Funktion zu differenzieren. 
Also Integers, Booleans, Strings voneinander zu unterscheiden.

von Karl H. (kbuchegg)


Lesenswert?

Olaf schrieb:
> Vlad Tepesch (vlad_tepesch) schrieb:
>
> .. hungary notation schon out?

Ja.
Weil so, wie speziell MS das verbreitet hat, war das nie gedacht.

Die Präfixe sollten in der Originalidee eine Funktionalität anzeigen und 
keinen Datentyp. Aus bereits genannten Gründen, ist die Datentypidee 
ziemlicher Schwachsinn. Oder wer behält schon den Überblick welches 2 
Buchstabenkürzel jetzt für welche der 100 Strukturen/Klassen steht?
Wenn du HN brauchst um deinen Code lesbar zu machen, dann machst du was 
falsch. Vernünftige Variablennamen bringen wesentlich mehr als dieses HN 
gedöns. Das einzige was bei mir aus der MS_HN Zeit übrig geblieben ist, 
ist das kleine p, mit dem der Name einer Pointervariablen anfängt. Ist 
im Grunde auch nicht wirklich notwendig, weil mir der Compiler schon 
sagt ob ich -> richtig anwende oder ob es nicht doch ein . sein müsste, 
aber es spart ein paar Compilerläufe ein, bis man es richtig hat.

Code ist nie vollständig selbsterklärend, weil die Nebenbedingungen so 
nicht ersichtlich sind. Das ist aber kein Grund, dass man nicht danach 
streben sollte.

So was:
>   int zwerg;
>   int dwarf;
> gibt 'nen Anschiss vom Scheff...
>
> So hingegen überlebts den Codereview:
>   int zwerg; // ZWischenERGebnis
>   int dwarf; // Data With(out) A Reasonable Function
ist einfach nur Unsinn. Wenn du neben eine Variable ein oder zwei Wörter 
brauchst um anzuzeigen, welchen Zweck diese Variable erfüllt, dann 
kannst du gleich einen andern Variablennamen wählen, der den Kommentar 
überflüssig macht. Das kommt dann automatisch auch allen verwendenden 
Stellen im Code zu gute. Das heißt nicht, dass Kommentare neben 
Deklarationen generell überflüssig sind. Aber da gehören Wertebereiche 
hin, Nebenbedingungen etc. Verwendet man in Variablennamen Abkürzungen, 
dann sollten die geläufig sein. Mwst ist in einer kaufmännischen 
Software sicherlich als Kürzel für Mehrwertsteuer zulässig. Drm als 
Kürzel Drehmoment wird hingegen Probleme machen, es sei dann das ganze 
Team ist auf dieses Kürzel geeicht.

Meine Meinung zur Schnittstellenbeschreibung in Prosa:
Ich halte es da mit Vlad. Eine Prosabeschreibung der Datentypen der 
Parameter bringt genau gar nichts. Im besten Fall sagt sie dasselbe aus, 
was ich auch im C-Funtionsheader lesen kann. Im schlimmsten Fall ist sie 
einfach nur falsch. Der Funktionsheader hat aber den entscheidenden 
Vorteil, dass sich der Compiler danach richtet. Die Prosabeschreibung 
hingegen ist ihm sowas von schnuppe.
Das hier
> "Die funktion pwm_lock_brightness_val ist als extern definiert,
> bekommt ein uint8_t als Eingangsparameter und hat keinen Rückgabewert"
erzählt mir nichts, was ich nicht auch durch Studium des Headerfiles 
bzw. der aus dem Code generierten Doku erfahren würde.
1
extern void pwm_lock_brightness_val(uint8_t val);
Nur hat diese Zeile aus dem Header File den Vorteil, dass sie für den 
Compiler verbindlich ist. Aber ansonsten enthält sie genau dieselbe 
Information wie der Prosatext.

Alte Datenbankweisheit: speichere dieselbe Information nie 2 mal ab. 
Denn irgendwann werden die beiden Informationen auseinanderlaufen, 
obwohl sie es nicht sollten.

von Vlad T. (vlad_tepesch)


Lesenswert?

Jean Player schrieb:
> lerne erstmal Doxygen zu bedienen.
> Ansonsten würde wohl kaum mein Anhang generiert werden.

was ich dazu noch sagen wollte:
Ich kann sehr wohl mit Doxygen umgehen.
Ich habe schon recht umfangreiche Dokumentation damit erstellt.
Sogar Fehler im Code gefunden und Fixes vorgeschlagen.

Hier nochmal zum Nachlesen, wegen dem @param:
http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Wenn du HN brauchst um deinen Code lesbar zu machen, dann machst du was
> falsch. Vernünftige Variablennamen bringen wesentlich mehr als dieses HN
> gedöns. Das einzige was bei mir aus der MS_HN Zeit übrig geblieben ist,
> ist das kleine p, mit dem der Name einer Pointervariablen anfängt.

Stimmt nicht ganz, wenn ich es recht bedenke.
Einige wissen, dass ich im Bereich CAD unterwegs bin. Und da gibt es 
normalerweise mehere Koordinatensyteme: da ist zum einen das lokale 
Koordinatensystem des jeweiligen Objektes, das absolute 
Koordinatensystem und noch diverse andere Koordinatensysteme je nach 
Arbeitsebenen etc.

Nach vielen Fehlern, bei denen oft nicht klar war in welchem System ein 
Vector vorliegt, habe ich angefangen die jeweiligen Variablen mit einem 
Präfix zu versehen, aus dem hervorgeht, in welchem System der Vector 
vorliegt. Ein Ausdruck
1
     locCorner = absInputPos * locNormal * displacement;
kann daher schon deshalb nicht richtig sein, weil hier "loc"ale 
Koordinaten mit "abs"oluten Koordinaten vermischt werden. Da müssen also 
Umrechnungen rein.
1
     locCorner = AbsToLoc( absInputPos ) * locNormal * displacement;
und erst jetzt kann das aus formalen Gründen hinkommen. Da muss ich noch 
nicht einmal geometrisch überlegen, ob die erste Variante überhaupt 
richtig sein kann. Die HN sagt mir, dass sie es nicht ist.

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Die HN sagt mir, dass sie es nicht ist.

das ist aber nicht mehr das, was man heute als HN versteht

von Karl H. (kbuchegg)


Lesenswert?

Vlad Tepesch schrieb:
> Karl Heinz Buchegger schrieb:
>> Die HN sagt mir, dass sie es nicht ist.
>
> das ist aber nicht mehr das, was man heute als HN versteht

:-)
Das ist aber das, was ursprünglich vom Autor als HN gedacht war.

von Vlad T. (vlad_tepesch)


Lesenswert?

Karl Heinz Buchegger schrieb:
> :-)
> Das ist aber das, was ursprünglich vom Autor als HN gedacht war.
jep
hab ich oben auch schon geschrieben, dass es ursprünglich anders gedacht 
war

von Arc N. (arc)


Lesenswert?

Vlad Tepesch schrieb:
> hab ich oben auch schon geschrieben, dass es ursprünglich anders gedacht
> war

Naja, oder ist das Beispiel von Simonyi 
(http://msdn.microsoft.com/en-us/library/aa260976(VS.60).aspx) gut 
lesbar oder gar "clear code" (s.u.)

A. K. schrieb:
> Microsoft als Vorbild für Programmierkonventionen zu verwenden ist
> ohnhin etwas mutig. Denen haben wird immerhin zu verdanken, dass auch
> 64-Bit Prozessoren eine Wortbreite von 16 Bits haben und man dank dieser
> ungarischen Notation in fast jeder einzelnen verdammten Quellcodezeile
> an jene uralten Zeiten erinnert wird, in denen das mal stimmte.

Die können (mittlerweile) auch anders...
http://referencesource.microsoft.com/netframework.aspx
(Referenzquelltexte des .NET-Frameworks)
Viel Spaß beim stöbern...


Peter Stegemann schrieb:
> Das Wort "selbsterklaerend" gehoert in der Informatik verboten - selbst
> einfachste Funktionen sind das nicht.

"The rationale for the code being the primary source of documentation is 
that it is the only one that is sufficiently detailed and precise to act 
in that role...
So the first step to clear code is to accept that code is documentation, 
and then put the effort in to make it be clear. I think this comes down 
to what was taught to most programmers when they began to program. My 
teachers didn't put much emphasis on making code clear, they didn't seem 
to value it and certainly didn't talk about how to do it. We as a whole 
industry need to put much more emphasis on valuing the clarity of code."
http://www.martinfowler.com/bliki/CodeAsDocumentation.html

> Wer das glaubt, hat schlicht nicht
> genug Erfahrung. Schon triviale Funktionen stecken voller
> Randbedingungen, die dokumentiert werden muessen.

Wenn sie so viele Randbedingungen haben, sind sie nicht trivial.
Ansonsten gilt (etwas übertrieben...): Wenn (wirklich) alle 
Randbedingungen dokumentiert sind, existiert die Programmiersprache, mit 
der der Code geschrieben werden sollte, sehr wahrscheinlich nur noch im 
Museum.
Bleibt nur die Möglichkeit, dass, was man zum Zeitpunkt der Erstellung 
als kritisch gesehen hat, zu dokumentieren.
Beispiel: Integerarithmetik, in so gut wie allen Sprachen müsste man 
dokumentieren, das bei bestimmten Operationen nicht in jedem Fall das 
gewünschte Ergebnis herauskommt. Bei Ruby müsste man anders (oder gar 
nicht) dokumentieren, da dort z.B. automatisch von Fixnum auf Bignum 
gewechselt wird, wenn es zu einem Überlauf kommt usw.
http://ruby-doc.org/core/classes/Fixnum.html

> Oft ist sogar viel
> wichtiger, was eine Funktion nicht kann oder wann sie nicht
> funktioniert, als die Beschreibung ihres Hauptzwecks.

Richtig.

von P. S. (Gast)


Lesenswert?

Arc Net schrieb:

> http://www.martinfowler.com/bliki/CodeAsDocumentation.html

Wieso glauben Leute eigentlich, wenn man ein Argument verlinken kann, 
bekaeme es ploetzlich mehr Gewicht? Jeder Honk kann irgendeinen Stuss 
auf einer Webseite verbreiten - und jeder zweite Honk tut es auch.

In Zukunft kannst du ja auf diesen Post hier verlinken:

Aus Code kann man nur Eines herauslesen: WAS passiert. Ueber das WARUM 
sagt Code ueberhaupt nichts. Und deswegen ist Code keine 
Dokumentation.

von Arc N. (arc)


Lesenswert?

Peter Stegemann schrieb:
> Arc Net schrieb:
>
>> http://www.martinfowler.com/bliki/CodeAsDocumentation.html
>
> Wieso glauben Leute eigentlich, wenn man ein Argument verlinken kann,
> bekaeme es ploetzlich mehr Gewicht?

Warum sollte ich (mehr oder weniger) eine Übersetzung schreiben und 
nicht verlinken, wenn ich seine Argumentation für richtig halte?

> In Zukunft kannst du ja auf diesen Post hier verlinken:

Eher hierauf: 
http://scalibq.wordpress.com/2011/07/06/source-code-is-not-documentation/ 
und die Beispiele auseinandernehmen.

> Aus Code kann man nur Eines herauslesen: WAS passiert. Ueber das
> WARUM sagt Code ueberhaupt nichts. Und deswegen ist Code _keine_
> Dokumentation.

Von was reden wir hier: Funktionen in C, nicht über Spezifikationen, Use 
Cases, User Stories oder Anforderungen etc. die, wenn man es genau 
nimmt, auch nur sagen was zu passieren hat und nicht warum (und man 
hätte eine philosophische Diskussion)

von Jean P. (fubu1000)


Lesenswert?

Moin, ertmal.

Vlad Tepesch schrieb:
> Jean Player schrieb:
>> lerne erstmal Doxygen zu bedienen.
>> Ansonsten würde wohl kaum mein Anhang generiert werden.

Wie heisst es so schön in der Physik (actio et reactio).
Jaja mein Wortschatz war sehr arg, sry Jung (war von der Arbeit sehr 
eingenommen in letzter Zeit).

> was ich dazu noch sagen wollte:
> Ich kann sehr wohl mit Doxygen umgehen.
> Ich habe schon recht umfangreiche Dokumentation damit erstellt.
> Sogar Fehler im Code gefunden und Fixes vorgeschlagen.
Jaja das ich will Dir keiner(Ich) absprechen.
Aber ich habe im Notfall lieber doppelt gemoppelt (siehe usb_endp.c)
Klar gibt es Warnings in meinem Doxygen Format, ist ja auch selbst 
gebastelst (mein Favourit zu lesen). Aber Fehler über Doxygen zu finden 
im Code naja sehr zweifelhaft, die sollte man eher im Code suchen als im 
Doxygen.

> Hier nochmal zum Nachlesen, wegen dem @param:
> http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparHabam
Super danke, das hätte ich ja nie gewusst !
Du hast Dir schon meinen ScreenShot oben angeschaut hoffentlich.
Ich habe meinen Style und du deinen, aber zu erzählen, das ist ein 
Beispiel wie man es nicht machen soll , ist meiner Meinung nach nur 
engstirnig.

My 5 Cent.

von Jean P. (fubu1000)


Lesenswert?

>> Ich habe schon recht umfangreiche Dokumentation damit erstellt.
>> Sogar Fehler im Code gefunden und Fixes vorgeschlagen.

Naja, mein letztes Problem war ein AT26-32Mbit Flash. Lief unter 6 Mhz 
SPI Problemlos und laut DatenBlatt sollte der Code bis (aus meinem 
Gedächtnis) bis 33 Mhz funktionieren. Siehe da ab 18 Mhz spinnt er 
sporadisch rum, also Timing anpassen, statt 0x03 , also 0x0B senden mit 
Dummy byte.
Also das alles siehst Du natürlich ausm Doxygen, Prost.

von Vlad T. (vlad_tepesch)


Lesenswert?

Jean Player schrieb:
> Klar gibt es Warnings in meinem Doxygen Format, ist ja auch selbst
> gebastelst (mein Favourit zu lesen).
> Aber Fehler über Doxygen zu finden
> im Code naja sehr zweifelhaft,
Es hat niemand behaupted, dass Doxygen fehler im Code findet.
Es findet, wenn man es so benutzt, wie es gedacht ist, 
Fehler/Inkonsistenten in der Dokumentation, zB. vergessene Parameter, 
überflüssige Parameter.
Das hilf enorm, wenn man am Code etwas geändert hat und vergessen hat 
die Dokumentation anzupassen.


Jean Player schrieb:
> Super danke, das hätte ich ja nie gewusst !
bitte, Google hilf manchmal
> Du hast Dir schon meinen ScreenShot oben angeschaut hoffentlich.
> Ich habe meinen Style und du deinen, aber zu erzählen, das ist ein
> Beispiel wie man es nicht machen soll , ist meiner Meinung nach nur
> engstirnig.

Du misbrauchst hier aber ein Werkzeug, indem du es so benutzt, wie es 
nicht gedacht ist und empfiehlst dies auch noch anderen Leuten.

Das ist, als wenn man ein Schraubendreher als Meißel benutzt und anderen 
erzählt, dafür sei er gedacht obwohl man es besser weiß.

Ich wollte lediglich darauf hinweisen, dass man sich an dieser Aussage 
kein Beispiel nehmen soll, weil es eben keins ist, wie man das Werkzeug 
typischerweise benutzt.


Jean Player schrieb:
> Naja, mein letztes Problem war ein AT26-32Mbit Flash. Lief unter 6 Mhz
> SPI Problemlos und laut DatenBlatt sollte der Code bis (aus meinem
> Gedächtnis) bis 33 Mhz funktionieren. Siehe da ab 18 Mhz spinnt er
> sporadisch rum, also Timing anpassen, statt 0x03 , also 0x0B senden mit
> Dummy byte.
> Also das alles siehst Du natürlich ausm Doxygen, Prost.

Das hat überhaupt nix mit dem Thema zu tun. Inwiefern hätte dir denn 
hier deine seltsame Verwendung von Doxygen weitergeholfen?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.