![]() |
Delphi-Version: 10 Seattle
Die "richtige" Sourcecode Formatierung?
Was hierbei richtig und falsch ist, muss jeder für sich selber entscheiden.
Fakt ist : Wenn Sourcecode "anders" formatiert ist - und da ist sicherlich jeder ein Gewohnheitstier - lässt er sich 1. schlechter lesen 2. langsamer lesen Also werden Fehler übersehen oder schlechter gefunden. Aber was ist mit den "neuen" Sprachfeatures gibt es dafür Regeln? An den Fehlern in der IDE (Auto-End-Einfügung) oder (Doppelte generische Verschachtelung) stellt man schnell fest... Die IDE kann damit auch nicht richtig umgehen. Wenn man schon sehr lange programmiert ( und früher gab es noch keine Regel für Sourcecode ) hatten Proceduren gerne mal 1000 Zeilen oder mehr... Viel mehr.... Sehr viel mehr.... Was also, wenn die procedure nicht auf den Monitor passt (macht ja keiner mehr) was aber wenn? Und was ist, wenn dann um alles noch ein if muss...?
Delphi-Quellcode:
Gib es einen ELSE-Teil? Keinen Plan, dann scroll mal runter... Also einfach eine Regel dafür:
Procedure FooLang(Foo : integer);
begin if Foo > 77 then begin .... IF Regel:
Delphi-Quellcode:
Was ist mit Classen Design:
Procedure FooLang(Foo : integer);
begin if Foo > 77 then // if hat kein else-Teil, then hinter IF begin ... end; if Foo > 77 then begin // if hat einen else-Teil und ich sehe das an der 1. Zeile... ... end else begin ... end; So?
Delphi-Quellcode:
oder doch lieber so:
type
TFoo = class private procedure Bla; function Blub : Integer; procedure Setwert(Value : Integer) function getwert : Integer procedure Settext(Value:String) function gettext:String public Property Wert:integer read getwert write setwert; property TestmessageValue:string read gettext write settext; end
Delphi-Quellcode:
Die Punkte sind nur, weil das Forum die Leerzeichen löscht...
type
TFoo = class private Procedure Bla; Function. Blub : Integer; Procedure SetWert( AValue : Integer ) Function. GetWert : Integer Procedure SetText( Const AValue : String ) Function. GetText : String; public Property Wert............ : Integer read GetWert write SetWert; Property TestmessageValue : String. read GetText write SetText; end Was ist mit anonymen Proceduren?
Delphi-Quellcode:
Mit Sicherheit nicht... oder?
begin
TAynFactory.Default.RegisterObj(Function : IFoo begin result := TFoo.Create; end); end;
Delphi-Quellcode:
begin // #1
TAynFactory.Default.RegisterObj( Function : IFoo begin result := TFoo.Create; end); end;
Delphi-Quellcode:
begin // #2
TAnyFactory.Default.RegisterObj(Function : IFoo begin result := TFoo.Create; end); end;
Delphi-Quellcode:
Angefangen habe ich mit Variante #3, aber da ich mittleiweile ständig so arbeite, bin ich zu #2 über gegangen...
begin // #3
TAnyFactory.Default.RegisterObj( Function : IFoo begin result := TFoo.Create; end ); end; Was ist mit Fluiddesign?
Delphi-Quellcode:
begin // #1
TFMXFluidCreator<TListBoxItem>.RegisterDefault( Procedure (LBI : TFMXFluidCreator<TListBoxItem>) begin LBI.Style('listboxitembottomdetail'). Height(49). ItemMore. OnClick( Procedure (Sender : TObject) var S : String; begin S := TListBoxItem(Sender). Tag. ToString; TEventBus. DefaultBus. Publish(TBusMemoMessage.Create(S)); Memo1.Lines.Add(S); end,false); end); end
Delphi-Quellcode:
begin // #2
TFMXFluidCreator<TListBoxItem>.RegisterDefault(Procedure (LBI : TFMXFluidCreator<TListBoxItem>) begin LBI.Style('listboxitembottomdetail').Height(49).ItemMore.OnClick(Procedure (Sender : TObject) var S : String; begin S := TListBoxItem(Sender).Tag.ToString; TEventBus.DefaultBus.Publish(TBusMemoMessage.Create(S)); Memo1.Lines.Add(S); end,false); end); end
Delphi-Quellcode:
begin // #3
TFMXFluidCreator<TListBoxItem>.RegisterDefault( Procedure(LBI: TFMXFluidCreator<TListBoxItem>) begin LBI.Style('listboxitembottomdetail').Height(49).ItemMore.OnClick( Procedure(Sender: TObject) var S: String; begin S := TListBoxItem(Sender).Tag.ToString; // Das lasse ich so... TEventBus.DefaultBus.Publish(TBusMemoMessage.Create(S)); Memo1.Lines.Add(S); end, false); end); end
Delphi-Quellcode:
#1 & #2 kann doch keiner mehr lesen... oder?
begin // #4
TFMXFluidCreator<TListBoxItem>.RegisterDefault( Procedure ( LBI : TFMXFluidCreator<TListBoxItem >) begin LBI. {} Style( 'listboxitembottomdetail' ). {} Height( 49 ). {} ItemMore. {} OnClick( Procedure ( Sender : TObject ) var S : String; begin S := TListBoxItem( Sender ).Tag.ToString; // Das lasse ich so... TEventBus.DefaultBus.Publish( TBusMemoMessage.Create( S ) ); Memo1.Lines.Add( S ); end,false ); end); end #3 ist ein Autoformat #4 ist auch ein Autoformat die {} verhindern ein zusammen ziehen der Fluid-Elemente. Mit der Procedure im OnClick( kann man sich dann wieder streiten... Aber da ich das "procedure" immer hinten lasse - mache ich es auch so... Case...
Delphi-Quellcode:
begin // #1
Case ch of 'A' : Blub; end; { of case } // <- Immer, da eine der wenigen Stellen, wo es ein "end" ohne "begin" gibt. end;
Delphi-Quellcode:
begin // #2
Case SetType of csCool : Blub; csUnCool : Foo else raise exception.Create('SetType nicht definiert'); // IMMER, vielleicht habe ich das Set geändert und die Case vergessen? end; // of case end;
Delphi-Quellcode:
begin // #3
{$REGION ' FDK CaseSelector'} case TFDKHelper.CaseSelector<String>(AFieldName, {0} ['Name', {1} 'Vorname', {2} 'Strasse', {3} 'PLZ', {4} 'ORT'],Function (A,B : String) : boolean begin Result := SameText(A,B); end){$ENDREGION} {Case AFieldname } of 0 : Result := 24; 1 : Result := 22; 2 : Result := 32; 3 : Result := 5; 4 : Result := 22 else raise ESystemException.Create('CaseSelector Feldname nicht in Liste: Mavarik Anrufen'); end; // of case end;
Delphi-Quellcode:
#1 & #2 sind meine festen Regeln...
begin // #4
//FDK CaseSelector (hier als Kommentar weil das Forum es nicht anders kann) {Case AFieldname } of 0 : Result := 24; 1 : Result := 22; 2 : Result := 32; 3 : Result := 5; 4 : Result := 22 else raise ESystemException.Create('CaseSelector Feldname nicht in Liste: Mavarik Anrufen'); end; // of case end; #3 für Typen die eine Case nicht kann und das wird dann mit der Region wie #4 dargestellt... So kann man es lesen... Soweit mein kleine Auszug... Mavarik :coder: |
AW: Die "richtige" Sourcecode Formatierung?
Nur falls wir noch die "Fachbegriffe" für die verschiedenen Konventionen suchen:
![]() |
AW: Die "richtige" Sourcecode Formatierung?
Wir sind zwar hier in einem Pascalforum, aber ich komme von C/C++ was ich embedded immernoch zu 50% meiner Zeit programmiere.
Seit 20Jahren schreibe ich C/C++ so, auch wenn es wegen der mit eingerückten Blockklammern nicht dem StandardStyleGuide entspricht:
Code:
In C finde ich die zusätzlichen Zeilen mit nur einer Klammer gut, aber Pascal/Delphi mag ich wegen der oft eh etwas ausführlicheren Schreibweise das nicht und mache es einheitlich so:
if(test()==value)
{ test_true(); } if(irgendwas()==value) { machwas_true(); } else { machwas_false(); } //und dann weiter mit irgendetwas
Code:
Ich bin der Meinung, solange man IMMER einheitlich innerhalb einer Sprache formatiert, kann jeder der es es "will" dies auch lesen und verstehen, StyleGuides hin oder her.
if(test()=value) then begin
test_true(); end; if(irgendwas()=value) then begin machwas_wenn_true(); end else begin machwas_wenn_false(); end; //und dann weiter mit irgendetwas Innerhalb einer Funktion/Procedure muss die Formatierung einheitlich sein, aber ich kann in Quelltexten wo zig Leute einzelne Klassenmethoden ausprogrammieren sogar Vorteile sehen, wenn ich über die Formatierung erkenne, wer es gemacht hat. Wir handhaben das sehr locker ohne großen Zwang, solange jede Formatierung zumindest in sich klar & logisch erklärbar ist&bleibt. Klar kann man auch bzgl. Formatierung was komentieren, aber bei uns hat es sich nicht durchgesetzt. Das z.B. typische und aus meiner Sicht viel wichtigere Problem, ob man jede Funktion/Procedure mit nur "einem Result=" bzw. "einem Exit" ganz am Ende verlassen soll, oder ob es anfangs mehrere "If Blöcke" geben kann, welche jeweils direkt die Funktion/Procedure verlassen... wir bevorzugen die Variante mit mehreren Exits!... das ist einfach nachträglich besser erweiterbar, als ewig immer tiefere If(+Else) Schachtelungen... lieber 8 ausprogrammierte "IFs ohne Else", als 2^3 geschachtelte "if-then-else"! Das sind bei uns so die "grundsätzlichen" Fragen... Anonyme Methoden verwenden wir nun auch, schreiben da aber möglichst nur einen Aufruf einer "woanders normal" geschriebenen Procedure hinein... das darf dann sogar mal in nur einer "inline" Zeile sein. Ich schreibe grundsätzlich in Pascal/Delphi pragmatisch immernoch so, wie ich es schon immer auch in C/C++ ohne "lokale Funktionen/Proceduren" hätte schreiben müssen. Die Kollegen der reinen Delphi Fraktion haben mich deshalb bisher noch nicht gesteinigt:) |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Ich bin der Meinung, es gibt keine "richtige" Formatierung, auch weil jeder ein wenig anders tickt und den Quellcode anders erfasst. Ein Kollege macht im Quellcode z.B. keinerlei Leerzeichen und ich finde das immer grauenvoll zu lesen, er kommt damit prima klar. |
AW: Die "richtige" Sourcecode Formatierung?
Die IDE unterstützt bei so manchem. Aber das Ausrichten der Methodennamen hat sie halt noch nicht drauf.
Manchmal ist es zu viel des Guten, da wird so weit auseinandergezogen, daß man (ich :D) sich in der Zeile vertun kann. Zum Thema "richtige" Formatierung: Freilich bleibt es Einzelkämpfern überlassen, ihren Code nach Gutdünken zu formatieren. Sie können ihn auch mit rosa Blümchen tapezieren. Aber es gibt tatsächlich ![]() Sherlock |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Was spricht gegen diese Zeile? Kann man doch "in eins" lesen?! Ich schreibe solche Funktions-/Prozedur-/Methodendeklarationen/-köpfe immer in eine(r) Zeile. Ich würde noch begin und end entfernen, weil redundant. |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Sherlock |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
In der Regel steht bei mir der integrierte Formatter auch auf diesen (Default-)Einstellungen. Lediglich die Zeilenlänge setze ich passend zu den heute üblichen Widescreens auf einen höheren Wert. Durch die Kommandozeilenversion lassen sich auch problemlos ältere und fremde Sourcen ohne großen Aufwand anpassen. Was mir noch fehlt ist eine Möglichkeit, die automatische Formatierung für eine Zeile oder einen Bereich ausser Kraft zu setzen. Es gibt halt immer mal wieder Ausnahmen. |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 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