Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Code-Stil Frage (https://www.delphipraxis.net/95622-code-stil-frage.html)

Tommy1988 10. Jul 2007 15:48


Code-Stil Frage
 
Hallo, ich habe diesen Code hier:

Delphi-Quellcode:
dif := 'BlaBla';
.
.
.
Label1.Caption := Format('Text BlaBla %s',[dif]);
Jetzt stelle ich mir die Frage, ob der folgende Code "gerechter" ist:

Delphi-Quellcode:
dif := 'BlaBla';
.
.
.
Label1.Caption := 'Text BlaBla '+dif;

Meflin 10. Jul 2007 15:51

Re: Code-Stil Frage
 
Wegen der besseren Lesbarkeit würde ich die zweite Version bevorzugen. Dürfte sich aber nicht viel schenken ;)


Tommy1988 10. Jul 2007 15:54

Re: Code-Stil Frage
 
Delphi-Quellcode:
dif := 'BlaBla';
dif2 := 'Blaaa2';

Label1.Caption := 'Text BlaBla '+dif+' meeeehr Text und wieder'+dif2;
Wäre jetzt es so aber besser oder ?

Delphi-Quellcode:
dif := 'BlaBla';
dif2 := 'Blaaa2';
.
.
.
Label1.Caption := Format('Text BlaBla %s meeeehr Text und wieder %s',[dif,dif2];

DeddyH 10. Jul 2007 15:55

Re: Code-Stil Frage
 
Nö, denn %d ist nicht kompatibel zu einer String-Variablen :mrgreen:

Meflin 10. Jul 2007 15:56

Re: Code-Stil Frage
 
Weiterhin finde ich die Version ohne Format besser. Man sieht einfach schneller was der Output nun wirklich ist ;)

Wenn dann aber so :stupid:
Delphi-Quellcode:
Label1.Caption := 'Text BlaBla ' + dif + ' meeeehr Text und wieder ' + dif2;

Der_Unwissende 10. Jul 2007 15:58

Re: Code-Stil Frage
 
Hi,
es wäre schon ein schlechter Style-Guide, der Label1 als Bezeichner zulässt :wink:

An sich gibt es ja keinen sinnvollen Grund Ersteres zu verbieten, es handelt sich um eine Funktion, deren Rückgabe ein String ist. Dass es zufällig eine Formatierungsfunktion ist, deren Funktion Du nachbilden kannst ist eigentlich egal. Immerhin dürfte das für viele Funktionen gelten und trotzdem wird man eher auf Bibliotheken zurückgreifen. Hier wäre also die Frage, ab wann man da eine Ausnahme macht. Dürfte kaum eine "scharfe" Grenze geben, deswegen sollte man es also für alle Funktionen erlauben und damit auch für Format. Kann ja auch Vorteile haben (sobald eben nicht nur ein String angehangen wird).

Gruß Der Unwissende

[edit]
Wo kommen denn die Beiträge alle her?! Roter Kasten wo bist DU?!

Dann ist die Quizfrage doch was ist schöner:

Delphi-Quellcode:
Label1.Caption := 'Irgendein Text ' + var1 + 'noch mehr Text ' + IntToStr(var2);

// oder

Label1.Caption := Format('Irgendein Text %s noch mehr Text %d',
                         [var1, var2]);
[/edit]

DeddyH 10. Jul 2007 16:01

Re: Code-Stil Frage
 
Wenn Du viele Daten unterschiedlicher Typen darstellen willst, finde ich die Format-Lösung einfach besser als mit 20 IntToStr herumzuhantieren. Bei reinem Text kann man ja die einfache Konkatenation wählen.

Sidorion 10. Jul 2007 16:07

Re: Code-Stil Frage
 
Na in jedem Fall letzeres. Sobald das was im Moment noch fester String ist aus einer Ressource kommt und ggf. in verschiedene Sprachen übersetzt wird, wirds beim zweiten Fall braun.
Ein Beispiel:
Delphi-Quellcode:
deutsch
   Format('Die datei wurde am %s1. %s2 zum letzen mal geändert.',['19','Mai']);
englisch
   Format('The file was last modified on %s2 %s1.',['19','Mai']);

Der_Unwissende 10. Jul 2007 16:09

Re: Code-Stil Frage
 
Ich finde man sollte (wie gesagt) nicht für bestimmte Typen unterscheiden, ob der eine oder der andere Weg genommen wird. Ein Codestil sollte vorallem konsequent sein und das wäre es (imho) nicht, wenn man für Strings die einfache Konkatentaion wählt und sonst Format.
Was man nimmt sollte nie eine reine Frage des Stils sein. Ohne zu wissen wie Format im Detail arbeitet, es könnte ggf. etwas perfomanter sein, wenn die Funktion intern nicht mit einfacher Konkatenation arbeitet (Strings sind ja in der Länge statisch), sondern wenn gleich Speicher in der richtigen Größe alloziert und dann entsprechend gefüllt wird.

Auch das Beispiel von Sidorion (endlich funktioniert der rote Kasten auch bei mir!) zeigt, dass man es eben von anderen Dingen als den Stil abhängig machen sollte.

[edit]
falschen Namen getippt und korrigiert
[/edit]

dfried 10. Jul 2007 16:19

