Delphi-PRAXiS
Seite 4 von 10   « Erste     234 56     Letzte » 

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die "richtige" Sourcecode Formatierung? (https://www.delphipraxis.net/189924-die-richtige-sourcecode-formatierung.html)

nahpets 9. Aug 2016 19:32

AW: Die "richtige" Sourcecode Formatierung?
 
Ok, dann auch mal mein Senf dazu:
Delphi-Quellcode:
// 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;
Das end ist immer genauso weit eingerückt, wie das dazugehörige if.
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:
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;
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.

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:
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;
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.

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).

mm1256 9. Aug 2016 19:59

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von DeddyH (Beitrag 1344526)
:thumb: (abgesehen davon finde ich den ganzen Thread irgendwie müßig, jeder hat da seine eigenen Vorlieben).

Meine Worte im anderen Thread. :thumb: Aber, interessant mal zu sehen, wie Andere ihren Code formatieren.

bernau 9. Aug 2016 22:23

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von mm1256 (Beitrag 1344532)
Aber, interessant mal zu sehen, wie Andere ihren Code formatieren.

Darum geht es, deshalb finde ich solche Threads niemals müßig.

jaenicke 9. Aug 2016 23:06

AW: Die "richtige" Sourcecode Formatierung?
 
Für mich sind bei der Formatierung wichtig:
  • Zwingend per Codeformatter machbar (nur manuell formatieren können ist Blödsinn, das dauert viel zu lange, wenn ich fremden Quelltext einpflegen muss usw.)
  • Weite Verbreitung der Formatierung, keine Sonderlocken
  • Natürliches Schreiben: keine tausend unnötige Leerzeichen oder ähnliches
  • Ein Befehl pro Zeile (damit man nicht erst die ganze Zeile durchlesen muss um weiterzulesen)
  • Pro logischer Ebene eine Einrückung um zwei Zeichen nach rechts
  • Kein Plenken
Das macht die Standardformatierung bereits, deshalb gibt es für mich keinen Grund eine andere zu benutzen. Zumal dies die häufigste Formatierung ist, wenn man so Open Source usw. anschaut. Alles andere ist eher selten bis exotisch zu finden.

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.

Lemmy 10. Aug 2016 06:40

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von jaenicke (Beitrag 1344535)
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.

Grundsätzlich sehe ich das wie Du: Wenn die IDE eine Formatierung als Standard verwendet mit der ich klar komme - warum ändern.. da bin ich viel zu faul dafür :-)


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

-=ZGD=- 10. Aug 2016 07:19

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von Lemmy (Beitrag 1344543)
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

Sehe ich genauso. Hierbei geht es weniger um Faulheit, als um Wartbarkeit. Begin-End müssen einfach sein.

SProske 10. Aug 2016 07:50

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von nahpets (Beitrag 1344530)
Delphi-Quellcode:
// Folgt auf ein If nur eine Anweisung, dann wird das ein Einzeiler, solange er nicht über ca. 80 Zeichen hinaus geht.
if ... then ...;

Und wenn du mal einen Haltepunkt auf die Anweisung setzen willst, ärgerst du dich über diese Anordnung und verteilst es wieder auf 2 Zeilen - richtig?

Uwe Raabe 10. Aug 2016 08:46

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von SProske (Beitrag 1344545)
Und wenn du mal einen Haltepunkt auf die Anweisung setzen willst, ärgerst du dich über diese Anordnung und verteilst es wieder auf 2 Zeilen - richtig?

Und deshalb bekommt der Befehl nach
Delphi-Quellcode:
then
eine eigene Zeile. Und weil man beim Zufügen weiterer Zeilen schnell mal das
Delphi-Quellcode:
begin
vergisst, werden auch solche Einzeiler in ein
Delphi-Quellcode:
begin-end
verpackt.

Aber auch hier gibt es wieder eine Ausnahme:
Delphi-Quellcode:
if ... then Exit;
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.

SProske 10. Aug 2016 09:02

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).

Jumpy 10. Aug 2016 09:06

AW: Die "richtige" Sourcecode Formatierung?
 
Zitat:

Zitat von Mavarik (Beitrag 1344516)
Zitat:

Zitat von Jumpy (Beitrag 1344504)
Delphi-Quellcode:
if .. then
  begin
  ..
  end
else if .. then
  begin
  ..
  end
else
  begin
  ..
  end;

Gruselig...Codesumpf nenne ich das...

Und ich nenne das nicht nett und aus dem Zusammenhang gegriffen.
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:

Delphi-Quellcode:
if ... then begin
  ...
end;
Das end gehört zum if ... (sinngemäß)
Ich dachte immer das end gehört zum begin (ausser beim try) und drum schreibe ich es auch auf eine Ebene.

Nur mal so nebenbei gefragt, macht ihr die Formatierungen bei Schleifen dann genauso?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 Uhr.
Seite 4 von 10   « Erste     234 56     Letzte » 

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf