Delphi-PRAXiS
Seite 9 von 12   « Erste     789 1011     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mein Delphi-Style (https://www.delphipraxis.net/134200-mein-delphi-style.html)

BUG 18. Mai 2009 16:32

Re: Mein Delphi-Style
 
Um bei Hansas Beispiel zu bleiben:
Zitat:

Zitat von Hansa
unsortiert in ein Buch einkleben.

Vielleicht doch, dann aber nur solange bis er eine bestimmte Marke sucht :stupid:
Dann wird er ein paar Sortierungen (Jahr - Ort - ka, sammle keine Briefmarken) ausprobieren und dann die wählen die ihm am Besten gefällt und diese dann mit der Zeit verfeinern.

Der gute Stil muss sich also entwickeln und da ist es zwar hilfreich, dass mangelnde Formatierung angemahnt wird, aber ständig darauf herumzureiten stört imho die Entwicklung eines Stilbewusstseins.


MfG,
Bug

Satty67 18. Mai 2009 16:50

Re: Mein Delphi-Style
 
Um vielleicht von der muss alles/muss nichts Diskussion weg zu kommen...

Man könnte ja eine Rangliste erstellen, welche Styleguides den Code deutlich lesbarer machen und welche dann nur noch marginal Verbesserungen bringen und evtl. weniger wichtig sind. Zumindest die wichtigen Punkte könnte man sich dann aneignen...

Einrückung sehe ich mit am wichtigsten (wobei wohl wieder die Sache mit begin ungeklärt bleiben wird) ;)

Der.Kaktus 18. Mai 2009 16:56

Re: Mein Delphi-Style
 
..da auch mal meinen Senf dazu geben moechte...
also ich finde, dass ja gewisse Tools..Castalia etc. auch in einer gewissen Form "markieren"..die sieht , nicht nur weil es meiner entspricht, auch sehr uebersichtlich aus und ich denke mal, dass die Firma sicher auch gewisse Standards genutzt hat um sie in dieser Art zu visualisieren. ;-)

Win32.API 18. Mai 2009 17:11

Re: Mein Delphi-Style
 
Zitat:

Zitat von Luckie
Bei mir würde das so aussehen:
Delphi-Quellcode:
procedure TFtpBrowser.DeleteFile(AFile: String; IsDir: Boolean);
begin
  if (IsDir and (AFile <> '.') and (AFile <> '..')) then
  begin
    try
      RemoveFilesAndDir(...);
    except
      // Fehlerbehandlung
    end;
  end
  else if (not IsDir) then
  begin
    try
      Deletefile(..);
    except
      // Fehlerbehandlung
    end;
  end;
end;

Schonmal nicht schlecht, ich würde es aber so bevorzugen:

Delphi-Quellcode:
procedure TFtpBrowser.DeleteFile(AFile: String; IsDir: Boolean);
const
  strRemoveFileError = 'Could not remove %s %s';
var
  strErrorMessage: string;
begin
  try
    if (IsDir) then
      if ((AFile <> '.') and (AFile <> '..')) then
        Deletefile(..);
    else
      Deletefile(..);
  except
    if (IsDir) then
      strErrorMessage := Format(strRemoveFileError, ['directory', AFile])
    else
      strErrorMessage := Format(strRemoveFileError, ['file', AFile]);

    TriggerLogEvent(strErrorMessage, etError);
  end;
end;
Grüße,
Win32

DeddyH 18. Mai 2009 17:14

Re: Mein Delphi-Style
 
Das wird Delphi aber nicht kompilieren ("; nicht erlaubt vor einem else") ;)

Win32.API 18. Mai 2009 17:20

Re: Mein Delphi-Style
 
War ja auch nur schnell zusammen getippt, hier gehts ja schließlich ums Prinzip :cheer:

Nighthawk1310 18. Mai 2009 17:36

Re: Mein Delphi-Style
 
Also bei mir würde der Beispiel-Code so aussehen:

Delphi-Quellcode:
  if k=kMax then
     A[k] := A[k-1] / A[k]
 
  if a=0 then
     Result := 0 
  else
     if a>0 then
        Result := 1 
     else
        Result := -1;

  if Sender=mnPrintGraphOben then
     h:= ro            // 'Drucken|Graph oben'
  else
     h:= rm;           // 'Drucken|Graph unten'                      

  for k:= 0 to kMax do
      A[k]:= 0;

  for i := 1 to iMax do
      begin
      temp := A[i];
      A[i] := B[i];
      B[i]:= temp;
      end;

  for i:= 2 to m do
      begin
      for k:= 1 to i-1 do
          B[i]:= B[i] - A[r(i,k)] * B[k];

      B[i]:= B[i] / Abs(A[r(i,i)])
      end;

  with Image1.Canvas do
       begin
       MoveTo(DL, D0 - Round(sy * (F(xMin)-yMin)));
       
       for i:= 0 to 320 do
           begin
           x:= xMin + i * dx;
           LineTo(DL + 2 * i, D0 - Round(sy * (F(x)-yMin)))
           end;
       end;
und eine Procedure/Function muss nicht unbedingt auf eine Bildschirmseite passen.
Das wichtigste ist, dass man es lesen und verstehen kann. Sprich, wenn man scrollen muss, dann
darf es nicht sein, dass man alle paar Zeilen zurück zu den Deklarationen der Variablen springen muss um
sich zu errinnern, was DL, D0, ro oder rm nochmal bedeutet. Wenn ich Code sehe (meiner oder auch anderer Herkunft), dann möchte ich schon direkt (vor allem nach längerer Nichtbetrachtung) sofort sehen was dort "fabriziert" wurde und was es bedeutet.

