Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   XEx in die Quellcodeformatierung "eingreifen"? (https://www.delphipraxis.net/178373-xex-die-quellcodeformatierung-eingreifen.html)

Mavarik 4. Jan 2014 12:19

XEx in die Quellcodeformatierung "eingreifen"?
 
Hallo Zusammen!

Kann man eigentlich die Quellcodeformatierung ändern. Also abgesehen von den Einstellungen die die IDE
direkt bietet?

Mavarik

Bernhard Geyer 4. Jan 2014 12:38

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Ja. Siehe CNpack

Union 4. Jan 2014 12:41

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Welche Eigenschaften fehlen Dir denn konkret?

Mavarik 4. Jan 2014 12:49

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1242097)
Ja. Siehe CNpack

Aus Du ein zwei mehr Infos dazu? :stupid:

Mavarik 4. Jan 2014 12:52

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Union (Beitrag 1242098)
Welche Eigenschaften fehlen Dir denn konkret?

Ich formatiere Quelltexte "eigentlich" wie "normal" nur die IF THEN ELSE Konstrukte etwas anders.

Bernhard Geyer 4. Jan 2014 14:07

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242100)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1242097)
Ja. Siehe CNpack

Aus Du ein zwei mehr Infos dazu? :stupid:

Ein Bild sagt mehr als tausend Worte: http://www.cnpack.org/images/cnwizards.gif

Mavarik 4. Jan 2014 14:11

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1242110)
Ein Bild sagt mehr als tausend Worte: http://www.cnpack.org/images/cnwizards.gif

Ja aber das sagt leider nix aus, ob und wie man die Sourcecodeformatierung ändern kann... Oder übersehe ich da etwas? :roll:

RWarnecke 4. Jan 2014 14:53

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Da stellt sich mir die Frage, ob Du nur das Highlighting ändern möchtest oder die Schreibweise wie zum Beispiel so:
Delphi-Quellcode:
if a < b then
begin

end;
oder
Delphi-Quellcode:
if a < b then begin

end;
oder
Delphi-Quellcode:
if a < b then
  begin

  end;
oder
Delphi-Quellcode:
If a < b Then
Begin

End;
Worum geht es Dir konkret ?

Uwe Raabe 4. Jan 2014 14:57

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242101)
Zitat:

Zitat von Union (Beitrag 1242098)
Welche Eigenschaften fehlen Dir denn konkret?

Ich formatiere Quelltexte "eigentlich" wie "normal" nur die IF THEN ELSE Konstrukte etwas anders.

Was genau?

Mavarik 4. Jan 2014 15:22

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
"Meine" Syntax lautet:

Wenn ein IF kein ELSE hat dann:

Delphi-Quellcode:
if bal then
  begin
  end;
Wenn ein IF ein else hat beseitzt:

Delphi-Quellcode:
if bla or blub or foo or nixnutz or (length(S) < 2)
  then begin // <- An dieser Zeile kann ich alles erkennen egal wie lang der if usw. ist.
       end
  else begin
       end;
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

Bin halt daran seit über 20 Jahren gewöhnt... Und kann daher NIE die Formatierung ausnutzen.


Mavarik

Union 4. Jan 2014 15:44

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

In dem Fall solltest Du diese ungemein hässliche Konvention wegschmeissen und cnPack einsetzen, da wird Dir so was (teiweise) visualisiert. Mittel- und langfristig solltest Du aber eher ein Refactoring machen (mit den neuen IDEs ja ein Kinderspiel).

Uwe Raabe 4. Jan 2014 15:53

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
Wenn ein IF kein ELSE hat dann:
...
Wenn ein IF ein else hat beseitzt:

Das wird auch für jeden mir bekannten anderen Source-Code-Formatierer sicher schwierig werden, da hier nicht sequentiell das nächste Token die Formatierung vorgibt, sondern erst das
Delphi-Quellcode:
else
gesucht werden muss. Der Formatierer müsste also eine Art Look-Ahead implementieren. Das macht aber soweit ich weiß keiner (zumindest nicht in dem Umfang).

Uwe Raabe 4. Jan 2014 15:55

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

Das ist an sich schon ein Don't-Do-It!

Sir Rufo 4. Jan 2014 16:18

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Ich bin immer noch für
Delphi-Quellcode:
if
  IsSomething or ( SomeValue < 0 )
then
  begin
    foo;
  end
else
  begin
    bar;
  end;
geht mit dem (eingebauten) Codeformatter, wenn
Delphi-Quellcode:
if // ein Kommentar
:stupid:
Zitat:

Zitat von Uwe Raabe (Beitrag 1242131)
Zitat:

Zitat von Mavarik (Beitrag 1242126)
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

