Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Doppelte Schleife verlassen (https://www.delphipraxis.net/183516-doppelte-schleife-verlassen.html)

Popov 16. Jan 2015 15:35

AW: Doppelte Schleife verlassen
 
Ich persönlich nutze dafür immer ein Boolean:

Delphi-Quellcode:
var
  a, b: Integer;
  c: Boolean;
begin
  c := False;

  for a := 0 to 10 do
  begin
    for b := 0 to 10 do
    begin
      ShowMessage('b = ' + IntToStr(b));
      if b = 1 then
      begin
        c := True;
        Break;
      end;
    end;

    if c then Break;

    ShowMessage('a = ' + IntToStr(a));
  end;

  ShowMessage('Und weiter im Programm');
end;

Wenn es etwas unkonventionell sein darf, dann kann man das auch mit Except lösen:

Delphi-Quellcode:
var
  a, b: Integer;
begin
  try
    for a := 0 to 10 do
    begin
      for b := 0 to 10 do
      begin
        ShowMessage('b = ' + IntToStr(b));
        if b = 1 then Abort;
      end;
      ShowMessage('a = ' + IntToStr(a));
    end;
    ShowMessage('Schleifen sind durch');
  except
    ShowMessage('Hallo aus Except');
  end;
  ShowMessage('Und weiter im Programm');
end;

Der schöne Günther 16. Jan 2015 18:23

AW: Doppelte Schleife verlassen
 
Zitat:

Zitat von Linus Benedict Torvalds
If you need more than 3 levels of indentation, you're screwed anyway, and should fix your program.

Ich lasse das mal hier

Dejan Vu 16. Jan 2015 18:33

AW: Doppelte Schleife verlassen
 
Wie von Uwe Raabe schon erwähnt:
Delphi-Quellcode:
 
..
  Function ProcessAction : Boolean;
  var
    varCurrActClass : TLastActionClass;
    i : integer;

  begin    
    for i := 0 to FLastActionList.Count -1 do begin
      varCurrActClass := FLastActionList.Items[i];
      if (...) then begin
        FLastActionList.Remove(varCurrActClass);
        FLastActionList.TrimExcess;
        exit(true);
      end;
     
      if (...) then begin
        FLastActionList.Remove(varCurrActClass);
        FLastActionList.TrimExcess;
        exit(true);
      end;
    end;
    exit(false);
  end;

begin
  while ProcessAction() do;
end;
Bisserl refactoring wg. DRY wäre noch möglich. Und der Funktion solltest Du noch die passende Bezeichnung verpassen.

Goto wird nie benötigt und wer ein Flag mitschleppen muss, weil innere Schleifen verlassen, sollte refaktorisieren. Ausnahme: Höchst zeitkritische Abläufe, denn dann ist alles erlaubt. Aber ansonsten geht imho Clean Code vor Performance.

Martin W 16. Jan 2015 20:23

AW: Doppelte Schleife verlassen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1286779)
Aber ansonsten geht imho Clean Code vor Performance.

Ja, daran muss ich mich auch häufiger selbst erinnnern... :mrgreen:

Danke für das Beispiel!

Sir Rufo 16. Jan 2015 20:42

AW: Doppelte Schleife verlassen
 
Wenn ich das richtig sehe, dann müsste es so auch DRY werden.
Delphi-Quellcode:
function ProcessAction : Boolean;
var
  varCurrActClass : TLastActionClass;
  i : integer;
begin
  try
    for i := 0 to FLastActionList.Count -1 do
    begin
      varCurrActClass := FLastActionList.Items[i];

      if
        {Bedingung1} (...)
        {oder} or
        {Bedingung2} (...)
      then
        begin
          FLastActionList.Remove(varCurrActClass);
          FLastActionList.TrimExcess;
          exit(true);
        end;
     
    end;
    exit(false);
  finally
    {Wenn es noch etwas zu tun gibt, wird quasi immer ausgeführt}
  end;
end;

begin
  while ProcessAction( ) do;
end;
Aber wenn ich es mir so richtig anschaue, dann müsste sich das komplett so abtüten lassen:
Delphi-Quellcode:
procedure ProcessAction;
var
  varCurrActClass : TLastActionClass;
  i : integer;
begin
    for i := FLastActionList.Count -1 downto 0 do
    begin
      varCurrActClass := FLastActionList.Items[i];

      if
        {Bedingung1} (...)
        {oder} or
        {Bedingung2} (...)
      then
        begin
          FLastActionList.Delete( i );
        end;
     
    end;
  FLastActionList.TrimExcess;
end;

Martin W 16. Jan 2015 21:38

AW: Doppelte Schleife verlassen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1286792)
Aber wenn ich es mir so richtig anschaue, dann müsste sich das komplett so abtüten lassen:
Delphi-Quellcode:
procedure ProcessAction;
var
  varCurrActClass : TLastActionClass;
  i : integer;
begin
    for i := FLastActionList.Count -1 downto 0 do
    begin
      varCurrActClass := FLastActionList.Items[i];

      if
        {Bedingung1} (...)
        {oder} or
        {Bedingung2} (...)
      then
        begin
          FLastActionList.Delete( i );
        end;
     
    end;
  FLastActionList.TrimExcess;
end;

Das mit dem downto ist eine feine Sache, so kann man wunderbar das OutOfRange verhindern ohne das in eine while Schleife zu packen :thumb: Edit: Works amazing :thumb:

Delphi-Quellcode:
      if
        {Bedingung1} (...)
        {oder} or
        {Bedingung2} (...)
      then
Eine Möglichkeit, ja aber die if Abfragen sind etwas größer, daher hatte ich das aufgeteilt um den Code Übersichtlich zu halten.

Sir Rufo 17. Jan 2015 01:38

AW: Doppelte Schleife verlassen
 
Zitat:

Zitat von Martin W (Beitrag 1286795)
Delphi-Quellcode:
      if
        {Bedingung1} (...)
        {oder} or
        {Bedingung2} (...)
      then
Eine Möglichkeit, ja aber die if Abfragen sind etwas größer, daher hatte ich das aufgeteilt um den Code Übersichtlich zu halten.

Es ist egal wie groß die sind, wenn zu groß, dann in Funktionen auslagern und dann benutzen. Sehr oft gibt es dann auch noch Überschneidungen, die man dann auch noch auslagern und wieder verwenden kann. Und schwups kann man auch die einzelnen Teilergebnisse prüfen, wenn die Abfrage mal nicht so hinhaut, wie man sich das gedacht hat.

Definitiv sollte man keinen Code doppelt schreiben, denn Änderungen müssen dann auch doppelt gepflegt werden und das ist schon wieder der Anfang vom Chaos ;)


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

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