Beispiel (Nodes mit Farbverlauf im VST zeichnen):
Delphi-Quellcode:
     if (Node = vstMainList.HotNode) then
        begin
        TargetCanvas.Pen.Color  := $00FAF0D8; //$0049CFF5;
        cl1 := $00FDFAF4;
        cl2 := $00FDF5E8;
        end;

     if (Node = vstMainList.FocusedNode) then
        begin
        TargetCanvas.Pen.Color  := $00FDDE99; //$000C66D3;
        cl1 := $00FDF8F1;
        cl2 := $00FCEFD5;
        end;

     if ((vstMainList.HotNode = vstMainList.FocusedNode) and (Node = vstMainList.HotNode)) then
        begin
        TargetCanvas.Pen.Color  := $00FDDE99; //$0049CFF5;
        cl1 := $00FEF7E9;
        cl2 := $00F6E4C0;
        end;

     ....
     ....
     ....

     if (Column = 0) or (Column = vstMainList.Header.Columns.Count - 1) then
        begin
        rcTemp := CellRect;
        dec(rcTemp.Bottom, 1);

        if (Column = 0) then
           rcTemp.Left := rcTemp.Right - 4;

        if (Column = vstMainList.Header.Columns.Count - 1) then
           rcTemp.Right := rcTemp.Left + 4;

        if (vstMainList.Selected[Node]) or (Node = vstMainList.HotNode) then
           eqComps.DrawGradient(TargetCanvas, rcTemp, False, [cl1, cl2]);
        end;
Ich habe die Kommentare mal entfernt, aber ich denke, dass der Code relativ einfach zu vertstehen ist.
Auch wenn es nur ein Auszug ist.
Meine Variablennamen wähle ich eigentlich immer so, dass man aus ihnen Typ und Verwendungszweck erkennen kann.
rcTemp im Beispiel wird mehrmals an unterschiedlicher Stelle benutzt und immer wieder mal neu belegt.

pNodeDataUser und pNodeDataWorkplace im Folgenden lassen schon erkennen, dass es Node-Daten sind für Benutzer oder Arbeitsplätze auch ohne das dafür eine weitere Erläuterung notwendig wäre, abgesehen vom "wozu?".

Delphi-Quellcode:
     if Node.Dummy = 98 then
        begin
        pNodeDataUser := vstMainList.GetNodeData(Node);
        sTemp := GetWorkplaceNumberFromID(pNodeDataUser.lRefWorkplaceID);
        ....
        ....
        ....
        end;

     if Node.Dummy = 99 then
        begin
        pNodeDataWorkplace := vstMainList.GetNodeData(Node);
        ....
        ....
        ....
        end;
Variablen sollten abgesehen davon nur am Deklarationsort einmal etwas genauer beschrieben werden.
Mitten im Code macht es wenig Sinn, es sei denn die Namen der Variablen sind Nichtssagend.

Fazit für mich:
Bis jetzt sind auch andere, die mit meinem Code etwas machen mussten gut und schnell (ohne große Erklärungen)
damit zurechtgekommen. Und das ist die Hauptsache.

Der.Kaktus 18. Mai 2009 17:51

Re: Mein Delphi-Style
 
Zitat:

Zitat von Nighthawk1310
Also bei mir würde der Beispiel-Code so aussehen:
...

..waer mir sehr!!! unuebersichtlich..meine Meinung 8)

jbg 18. Mai 2009 17:52

Re: Mein Delphi-Style
 
Zitat:

Zitat von Nighthawk1310
Delphi-Quellcode:
///...
     if (Column = 0) or (Column = vstMainList.Header.Columns.Count - 1) then
        begin
        rcTemp := CellRect;
        dec(rcTemp.Bottom, 1);

        if (Column = 0) then
           rcTemp.Left := rcTemp.Right - 4;

        if (Column = vstMainList.Header.Columns.Count - 1) then
           rcTemp.Right := rcTemp.Left + 4;

        if (vstMainList.Selected[Node]) or (Node = vstMainList.HotNode) then
           eqComps.DrawGradient(TargetCanvas, rcTemp, False, [cl1, cl2]);
        end;

Gehört das "end;" jetzt zu "if (vstMainList.Selected[Node])" ? Zumindest würde ich das beim Überfliegen des Codes so sehen und somit den Code falsch verstehen.



Ich hätte da noch eine Idee, wie man einrücken kann:
1. Man nehme die aktuelle Uhrzeit mit Sekundenanzeige
2. Rechne Sekunden modulo 8
3. Das Erbegbnis ist die Anzahl der Leerzeichen die man zum einrücken der aktuellen Zeile benutzt. Solchen Code gibt es wirklich.

Nighthawk1310 18. Mai 2009 17:57

Re: Mein Delphi-Style
 
Zitat:

Zitat von jbg
Gehört das "end;" jetzt zu "if (vstMainList.Selected[Node])" ? Zumindest würde ich das beim Überfliegen des Codes so sehen und somit den Code falsch verstehen.

Ja. Denn "end"'s nach "if" benötigen auch immer ihr "begin". und der Block/die Einrückung zeigt es auch.
Im anderen Fall wäre es 3 leerzeichen weiter eingerückt + "begin" in der Zeile nach dem "then".


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 Uhr.
Seite 9 von 12   « Erste     789 1011     Letzte »    

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