Das ist an sich schon ein Don't-Do-It!

:thumb:

Furtbichler 4. Jan 2014 16:52

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
Bin halt daran seit über 20 Jahren gewöhnt... Und kann daher NIE die Formatierung ausnutzen.

Dann gewöhn dich doch einfach um. Tut nicht weh (Hab ich auch gemacht). Und deine 300 Zeilen langen THEN-Teile solltest Du in die Tonne treten.

Mittlerweile ist es mir vollkommen wurscht, wie jemand formatiert. Wenn es mir nicht gefällt, dann formatiere ich es um.

Rein persönlich formatiere ich so, das ich nicht allzuviele Zeilen vergeude, speziell einzelne 'then' und 'begin' finde ich überflüssig, weil sie noch ne Zeile hinzufügen. Wenn ich Scrollradproduzent wäre, oder Mittelfingerorthopäde, dann würde ich das toll finden, aber bin ich nicht.
Es ist nicht weniger lesbar, wenn so ein 'then begin' am Ende einer Zeile steht. Eigentlich ist das 'then' ja überflüssig, also ein Füllwort. Also kann das auch ans Ende der Zeile. Na ja, und so ein 'begin'... klar, kann man isoliert auf eine einzelne Zeile packen, aber wozu? Bringt doch auch kein Mehr an Lesbarkeit. Ohne Indentierung würde ich natürlich anders denken, aber da die folgenden Zeilen alle eingerückt sind und max 5 Zeilen später eh das 'end' steht, ist das doch wurscht, ob das begin nun irgendwo sichtbar ist.

Was ich ganz grauslich finde, ist das Ausrichten von Zuweisungen, also z.B.:
Delphi-Quellcode:
a.... := 123; // Punkt duch Leerzeichen ersetzen
b1234 := 45;
Da bekommt der Lesefluss sofort einen Schluckauf. Hab ich aber alles früher auch gemacht. Mittlerweile finde ich das vergeudete Zeit und sehr schlecht lesbar ist es auch. Parameterlistenausrichtung ist ähnlich behämmert, außer, für Leute, die nach Stunden bezahlt werden. Ich verwende meine Zeit lieber dafür, den Code durch Refaktorisierung und Befolgen der einschlägigen Regeln selbstdokumentierend zu machen und überlege mir lieber 2x, wie ich einen Bezeichner nenne, damit mein Partner ihn versteht, als mir zu überlegen, ob das 'begin' auf ne neue Zeile kommt oder nicht. Gut, dafür gibbet ja Formatier-O-Maten, insofern ist das Erdbeereis vs. Schoko (also Geschmackssache).

Das einzige, was hier zählt, ist doch, das sich alle im Team einig sind und man ein Formatierungstool hat, was sich so einstellen lässt. Wer heute noch per Hand Code hin und herschubst, der hat echt zu viel Zeit.

Aber am aller aller Schlimmsten finde ich mittlerweile die Verwendung von Präfixen, um den Datentyp von Bezeichnern zu kodieren ('bFlag', 'iCounter' usw). Wozu das gut sein soll, in Zeiten einer modernen IDE, frage ich mich wirklich. Zu 99% ergibt sich der Datentyp aus dem Kontext und die restlichen 1% sind fast immer schlechter Code bzw. ein falscher Bezeichner.

sx2008 4. Jan 2014 16:59

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

Da würde ich gerne mal ein Beispiel aus deinem Sourcecode sehen.
Wenn du Probleme hast auf einen Blick den Else-Teil zu erfassen, dann liegt das einfach daran dass du zuviel Code im Then-Teil hast.
Oder wenn die If-Bedingung nicht in maximal 2 Zeilen passt dann macht man etwas falsch.
Hier mal ein kleines Beispiel:
Delphi-Quellcode:
begin
  // prüfe ob Land in franz. Überseegebiet liegt
  if country='GP' or country='MQ' or country='RE' or country='GF' or country='PM' then
  begin
    ...
Diese If-Abfrage ist mit einer Zeile noch überschaubar, aber man braucht einen Kommentar um zu verstehen was das Ganze eigentlich soll.
Und hier die verbesserte Variante:
Delphi-Quellcode:
function IsFrenchOversea(const country:string): boolean;
const
   ll : array[0..4] of string = (
   'GP',  // Guadelupe
   'MQ',  // Martinique
   'RE',  // Réunion
   'GF',  // French Guyana
   'PM'   // Saint Pierre & Miquelion
   );
begin
   Result := StrIsOneOf(country, ll);
end;

begin
  if IsFrenchOversea(country) then
  begin
    ...
