Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Ausführung von Boolschen-Vergleichen (https://www.delphipraxis.net/171554-ausfuehrung-von-boolschen-vergleichen.html)

Jumpy 12. Nov 2012 13:45


Ausführung von Boolschen-Vergleichen
 
Hallo,
Eine Reihe von Jobs (Namen kommen aus einer Stringlist "Jobs" sollen hintereinander ausgeführt werden. Wenn da bei einem was falsch läuft, soll der Rest trotzdem gemacht werden, das Gesamtergebnis der Funktion soll aber false zurückliefern, wenn mind. ein Job einen Fehler hatte.
Die folgende Konstruktion müsste das doch machen oder?

Delphi-Quellcode:
function TJoblist.ExecuteJobs:Boolean;
var i:Integer;
    j:TJob;
begin
  Result:=true;
  for i:=0 to Jobs.Count-1 do
    begin
    j:=JobFactory.GetJob(Jobs[i]);
    Result:=j.Execute And Result;
    //Result:=Result And j.Execute; //So gehts nichtmehr nachdem einer false war
    if Assigned(fProgress) then fProgress;
    end;
  j:=nil;
end;
Ist die letzte Zuweisung j:=nil nötig/sinnvoll? Der Compliler sagt sowas ala j wird nie verwendet. Könnte man dass daher auch weglassen, da die Funktion ja danach zuende ist?
Die Job-Objekte werden später innerhalb der Factory-Klasse freigegeben, wenn diese selbst freigegeben wird.

Jonas Shinaniganz 12. Nov 2012 13:50

AW: Ausführung von Boolchen-Vergleichen
 
Wenn du formatierst dann gibts oft schneller eine Antwort. Ich habs einfach erstmal formatiert.

Delphi-Quellcode:
function TJoblist.ExecuteJobs:Boolean;
var
  i : Integer;
  Job : TJob;
begin
  Result := true;

  for i := 0 to Jobs.Count - 1 do
  begin
    Job := JobFactory.GetJob(Jobs[i]);

    Result := Job.Execute and Result;
  end;

end;
Edit:
Zitat:

Die folgende Konstruktion müsste das doch machen oder?
Ja das Programm geht alle Jobs durch und wenn Result einmal False war, wird es nicht mehr True.

(X and False) wenn einer der Booleans False wird, wird die "and-Verknüpfung" nie wieder True.

DeddyH 12. Nov 2012 13:56

AW: Ausführung von Boolchen-Vergleichen
 
Statt
Zitat:

Delphi-Quellcode:
Result := j.Execute And Result;

kann man auch
Delphi-Quellcode:
if not j.Execute then
  Result := false;
schreiben. Das Ergebnis sollte aber dasselbe sein. Und das Zuweisen von nil könnte höchstens im Zusammenhang mit COM-Interfaces von Belang sein, ansonsten dürfte es wegoptimiert werden.

Bummi 12. Nov 2012 14:07

AW: Ausführung von Boolchen-Vergleichen
 
wobei die andere Schreibweise bei so etwas wieder an Charme gewinnt
Delphi-Quellcode:
  for i := 0 to Jobs.Count - 1 do
      Result := JobFactory.GetJob(Jobs[i]).Execute and Result;

Jumpy 12. Nov 2012 14:28

AW: Ausführung von Boolchen-Vergleichen
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1190844)
Wenn du formatierst dann gibts oft schneller eine Antwort. Ich habs einfach erstmal formatiert.

War doch formatiert, wenn auch nur kurz und knapp :-D
Trotzdem aber danke, auch an alle anderen für die Bestätigung. War mir nämlich gerade irgendwie unsicher wie das nochmal war mit dem vorzeitigen Abbrechen Boolcher Auswertungen. Hatte nämlich ursprünglich die auskommentierte Version in #1 und da wurde das Execute nämlich logischerweise nicht mehr ausgeführt, wenn's einmal falsch war.

Delphi-Quellcode:
function TJoblist.ExecuteJobs:Boolean;
var i:Integer;
begin
  Result:=true;
  for i:=0 to Jobs.Count-1 do
    begin
    Result:=JobFactory.GetJob(Jobs[i]).Execute And Result;
    if Assigned(fProgress) then fProgress;
    end;
end;
Hier mal die Version ala Bummi mit wegoptimierter Job-Variable, dann ist auch das nillen unnötig;

Jonas Shinaniganz 12. Nov 2012 14:55

AW: Ausführung von Boolchen-Vergleichen
 
Ich habe auch kurz überlegt die Hilfsvariable rauszunehmen. Jetzt ist die Zeile allerdings länger.

Kannst du mir noch kurz erklären warum du bis
Delphi-Quellcode:
Jobs.Count-1
zählst aber dann nicht
Delphi-Quellcode:
Jobs.Items[I].Execute
machst, sondern noch die JobFactory benutzt, um den Job rauszubekommen? Ist das Teil eines Patterns?

Okay stimmt, deine Formatierung ist einfach anders als meine.

-klugscheiß-
Ich bin mir jedoch sicher, das man Boolchen -> Boolesche schreibt.
Wenn du dass korrigierst können andere später mit dem Suchwort "Boolesche" auch deinen Thread hier finden und davon profitieren. :) Grüße

