AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wann wird eine If Abfrage verlassen

Ein Thema von bernhard_LA · begonnen am 19. Jan 2015 · letzter Beitrag vom 20. Jan 2015
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.538 Beiträge
 
Delphi 12 Athens
 
#1

AW: wann wird eine If Abfrage verlassen

  Alt 19. Jan 2015, 10:01
Was ist denn eigentlich ValueA?
Ein String kann es nicht sein, da sonst der Compiler gemecktert hätte ... vonwegen der Kompatibilität zwischen Char und Integer.
Und die neuen Strings, in den mobilen Plattformen, sind nun standardmäßig auch 0-basierend.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: wann wird eine If Abfrage verlassen

  Alt 19. Jan 2015, 10:09
Und was ist mit dem allseits beliebten
if (length(a)>0) and (copy(a,1,1)='H') then bei einem Leerstring würde die vollständige Auswertung nicht so doll sein
Bei einer ganzen Latte von ifs die sich mit einem String beschäftigen wäre eine Aufteilung natürlich sinnvoller (da gibts dann keine vollständige Auswertung mehr):
Delphi-Quellcode:
if length(a)>0 then begin
  if copy(a,1,1)='Gthen..
  if a[length(a)]='\then ...
end;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (19. Jan 2015 um 10:10 Uhr) Grund: Tippfehler en masse
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.538 Beiträge
 
Delphi 12 Athens
 
#3

AW: wann wird eine If Abfrage verlassen

  Alt 19. Jan 2015, 11:36
Und was ist mit dem allseits beliebten
if (length(a)>0) and (copy(a,1,1)='H') then bei einem Leerstring würde die vollständige Auswertung nicht so doll sein
Nee, knallt natürlich nicht, da Copy die Stringlänge beachtet und weniger zurückgibt, wie verlangt wurde, wenn weniger drin ist.

Kann man also problemlos auf if copy(a,1,1)='Hthen kürzen und ansonsten wäre es auch egal, ob vollständig ausgewertet wird oder nicht.

Hier gäbe es aber Probleme if (length(a)>0) and (a[1]='H') then ,
aber da "standardmäßig" nicht vollsändig ausgewertet wird, ist der Code eigentlich optimaler, da nicht "sinnlos" ein neuer String erstellt und freigegeben wird.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: wann wird eine If Abfrage verlassen

  Alt 19. Jan 2015, 14:30
Das ein copy(a,1,maxint) funktioniert habe ich ja schon dankbar zur Kenntnis genommen, daß das auch für leere Strings gilt war mir neu.
Naja man lernt nicht aus.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: wann wird eine If Abfrage verlassen

  Alt 20. Jan 2015, 07:48
Wenn ich so etwas sehe:
Delphi-Quellcode:
If (length(ValueA)=0) or (length(ValueA)> 0 and ValueA[0] < 1) then
...
muss ich immer 2x hinschauen. Auch später, beim Lesen des Codes. Also überlege ich mir "Was bedeutet das eigentlich". Z.B. will ich sicherstellen, das 'ValueA' mindestens einen gültigen Wert enthält. Also schreibe ich
If HasAtLeastOneValidValue(ValueA) then . *DAS* kann man lesen.
Nächster Schritt. Was bedeutet also 'HasAtLeastOneValidValue' ? Also ausformulieren
Delphi-Quellcode:
function HasAtLeastOneValidValue (aArray : TIntegerArray) : Boolean;
Begin
  if Length(aArray)=0 then exit(false);
  if aArray[0]<1 then exit(false);
  exit(true);
end;
Unit-Test für diese Idiotenfunktion schreiben, läuft, fertig. Kommentieren? Wieso? Ist sie doch schon. Falls mir das nicht reicht, mit dem Kommentar, mach ich Folgendes:
Delphi-Quellcode:
function HasAtLeastOneValidValue (aArray : TIntegerArray) : Boolean;
Begin
  if IsEmpty(aArray) then
     exit (false);

  result := ElementIsValid(aArray[0]);
end;

Function IsEmtpy (aArray : TIntegerArray) : Boolean;
begin
  result := Length(aArray) = 0;
end;

Function ElementIsValid(aElement : Integer) : Boolean;
begin
  result := aElement >= 1;
end;
Das versteht selbst Oma. Ich persönlich würde wirklich so weit gehen.

Aber irgendwann fällt meinem Kollegen (ein Performancefetischist) auf, das man die Funktion verkleinern kann. Kein Problem, wir haben ja den Unittest. Also macht er vielleicht später daraus einen Einzeiler. Oder auch nicht, vollkommen egal.

Ich komme durch dieses Refactoring bzw. Top-Down-Programmieren mit stufenweiser Verfeinerung bei etwas komplexeren boolschen Ausdrücken nie in die Verlegenheit, den Ausdruck in eine Zeile zu quetschen, sondern kann mich in der Funktion nach Herzenslust austoben. Das erhöht die Lesbarkeit enorm (gut, es ist etwas kleinlich), aber wenn ich nach 10 Jahren nochmal reinschaue, verstehe ich es immer noch. Und mir ist das sehr wichtig.

Warum das in Delphi ein globaler (ziemlich auffälliger) Compilerschalter ist und nicht wie in so ziemlich allen Sprachen ein "&&" bzw "&" habe ich nie verstanden...
Das ist doch ganz einfach:

A and B ist ein Boolscher Ausdruck, bei dem selbstverständlich -rein mathematisch gesehen- A und B ausgerechnet bzw. ermittelt wird. Irgendwann, als die CPU noch langsam waren, kam jemand auf die Idee, das B (oder A?) gar nicht ausgerechnet werden muss, wenn FALSE beim ersten Element rauskommt. Wow. Optimierung war damals hoch im Kurs. Blöd für die Compiler, die einen Ausdruck von rechts nach links ausgewertet haben (C war früher so -glaube ich-). Da kommt man dann durcheinander, weswegen ich mich früher nie darauf verlassen habe, sondern immer 'If A then if B then' geschrieben habe.

Aber da Delphi ursprünglich aus Turbopascal entstanden und Turbopascal auch in Felsmalereien in Steinzeithöhlen zu finden ist, hat sich das bis heute so gehalten. Bei Delphi wird Tradition noch groß geschrieben.

Wie hättest Du es denn gerne? If A andthen B then Delphi will ja partout keine kurzen Operatoren...

Geändert von Dejan Vu (20. Jan 2015 um 07:55 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.211 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: wann wird eine If Abfrage verlassen

  Alt 20. Jan 2015, 08:13
und Turbopascal auch in Felsmalereien in Steinzeithöhlen zu finden ist, [...]
Klasse Wer kann mit Photoshop umgehen und so etwas mal zaubern?

Alternativ könnten die nächsten Delphitage ja auch in irgendeiner archäologischen Grabungsstätte stattfinden.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#7

AW: wann wird eine If Abfrage verlassen

  Alt 20. Jan 2015, 08:19
Wie hättest Du es denn gerne? If A andthen B then Delphi will ja partout keine kurzen Operatoren...
Du meinst AndAlso?
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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