Insgesamt ist es mehr Code aber man braucht keinen Kommentar mehr um zu verstehen was da passiert.
Eigentlich wollte ich ein Beispiel bringen mit über 20 Teilbedingungen aber das war mir zu viel Schreibarbeit.

Also wenn eine If-Bedingung zu komplex oder zu lang wird dann packt man sie in eine Unterfunktion!

Das Gleiche gilt auch für den Then-Teil oder den Else-Teil.
Wenn es zuviele Zeilen werden dann ist das ein Zeichen dass hier etwas faul ist ("der Code stinkt").
Dann heisst es die vielen Codezeilen in Unterfunktion auszulagern.

Zitat:

Zitat von Mavarik (Beitrag 1242126)
Bin halt daran seit über 20 Jahren gewöhnt... Und kann daher NIE die Formatierung ausnutzen.

Das bedeutet dass du seit über 20 Jahren zuviel Code in eine Methode, Funktion, Prozedur oder Block packst und deshalb immer Probleme mit der Formatierung hast.
Ich kann nur empfehlen die Ursache abzustellen, dann braucht du auch keinen Codeformatierer.

Der schöne Günther 4. Jan 2014 17:03

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Ich dachte grade eine vollkommen selbst definierbare Code-Formatierung sei so ziemlich das Highlight von gexperts?

Bernhard Geyer 4. Jan 2014 17:06

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242112)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1242110)
Ein Bild sagt mehr als tausend Worte: http://www.cnpack.org/images/cnwizards.gif

Ja aber das sagt leider nix aus, ob und wie man die Sourcecodeformatierung ändern kann... Oder übersehe ich da etwas? :roll:

Auch du meinst eine Reformatierung eines Codes nach bestimmten Regeln. Das müsste AFAIK auch dabei sein.

RWarnecke 4. Jan 2014 17:07

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Mavarik (Beitrag 1242126)
"Meine" Syntax lautet:

Wenn ein IF kein ELSE hat dann:

Delphi-Quellcode:
if bal then
  begin
  end;
Wenn ein IF ein else hat beseitzt:

Delphi-Quellcode:
if bla or blub or foo or nixnutz or (length(S) < 2)
  then begin // <- An dieser Zeile kann ich alles erkennen egal wie lang der if usw. ist.
       end
  else begin
       end;
So erkenne ich schon am IF, ob es 300 Zeilen tiefer noch ein ELSE gibt.

Bin halt daran seit über 20 Jahren gewöhnt... Und kann daher NIE die Formatierung ausnutzen.


Mavarik

Wenn Du unbedingt diese Formatierung beibehalten willst, was mich persönlich sehr stören würde, dann baue Dir doch ein Code-Template. Damit kannste die Formatierung für eine IF-Abfrage Deinen Wünschen entsprechend gestalten. Ich würde aber an Deiner Stelle den Code umformatieren, so wie es meine Vorredner schon erwähnt haben und wie ich es in meinem ersten Beispiel aus Beitrag #8 erstellt habe. Dann noch CNPack Wizards installiert und man hat einen super Überblick, was die Abfrage, Schleifen u.s.w. angeht.

Uwe Raabe 4. Jan 2014 17:43

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von sx2008 (Beitrag 1242135)
Delphi-Quellcode:
begin
  // prüfe ob Land in franz. Überseegebiet liegt
  if country='GP' or country='MQ' or country='RE' or country='GF' or country='PM' then
  begin
    ...


Oder so:
Delphi-Quellcode:
 
uses System.StrUtils;
...
  // prüfe ob Land in franz. Überseegebiet liegt
  if MatchStr(country, ['GP', 'MQ', 'RE', 'GF', 'PM']) then
...

Furtbichler 4. Jan 2014 18:29

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1242144)
Oder so:

Damit weiß man aber ohne Kommentar auch nicht, was gemeint ist. Das ist ja gerade der Sinn von Clean Code: Selbstdokumentierenden Code schreiben, bei dem jede Methode genau eine kleine Sache macht, die man im Methodennamen beschreibt: Der Code ist ohne Kommentar lesbar und verständlich!

Uwe Raabe 4. Jan 2014 18:55

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Furtbichler (Beitrag 1242148)
Damit weiß man aber ohne Kommentar auch nicht, was gemeint ist. Das ist ja gerade der Sinn von Clean Code: Selbstdokumentierenden Code schreiben, bei dem jede Methode genau eine kleine Sache macht, die man im Methodennamen beschreibt: Der Code ist ohne Kommentar lesbar und verständlich!

Nach meinem Empfinden geht das hier (solange diese Funktion nicht noch an anderer Stelle gebraucht wird) hart an die Grenze dieses Paradigmas. Wenn ich das wirklich bis zum Ende durchziehen will, dann müsste jede Zuweisung in eine Methode gekapselt werden, die die Absicht hinter dieser Zuweisung im Namen trägt. Dafür bin ich dann doch wohl zu viel Pragmatiker.

