![]() |
AW: Die "richtige" Sourcecode Formatierung?
Ok, dann auch mal mein Senf dazu:
Delphi-Quellcode:
Das end ist immer genauso weit eingerückt, wie das dazugehörige if.
// Folgt auf ein If nur eine Anweisung, dann wird das ein Einzeiler, solange er nicht über ca. 80 Zeichen hinaus geht.
if ... then ...; // Geht vorhergenanntes über ca. 80 Zeichen hinaus, dann wird es: if ... then begin ... end; // Sind es mehr als eine Anweisung wird es analog dazu: if ... then begin ... ... end; Folgen auf ein if mehrere Anweisungen, werden die eingerückt. Durch die Einrückung erkenne ich, dass da was zusammen gehört. Das begin am Ende der If-Anweisung ist für mich daher eine Redundanz und hat keinerlei Informationswert für das Verstehen des Quelltextes. Daher brauchts dafür keine eigene Zeile und kann von mir aus auch rechts neben dem Bildschirm stehen ;-) Das gilt analog auch für for, while, repeat ... Wenn's um Alternativen beim if geht, sieht es so aus:
Delphi-Quellcode:
Und da ich ein "alter Sack" bin, hab' ich schonmal was von der ungarischen Notation gehört. Da halte ich mich dran, soweit es verständlich ist. Dadurch brauche ich für die Unterscheidung von Funktionen und Variabeln auch kein Foo()-Konstrukt.
if ...
and ... and ... then begin ... end else if ... then begin ... ... end else if ... or ... then begin ... end else // Das sieht hier im Forum etwas anders aus, als im wirklichen Leben, da die Leerzeichen hier nicht die gleiche Breite haben, wie die Buchstaben und Zahlen und zum Teil "geklaut" werden. // Schrifttyp im Quelltexteditor ist immer Courier New. if (x = y) and ( (a = b) or (e = f) ) then begin end; Variabeln fangen immer mit 'nem Kleinbuchstaben an, Funktionen und Prozeduren mit 'nem Großbuchstaben. Besteht ein Funktions-/Prozedurname aus 'ner Beschreibung der Aufgabe, so beginnt in dem Namen jedes neue Wort mit 'nem Großbuchstaben. Z. B.: SeiteLaden, DatenSpeichern ... Konstanten werden wie Variabeln benannt, bekommen aber noch ein c davor. z. B.: csConnectionString. Damit weiß ich im Quelltext immer: das ist 'ne Konstante und zwar eine Zeichenfolge und sie enthalt die Verbindungszeichenfolge für 'ne Datenbankverbindung. Resourcestrings beginnen mit rs. Hab' ich z. B. eine Stringliste, die Referenzen aus einer HTML-Seite enthält, dann heißt sie slAHRef. Muss ich nun (was bei Stringlisten ja häufiger vorkommt) per For-Schleife darüber laufen, so bekommt die entsprechend Variabel den Namen iAHRef. Sieht dann so aus (PascalScript, daher ein bisserl anders als Delphi):
Delphi-Quellcode:
Und das schöne daran ist: Niemand, außer mir, muss damit zurecht kommen, das lesbar oder schön finden, und von daher ist das Ganze eigentlich vollkommen irrelevant.
function SeiteLaden(sSeite : String) : Boolean;
var // Die Doppelpunkte stehen untereinander, // dadurch ist eine Sortierung im Editor nach Typ oder Name einfacher. slAHRef : TStringList; slHTML : TStringList; sUrl : String; sMessage : String; sTitel : String; iAHref : Integer; iIndex : Integer; iID : Integer; begin Status(Format('Seite %s wird geladen ...', [sSeite])); iID := qry.FieldByName('ID').AsInteger; AppTitle(Format('%d - %d',[iID,iMaxID]),'Textverwaltung'); slAHRef := TStringList.Create; slHTML := TStringList.Create; try sTitel := '<unbekannt>'; sUrl := Format('%s%s',[csRoot, sSeite]); Result := HTTPGet(sUrl, slHTML, slAHRef, sMessage, 5); ProcessMessages; if not Result then begin sUrl := Format('%s%s%s',[csRoot, csPrograms, sSeite]); Result := HTTPGet(sUrl, slHTML, slAHRef, sMessage, 5); ProcessMessages; end; if Result then begin iIndex := slHTML.IndexOf('<title>'); if (iIndex > 0) and (iIndex < slHTML.Count - 1) then sTitel := slHTML[iIndex + 1]; if not qry.Locate('seite', sSeite, [loCaseInsensitive, loPartialKey]) then begin Inc(iMaxID); qry.Append; qry.FieldByName('ID').AsInteger := iMaxID; end else begin qry.Edit; end; qry.FieldByName('Seite').AsString := sSeite; qry.FieldByName('Titel').AsString := sTitel; qry.FieldByName('Schluesselwort').AsString := sTitel; qry.FieldByName('Classname').AsString := csAutor; qry.FieldByName('Parent').AsString := csParent; qry.FieldByName('SeitenText').AsString := slHTML.Text; qry.FieldByName('Teile').AsString := ''; try qry.Post; except AppLog('SeiteLaden (1)', Format('%s', [sSeite])); AppLog('SeiteLaden (1)', ExceptionParam); AppTitle(Format('Fehler bei Seite %s', [sSeite]), 'Textverwaltung'); qry.Cancel; end; for iAHref := slAHRef.Count - 1 downto 0 do begin if (Pos(':', slAHRef[iAHref]) <> 0) then slAHRef.Delete(iAHref); end; for iAHref := slAHRef.Count - 1 downto 0 do begin if (Pos('../', slAHRef[iAHref]) = 1) then slAHRef[i] := AnsiReplaceText(slAHRef[iAHref], '../', ''); end; for iAHref := slAHRef.Count - 1 downto 0 do begin if (Pos('.htm', slAHRef[iAHref]) = 0) then slAHRef.Delete(iAHref); end; for iAHref := slAHRef.Count - 1 downto 0 do begin iIndex := Pos('#', slAHRef[iAHref]); if iIndex > 0 then slAHRef[iAHref] := Copy(slAHRef[iAHref], 1, iIndex - 1); end; slAHRef.Sort; for iAHref := slAHRef.Count - 1 downto 1 do begin if slAHRef[iAHref] = slAHRef[iAHRef - 1] then slAHRef.Delete(iAHref); end; for iAHref := 0 to slAHRef.Count - 1 do begin if not qry.Locate('Seite',slAHRef[iAHref],[loCaseInsensitive]) then begin Inc(iMaxID); qry.Append; qry.FieldByName('ID').AsInteger := iMaxID; qry.FieldByName('Seite').AsString := slAHRef[iAHref]; qry.FieldByName('Titel').AsString := ''; qry.FieldByName('Schluesselwort').AsString := '<neu>'; qry.FieldByName('Classname').AsString := csAutor; qry.FieldByName('Parent').AsString := csParent; try qry.Post; except AppLog('SeiteLaden (2)',Format('%s',[slAHRef[iAHref]])); AppLog('SeiteLaden (2)',ExceptionParam); AppTitle(Format('Fehler bei Seite %s',[slAHRef[iAHref]]),'Textverwaltung'); qry.Cancel; end; end; end; end else begin Applog('SeiteLaden (3)', Format('%s',[sUrl])); Applog('SeiteLaden (3)', Format('%s',[sMessage])); end; except Applog('SeiteLaden (4)', Format('%s - Titel: %d - %s', [sSeite,iIndex,sTitel])); Applog('SeiteLaden (4)', ExceptionParam); end; slRef.Free; slHTML.Free; qry.Locate('ID',iID,[loCaseInsensitive]); end; Wenn ich in 'nem Team arbeite, dann halte ich mich natürlich an die dort vorgegebenen Richtlinien, egal wie sch... die Quelltexte auch aussehen mögen, behalte mir aber vor, Quelltexte anderer, die sich nicht daran halten bzw. Quelltexte die auf irgendeine andere Art und Weise unleserlich und/oder unübersichtlich sind, entsprechend den Richtlinien anzupassen (jedenfalls dann, wenn der Quelltext so konfus ist, dass (im Test oder in der Produktion) festgestellte Fehler im Quelltext "dank Unleserlichkeit" nicht gefunden werden können). |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Für mich sind bei der Formatierung wichtig:
Wegen des begin in einer Zeile: Ich empfinde es als unsauber, wenn mehrere Befehle in eine Zeile gequetscht werden. Da läuft man nur in Gefahr etwas zu überlesen. |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Ich habe aber einige Jahre das Begin hinter die if-Verzweigung gesetzt (natürlich auch bei anderen Anweisungen), musste aber feststellen, dass diese Konstellation div. Probleme verursacht, wenn bei der Wartung nicht aufgepasst wird (d.h. das sind Fehler die vermutlich mir, aber auch anderen Entwicklern im Team passiert sind): Anweisungen stehen im Block (eingerückt), aber das Begin-End fehlt - d.h. nur die erste Anweisung nach if wurde ausgeführt, die anderen immer Anweisungen stehen nicht im Block (eingerückt) aber mit Begin-end (sollten also nicht im Then-Zweig stehen, tun sie aber) ... All das hat mich dazu bewogen, das begin und end konsequent zu schreiben, auch bei nur einer Anweisung - auch um das Hirn bei der "Mustererkennung" zu entlasten |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Delphi-Quellcode:
eine eigene Zeile. Und weil man beim Zufügen weiterer Zeilen schnell mal das
then
Delphi-Quellcode:
vergisst, werden auch solche Einzeiler in ein
begin
Delphi-Quellcode:
verpackt.
begin-end
Aber auch hier gibt es wieder eine Ausnahme:
Delphi-Quellcode:
bleibt auf einer Zeile, weil hier das Haltepunkt-Argument leider nicht zieht. Seitdem die IDE diese netten Flow-Icons anzeigt, ist das auch viel angenehmer und leichter zu lesen und lenkt nicht vom eigentlich relevanten Code ab.
if ... then Exit;
|
AW: Die "richtige" Sourcecode Formatierung?
Wieso sollte ich auf ein Exit keinen Haltepunkt setzen können/wollen?
Vielleicht interessiert es mich ja, ob das Exit während der Codeausführung überhaupt mal angesprungen wird (ohne bei jeder Prüfung anzuhalten). |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Ist ja schön, wenn man mal sieht, wie andere den Code formatieren und warum. Das macht den Thread spassig. Wenn's aber zu "Mein Kung Fu ist besser als dein Kung Fu" abgleitet, bleibt der Spaß irgendwo auf der Strecke. Ich habe so ein bißchen den Eindruck gewonnen, dass die Formatierung auch davon beeinflusst wird, in welchen Sprachen man noch so programmiert, sprich wie man in Java/C#/C++ die Klammern setzt, so setzt man begin/end in Delphi? Ich mache noch viel im Bereich MS-Office mit VBA. Da gibt es ja explizit das "ElseIf" und drum setzte ich das in Delphi halt auch in eine Zeile, weil der Code dann in Delphi ähnlich formatiert ist, wie in VBA. Irgendwer hat auch geschrieben: Zitat:
Nur mal so nebenbei gefragt, macht ihr die Formatierungen bei Schleifen dann genauso? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz