![]() |
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:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Welchen Vorteil soll es haben das begin hinter das then zu schreiben? |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
entweder
Delphi-Quellcode:
oder
if Bedingung then machwas;
Delphi-Quellcode:
Wenn das begin in die nächste Zeile rutscht, sieht das so eigenständig aus und mir fehlt da der Bezug zum if.
if Bedingung then begin
machwas; machmehr; end; Das fällt besonders auf wenn kein Syntaxhighlighting aktiv ist. Gruß K-H |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Delphi-Quellcode:
Für mich ist das übersichtlicher und genauso logisch, da das if/else und das zugehörige end auf einer Höhe sind.
if .. then
begin .. end else if .. then begin .. end else begin .. end;
Delphi-Quellcode:
Unter C/Java ist meine Schreibweise sogar die empfohlene (dort halt mit Klammern).
if .. then begin
.. end else if .. then begin .. end else begin .. end; |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Es wird Dir zu lang... Mach ne procedure draus... Quelltext ohne Leerzeile kann ich gar nicht lesen... Vor und nach jedem if/while/for/repeat kommt auf jeden Fall eine Leerzeile. Es sei den es steht ein Begin davor... Genauso gibt es niemals zwei Anweisung oder Zuweisung in einer Zeile. Funktionen die keinen Parameter haben werden mit Foo(); geschrieben... Damit ich sofort sehe, dass es keine Variable ist, sondern ein Call... Sir Rufo hat da noch eine ganz besondere Konstruktion für If's mit langen and und or Teilen, die auch die Lesbarkeit verbessert...
Delphi-Quellcode:
Einfach die Bedingungen bei allen {} durch gehen und schon ist klar worum es geht...
procedure TForm1.SpeedButton1Click( Sender: TObject );
var lRateThisApp: IFDKRateThisAppService; begin if true {} and TPlatformServices.Current.SupportsPlatformService( IFDKRateThisAppService, lRateThisApp ) {} and lRateThisApp.ShowRateDialogIfNeeded( ) then Log( 'Dialog angezeigt' ); end; Mavarik :coder: |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Mit Einrücken wird dann doch klar welches begin/end zusammen gehört.
Delphi-Quellcode:
if .. then
begin .. end else if .. then begin .. end else begin .. end; |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Delphi-Quellcode:
Und schon is klar was wohin gehört...
if ..
then begin .. end else if .. then begin .. end else begin .. end; ggf.
Delphi-Quellcode:
So würde ich es machen...
if ..
then begin .. end else begin if .. then begin .. end else begin .. end; end; Mavarik :coder: |
AW: Die "richtige" Sourcecode Formatierung?
Delphi-Quellcode:
if ..
then begin .. end else begin if .. then begin .. end else begin .. end; end; ... mache ich bzgl. Struktur genauso, nur etwas kompakter und nicht so "raumgreifend" in die Breite;)
Delphi-Quellcode:
und zumindest in CNpack und auch aktuell integriertem Castalia sieht das sogar sehr sauber aus:)
if (..) then begin
.. end else begin if (..) then begin .. end else begin .. end; end; |
AW: Die "richtige" Sourcecode Formatierung?
Ich liebe solche Threads ;-)
Hier ist mein Beitrag zu den If then else
Delphi-Quellcode:
Eine Zeile, die mit "if" beginnt, hört immer mit "then" auf.If bla then TuWas; If bla then TuWas else TuWasAnderes; If bla then begin TuWas; TuNochWas; end else begin TuWasAnderes; TuNochWasAnderes; end; If bla then begin TuWas; end else If blabla then begin TuNochWas; end; "Darunter" kommt die auszuführende Funktion. Natürlich eingerückt. Das gilt auch für das Begin und End, die auf eine ebene gehören. Bei verschachtelten Ifs finde ich, ist eine Einrückung des nächsten If zwingend notwendig, damit ich auf einen Blick sehe, dass es eine Verschachtelung ist. |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Ich würde das hier befürworten:
Delphi-Quellcode:
Sowas macht man ja eigentlich nur, wenn man eigentlich ein ein case-Konstrukt bräuchte, das aber nicht zugelassen ist. (Ausdruck zur Compilezeit variabel oder so...)
if .. then
begin .. end else if .. then begin .. end else begin .. end; Insofern finde ich es sinnvoll, das auch optisch analog zu gestalten. Logisch ist das auch nur eine "Unterebene", da nur einer der Subblöcke ausgeführt wird. Wenn man da jeden Subblock weiter einrückt, hat man ja schnell ewig lange Zeilen. Zur Praxisrelevanz ein (delphisiertes) Codezitat:
Delphi-Quellcode:
Da habe ich dann auch lieber deutliche Einrückungen (1 Tab = 4 Leerzeichen) damit man die Blöcke direkt sieht. Würde man dann allein für das begin eine eigene Einrückungsebene einziehen, vergeudet man ja die Hälfte des Platzes...
startTime, endTime: string;
if (SpecificRegex.IsMatch(Event.Time)) then begin match := SpecificRegex.Match(Event.Time); startTime := match[0]; endTime := match[1]; end else if (RegexA.IsMatch(Event.Time)) then begin startTime := '8:00'; endTime := '10:00'; end else if (RegexB.IsMatch(Event.Time)) then begin startTime := '9:00'; endTime := '12:00'; end else if (RegexC.IsMatch(Event.Time)) then begin startTime := '12:00'; endTime := '15:00'; end else if (RegexD.IsMatch(Event.Time)) then begin startTime := '14:00'; endTime := '16:00'; end else begin allDayEvent := true; startTime := Event.startTimeDate; endTime := Event.EndDate.AddDays(1); end Ich würde daher aus
Delphi-Quellcode:
das machen:
if bla then
begin TuWas; end
Delphi-Quellcode:
Dann kann man auch (etwas leichter) links am Rand 'runtergucken um das nächste end zu sehen.
if bla then
begin TuWas; end |
AW: Die "richtige" Sourcecode Formatierung?
Auch wenn solche Threads sich wiederholen. Etwas kann man immer mitnehmen.
Durch solche Threads habe ich für mich das "Exit" entdeckt. Gibt's natürlich schon länger und habe ich bisher immer als "bah" angesehen. Beim näheren Hinsehen kann man das aber sehr sinnvoll als ersatz für die If-Verschachtelung verwenden. Statt
Delphi-Quellcode:
Finde ich folgendes besser lesbar
if bla then
Result = 3 else if blabla then Result = 5 else if Blub then Result = 8 else Result = 10
Delphi-Quellcode:
if bla then
Exit(3); if blabla then Exit(5); if Blub then Exit(8); Result = 10 |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Wo sind deine Then's geblieben? und auch noch Tabs... hmm ":="; hmm end : String? Zitat:
Case Ersatz... (Wenn überhaupt)
Delphi-Quellcode:
start, end: string;
if (SpecificRegex.IsMatch(Event.Time)) then begin match := SpecificRegex.Match(Event.Time); start := match[0]; end := match[1]; end else if (RegexA.IsMatch(Event.Time)) then begin start := '8:00'; end := '10:00'; end else if (RegexB.IsMatch(Event.Time)) then begin start := '9:00'; end := '12:00'; end else if (RegexC.IsMatch(Event.Time)) then begin start := '12:00'; end := '15:00'; end else if (RegexD.IsMatch(Event.Time)) then begin start := '14:00'; end := '16:00'; end else begin allDayEvent = true; start = Event.StartDate; end = Event.EndDate.AddDays(1); end |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
Zitat:
Sry, die Tabs werden im Forum nicht gut angezeigt. (Tabs vs Spaces würde ich auf später verschieben...) Ich habe sie durch Leerzeichen ersetzt ;-) |
AW: Die "richtige" Sourcecode Formatierung?
Habt Ihr euch mal überlegt dass man im Endeffekt ganz andere Probleme hat wenn man anfangen muss 5-fach verschachtelte Bedingungen zu schreiben? :stupid:
Beiträge wie dieser sind wahrscheinlich der Grund weshalb ich nirgendwo eingeladen werde |
AW: Die "richtige" Sourcecode Formatierung?
Zitat:
|
AW: Die "richtige" Sourcecode Formatierung?
Beim letzten Beispiel sieht man nur lauter IF's aber die so seltsam eingerückten ELSE vorher gehen komplett verloren. Das nenn ich mal unübersichtlich.
Ich denke über dieses Thema könnte man endlos streiten und nie zu einem Kompromiss finden, jeder hat hier halt seine Vorlieben. Vielleicht sollten wir es dabei auch belassen 8-) |
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 10:23 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