Aber gut - hier ein leicht abgewandelter Ansatz, der allerdings aufwändiger zu pflegen ist und wahrscheinlich immer noch nicht den Clean Code Prinzipien genügt (ich mag übrigens die Bändchen nicht):
Delphi-Quellcode:
const
  cFrenchOverseas: array[0..4] of string = ('GP', 'MQ', 'RE', 'GF', 'PM');
...
if MatchStr(country, cFrenchOverseas) then

Mavarik 4. Jan 2014 23:03

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Oje, welche Tür hab ich geöffnet.

Zitat:

Zitat von Union (Beitrag 1242098)
Welche Eigenschaften fehlen Dir denn konkret?

Hatte es mir fast schon gedacht und wollte Dir fast nicht antworten...

Bei aller liebe, aber die Frage war, welchen und wenn wie man den Quellcodeformatter ändern kann.

Ihr könnt doch Eurer Delphi so formatieren wie Ihr es wollt... Ich mache es eben anders.

Es gibt einfach If-Verschachtelungen die lassen sich - meiner Meinung nach - besser lesen als würde man daraus Proceduren machen.

Ich suche Euch mal was raus und poste es unter Talk...

Mavarik

Furtbichler 4. Jan 2014 23:08

AW: XEx in die Quellcodeformatierung "eingreifen"?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1242154)
Nach meinem Empfinden geht das hier (solange diese Funktion nicht noch an anderer Stelle gebraucht wird) hart an die Grenze dieses Paradigmas. Wenn ich das wirklich bis zum Ende durchziehen will, dann müsste jede Zuweisung in eine Methode gekapselt werden, die die Absicht hinter dieser Zuweisung im Namen trägt. Dafür bin ich dann doch wohl zu viel Pragmatiker.

Warum nicht? Wenn dadurch der Code lesbarer wird? Es geht bei Methoden nicht nur um DRY, sondern und vor allen Dingen um Lesbarkeit. Ich will den Code (meinen und den anderer) sofort verstehen und mich nicht durch komische Abfragen hangeln müssen. Was ist so schlimm daran, die Abfrage nach dem Land in eine eigene kleine Funktion mit klarem Namen zu verschieben? Es hat *nur* Vorteile (die paar Pikosekunden Performance lassen wir mal außer acht, obwohl man das mit einer 'inline' Direktive auch noch hinbekommen könnte).

Schau Dir den (deinen) Code an. Extrahiere bzw. markiere in einer Methode, die mehr als 1 Zeile hat die Codezeilen, die genau eine Aufgabe erfüllen.
Sind die Zeilen an sich sofort verständlich, und zwar *ohne* das Du deinem fiktiven Kollegen etwas erklären müsstest?
Ist das Abstraktionsniveau dieser Zeile(n) mit den umgebenen identisch?

Ist die Antwort auf beide Fragen 'Ja', gehe zum nächsten Codeblock. Wenn nicht, refaktorisiere die Zeile(n) und spendiere ihnen eine eigene Methode mit einem Namen, der pragmatisch aber genau beschreibt, was diese Zeile(n) tun.

Sehr beliebt bei bool'schen Termen, denn wer begreift schon sofort, was folgende Zeile bedeutet:
Delphi-Quellcode:
if (Person.Position = Manager) or (Person.Salary>5000 and Person.Age>45)
  then
Aber das hier versteht jeder:
Delphi-Quellcode:
if IstBonusBerechtigt(Person)
then
Das die Person ein Manager sein muss oder mehr als 5000 verdient und älter als 45 sein muss, ist für das Verständis der IF-Abfrage irrelevant (wer es dennoch wissen will, schaut eben in der Funktion nach). Aber der Code ist sofort verständlich. Ohne Kommentar.

Und wenn die Änderungsanforderung an 'IstBonusBerechtigt' kommt (weil nun auch Abteilungsleiter in den Genuss kommen), dann weiß auch der Junior-Programmierer, wo er ansetzen muss.

Das man daraus auch eine Eigenschaft der 'Person' machen könnte, sei mal dahingestellt.

Schau Dur mal z.B. den DevExpress Quellcode an: Dort gibt es massenhaft Methoden, die nur aus einer Anweisung bestehen. So schreibt man heute guten Code. Alles andere ist imho Frickelei.

Und eines zum Schluß: Natürlich geht man pragmatisch an die Sache ran. Oder nenne es 'gesunden Menschenverstand ohne Dogma'. Ist doch logisch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 Uhr.

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