Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wie String auf "Leer" prüfen? (https://www.delphipraxis.net/169312-wie-string-auf-leer-pruefen.html)

TiGü 11. Jul 2012 14:05

Wie String auf "Leer" prüfen?
 
Warum nochmal war es besser einen String auf Leerheit zu prüfen indem man folgendes tut:
Delphi-Quellcode:
// Variante 1
var
  teststr : string
  IsNoEmptyString : Boolean;
begin
  IsNoEmptyString := teststr <> '';
end;
anstatt das:
Delphi-Quellcode:
// Variante 2
var
  teststr : string
  IsNoEmptyString : Boolean;
begin
  IsNoEmptyString := Length(teststr) > 0;
end;
Ich hatte irgendwo und irgendwann mal im Forum die Begründung dafür gelesen, aber aufgrund der zu verwendenen Begrifflichkeiten findet sie Forumssuche nichts (oder ich :) ).

himitsu 11. Jul 2012 14:08

AW: Wie String auf "Leer" prüfen?
 
Wenn du es nicht tausende Male die Sekunde machst, isses vollkommen egal, was man verwendet, auch wenn ich <>'' und ='' übersichlticher finde.

Length ist eine Funktion und diese muß aufgerufen werden Sprünge im Code.

Da der "String"/AnsiString/WideString/UnicodeString intern ein Pointer ist und ein Leer-String einem nil entspricht, prüft ='' und <>'' ganz einfach nur auf nil.



Aber warum schaust du nicht einfach mal nach, was beim Debuggen in der CPU-Ansicht steht?

Medium 11. Jul 2012 22:52

AW: Wie String auf "Leer" prüfen?
 
Ist Length() nicht via Compilermagic implementiert, und testet bei langen Strings letztlich auch nur auf (quasi)
Delphi-Quellcode:
Integer(@MyString[1] - SizeOf(Integer))=0
? (Ich habs mangels Delphi auf Privat-PC nicht nachgesehen, aber mir war so und es würde Sinn machen. Zumindest solange leere lange Strings alloziert sind und den versteckten Längenzähler auch wirklich haben.)

Namenloser 11. Jul 2012 23:44

AW: Wie String auf "Leer" prüfen?
 
Die erste Variante erzeugt effizienteren OP-Code:
Code:
Project1.dpr.13: a := s = '';
00409165 833D20E2400000   cmp dword ptr [$0040e220],$00
0040916C 0F94C2           setz dl

Project1.dpr.14: b := Length(s) = 0;
0040916F A120E24000       mov eax,[$0040e220]
00409174 85C0             test eax,eax
00409176 7405             jz $0040917d
00409178 83E804           sub eax,$04
0040917B 8B00             mov eax,[eax]
0040917D 85C0             test eax,eax
0040917F 0F94C3           setz bl

himitsu 12. Jul 2012 00:01

AW: Wie String auf "Leer" prüfen?
 
Der Grund ist einfach:

Length als Pascal sieht etwa so aus.

Delphi-Quellcode:
funtion Length(str: string): Integer; inline;
begin
  if Pointer(str) = nil then
    Exit(0);
  Result := (PNativeInt(str) - 1)^;
end;
Und dann wird das nochmals mit 0 verglichen.

Dagegen ist die reine Prüfung auf nil natürlich kleiner, da diese Prüfung auch nochmals im Length enthalten ist.

Medium 12. Jul 2012 08:56

AW: Wie String auf "Leer" prüfen?
 
Wieder wat gelernt! :thumb:

Furtbichler 12. Jul 2012 09:08

AW: Wie String auf "Leer" prüfen?
 
Kleinigkeit:
Delphi-Quellcode:
 IsNoEmptyString
Ist später vermutlich sehr schlecht zu lesen...
Delphi-Quellcode:
If NOT IsNoEmptyString....
Man benötigt schon ein paar Sekunden, um beim Lesen des Codes die doppelte Negation aufzulösen.

Der Bezeichner sollte 'eigentlich' nie eine Negation im Namen beinhalten, einfach aus Gründen der besseren Lesbarkeit.

TiGü 12. Jul 2012 10:37

AW: Wie String auf "Leer" prüfen?
 
Zitat:

Zitat von Furtbichler (Beitrag 1174404)
Kleinigkeit:
Delphi-Quellcode:
 IsNoEmptyString
Ist später vermutlich sehr schlecht zu lesen...
Delphi-Quellcode:
If NOT IsNoEmptyString....
Man benötigt schon ein paar Sekunden, um beim Lesen des Codes die doppelte Negation aufzulösen.

Der Bezeichner sollte 'eigentlich' nie eine Negation im Namen beinhalten, einfach aus Gründen der besseren Lesbarkeit.

Andererseits ist in der Regel ein gefüllter String erforderlich.
Also die Abfrage auf
Delphi-Quellcode:
str <> ''
ist häufiger als
Delphi-Quellcode:
str = ''
.
Sonst müsste man immer schreiben
Delphi-Quellcode:
if not IsEmptyString then
anstatt
Delphi-Quellcode:
if IsNoEmptyString then
.

Ein Clean-Code-Dilemma.

EDIT: Ach ja, danke an himitsu und NamenLozer für die einleuchtende Erklärung.

himitsu 12. Jul 2012 10:51

AW: Wie String auf "Leer" prüfen?
 
Zitat:

Zitat von TiGü (Beitrag 1174420)
Ein Clean-Code-Dilemma.

Dann nenn es nicht Empty Leer, sondern Voll/Gefüllt. :angle:

TiGü 12. Jul 2012 12:08

AW: Wie String auf "Leer" prüfen?
 
Zitat:

Zitat von himitsu (Beitrag 1174424)
Zitat:

Zitat von TiGü (Beitrag 1174420)
Ein Clean-Code-Dilemma.

Dann nenn es nicht Empty Leer, sondern Voll/Gefüllt. :angle:

:idea: Manchmal ist man aber auch wie vernagelt...:oops:


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