Re: Code-Stil Frage
 
Da kann ich Sidorio nur zustimmen. Sobald du mit dem Gedanken spielst in MultiLanguage einzusteigen ist die Variante mit dem "Format" fast zwingend notwendig.
Ich persönlich finde diese Version generell auch etwas übersichtlicher (vor allem bei mehreren Varaiblen anteilen).

Torpedo 10. Jul 2007 16:23

Re: Code-Stil Frage
 
Welche der beiden Varianten ist eigentlich performanter?

SirThornberry 10. Jul 2007 17:38

Re: Code-Stil Frage
 
Zitat:

Zitat von Tommy1988
Hallo, ich habe diesen Code hier:
Delphi-Quellcode:
dif := 'BlaBla';
.
.
.
Label1.Caption := Format('Text BlaBla %s',[dif]);
Jetzt stelle ich mir die Frage, ob der folgende Code "gerechter" ist:

Delphi-Quellcode:
dif := 'BlaBla';
.
.
.
Label1.Caption := 'Text BlaBla '+dif;

für mich stellt sich die Frage da an einer anderen Stelle denn so finde ich es unkonsequent. Entweder beide Strings auslagern in eine Variable oder keinen.
Delphi-Quellcode:
dif := 'BlaBla';
full := 'Text BlaBla %s';
[...]
Label1.Caption := Format(full,[dif]);
Delphi-Quellcode:
dif := 'BlaBla';
full := 'Text BlaBla ';
[...]
Label1.Caption := full+dif;

negaH 10. Jul 2007 18:29

Re: Code-Stil Frage
 
Ich stimme Sidorion vollständig zu.

Bei größeren Projekten wird man nach und nach alle Format() String als Resourcen auslagern und kann dann mit den in Delphi integrierten Tools Resourcen DLLs erzeugen und hat so sehr schnell eine Mehrsprachenanwendung.

Von der Performance her könnte Format() sogar schneller sein als das manuelle Zusammenbauen. Besonders wenn man viele verschiedene Parameter benutzt wird Format immer performanter. Es kann intern mit preallozierten Buffern arbeiten und so unnörige Aufrufe zum Speichermanager vermeiden, und gerade dieser steht in Zeiten Multithreaded Anwendungen unter enormen Performancedruck (Locking per RTLs ist das Stichwort).
Zudem erlaubt es die Anwendung von Format() String bei der Translation in eine andere Sprache die Parameterreihenfolge ztu ändern. Man muß dazu konsequenter weise so vorgehen

Delphi-Quellcode:
resourcestring
  sTest1 = 'Das ist ein %1:0.2d %2:s mit mehreren Parametern als %2:%s';
  sTest2 = 'Dieser %2:%s ist der %1:0.2d. Versuch eines %2:%s';

  ShowMessage(Format(sTest1, [12, 'Test']));
  ShowMessage(Format(sTest2, [12, 'Test']));
Dh. wir geben den Parameterindex in der Formatierung mit an. Einfach mal ausprobieren, denn die Parameterindizierung ist wenig bekannt.

Ein weiters Kriterium ist die realtive Universalität von Format(), ich würde mir ein printf() wünschen, also noch viel merh Features in Format().
Format() ersetzt nicht nur die simple Stringkonkatenation sondern auch IntToStr() sogar mit Ausrichtung und Ausfüllen führender Nullen, es ersetzt IntToHEX(), es kann einen Pointer formatieren, einen PointerToStr() gibts dagegen garnicht. Einzigst Fließkomma wird nicht unterstützt und das ist enorm schade würde doch die vielen FormatFloat(), FloatToStr() usw. auch noch ersetzt.
Somit kann man mit der Anwnedung von Format() den Bibliothekumfang und die Lesbarkeit und Wartbarkeit des Sources enorm verbessert werden. Statt eben 20 verschiende Funtkionen nur eine universelle Formatierung Funktion. Leider ist die C Fraktion mit ihren printf() da weiter.

Gruß Hagen

DeddyH 10. Jul 2007 18:32

Re: Code-Stil Frage
 
Zitat:

Zitat von negaH
Einzigst Fließkomma wird nicht unterstützt und das ist enorm schade würde doch die vielen FormatFloat(), FloatToStr() usw. auch noch ersetzt.

Was meinst Du jetzt damit?
Delphi-Quellcode:
ShowMessage(Format('%.2f',[3.1415927]));

negaH 10. Jul 2007 18:33

Re: Code-Stil Frage
 
Ähm, das geht ? ab welcher Delphi Version ?

Gruß hagen

jbg 10. Jul 2007 18:35

Re: Code-Stil Frage
 
Zitat:

Zitat von negaH
ab welcher Delphi Version ?

Delphi 3. Aber vielleicht war das schon in Delphi 1 möglich (kann ich jetzt nicht mehr nachvollziehen)

negaH 10. Jul 2007 18:39

Re: Code-Stil Frage
 
ich schaue das aber nochmal in der Hilfe nach. wart....
Ok ab Delphi 3.
Was Hänzchen in Delphi 1 nicht lernt lernt er ab Delphi 3 nimmer mehr ;)

Man lernt nie aus, danke.

Und noch par Gründe mehr , den Format() kann auch teilweise die Float Konvertierungen einsparen.

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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