stahli 12. Nov 2012 15:02

AW: Ausführung von Boolchen-Vergleichen
 
Diese optimierte AND-Behandlung wurde irgendwann mal eingeführt.
Ich denke, es gibt einen Schalter, um das auszuschalten, ich würde mich aber lieber danach richten und meinen Programmablauf danach ausrichten.

Evtl. auch eine Variable zuweisen
Delphi-Quellcode:
JobResult := Job.Execute...
und dann
Delphi-Quellcode:
Result := Result and JobResult
.
Das ist eine Zeile mehr, verbessert aber ggf. die Übersichtlichkeit (reine Geschmachssache).

Insofern würde ich auch eher mit dem "J" (oder besser "Job") arbeiten. Ein nilen am Schluss ist aber unnötig, da die Variable dann ja ohnehin nicht mehr gebraucht und verworfen wird.

ChrisE 12. Nov 2012 15:15

AW: Ausführung von Boolchen-Vergleichen
 
Delphi-Quellcode:
{$B+}
bzw.
Delphi-Quellcode:
{$BOOLEVAL ON}
dürften das Zauberwort sein.
Boolesche Kurzauswertung
  • Warum das Boolesche heißt ist mir unklar - wäre auch eher bei boolsche bzw. bool'sche
  • Ist bis XE2 auch noch so gültig (Link zeigt zur Hilfe für D2007)

Gruß, Chris

silver-moon-2000 12. Nov 2012 17:36

AW: Ausführung von Boolchen-Vergleichen
 
Zitat:

Zitat von ChrisE (Beitrag 1190864)
[*]Warum das Boolesche heißt ist mir unklar - wäre auch eher bei boolsche bzw. bool'sche

Ich bin mal so frei, aus http://de.wikipedia.org/wiki/Boolesche_Variable zu zitieren
Zitat:

Boolesche Variable, benannt nach George Boole, sind Elemente einer booleschen Algebra. Sonderform ist die Schaltvariable (engl.: switching variable)

ChrisE 13. Nov 2012 06:43

AW: Ausführung von Boolschen-Vergleichen
 
Zitat:

Zitat von silver-moon-2000 (Beitrag 1190889)
Ich bin mal so frei, aus http://de.wikipedia.org/wiki/Boolesche_Variable zu zitieren

:thumb: - das hatte ich nach verfassen meines Beitrages auch gefunden. Man lernt nie aus :-)

Aber das da ein Hilfe-Beitrag bearbeitet wurde, ohne das man jetzt noch sieht worauf ICH reagiert habe is schon interessant ;-)
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1190858)
-klugscheiß-
Ich bin mir jedoch sicher, das man Boolchen -> Boolesche schreibt.
Wenn du dass korrigierst können andere später mit dem Suchwort "Boolesche" auch deinen Thread hier finden und davon profitieren. :) Grüße

Schließlich sieht man an vom TE geänderten Thread-Titel (Ausführung von Boolschen-Vergleichen) und den Antwort-Titeln (Ausführung von Boolchen-Vergleichen) wie der Thread ursprünglich hieß und wie er zuerst aufgefordert wurde umbenannt zu werden ;-)

Einen schönen Tag Euch allen :-)

Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr.
Seite 1 von 2  1 2      

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