Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   while-Schleife verbessern / verschönen (https://www.delphipraxis.net/79480-while-schleife-verbessern-verschoenen.html)

Luckie 23. Okt 2006 15:08


while-Schleife verbessern / verschönen
 
Ich habe folgende while-Schleife:
Delphi-Quellcode:
        j := 0;
        bCriteria := True;
        // durch Kriterien iterieren
        while (j < NodesCriteria.length) and (bCriteria) do
        begin
          bCriteria := IsHit(FormName, NodesCriteria.item[j]);
          DebugLog('Kriterium ' + IntToStr(j), BoolToStr(bCriteria, True));
          Inc(j);
        end;
        if bCriteria then
        begin
          // letzten Knoten mit Treffer merken
          HitNode := Node;
          Inc(Counter);
        end;
Kann man das noch irgendwie eleganter Lösen? Ich versuche gerade einen Programmablaufplan dazu zu machen, aber da bekomme ich etwas probleme, was mir anzeigt, dass es auch besser gehen müsste.

sakura 23. Okt 2006 15:09

Re: while-Schleife verbessern / verschönen
 
Lerne mal die Tags der :dp: zu nutzen :mrgreen: :duck:

...:cat:...

Luckie 23. Okt 2006 15:13

Re: while-Schleife verbessern / verschönen
 
Ich hatte Alt+S erwischt, anstatt Alt+D. :roll:

Khabarakh 23. Okt 2006 15:22

Re: while-Schleife verbessern / verschönen
 
Hm, so vielleicht?
Delphi-Quellcode:
procedure Foo(...);
var
  bCriteria: Boolean;
begin
  for j := 0 to NodesCriteria.Count - 1 do
  begin
    bCriteria := IsHit(FormName, NodesCriteria.item[j]);
    DebugLog('Kriterium ' + IntToStr(j), BoolToStr(bCriteria, True));
    if not bCriteria
      Exit;
  end;
 
  HitNode := Node;
  Inc(Counter);
end;

Luckie 23. Okt 2006 23:36

Re: while-Schleife verbessern / verschönen
 
Exit? Wenn dann ein break. Aber durch die while-Schleife wollte ich es verhindern so hart aus der for-Schleife aussteigen zu müssen.

SittingDuck 24. Okt 2006 02:00

Re: while-Schleife verbessern / verschönen
 

marabu 24. Okt 2006 06:37

Re: while-Schleife verbessern / verschönen
 
Hallo Michael,

zur Eleganz kann ich nicht viel sagen, da der gezeigte Code nicht in sich abgeschlossen ist - HitNode, Node, Counter und IsHit() sind nicht eingeführt. Einen code walk through mache ich dir aber gerne.

Zuerst fällt auf, dass eine kopfgesteuerte (while) Schleife mit zwei Abbruchbedingungen verwendet wird, obwohl die eine Bedingung (j < length) eine Zählschleife nahelegt und die andere (bCriteria) eine fußgesteuerte (repeat) Schleife.

Wenn length 0 ist, dann wird die Schleife übersprungen und wegen des mit True initialisierten bCriteria so getan, als ob IsHit() mindestens einmal erfolgreich aufgerufen wurde. Ob das so korrekt ist, kann ich nicht beurteilen, da der Kontext fehlt.

Deine Angst vor dem Einsatz von Break (oder Exit, Continue) solltest du versuchen zu überwinden. Es sind wohl definierte Sprachmittel, die eingeführt wurden um die Forderungen der strukturierten Programmierung mit prozeduralen Sprachen (Sprünge nur an den Schleifenrand) erfüllen zu können. Die unbedingte Vermeidung dieser Sprachmittel ist ähnlich gefährlich, wie der Einsatz von Goto.

Ich gehe davon aus, dass der gezeigte Code getestet wurde und funktioniert und dass du ihn nur nachdokumentierst. Wenn du den DebugCode in die Funktion IsHit() verlagern kannst, dann könnte eventuell Spielraum für eine klarere Formulierung entstehen.

Freundliche Grüße

Luckie 24. Okt 2006 08:25

Re: while-Schleife verbessern / verschönen
 
Die angesprochenen Elemente sind nicht weiter aufgeführt, weil sie eigentlich zum Verständniss der Schleife unerheblich sind.

Zitat:

Zuerst fällt auf, dass eine kopfgesteuerte (while) Schleife mit zwei Abbruchbedingungen verwendet wird, obwohl die eine Bedingung (j < length) eine Zählschleife nahelegt und die andere (bCriteria) eine fußgesteuerte (repeat) Schleife.
Genau das war mein Problem. Ich werde doch wohl wieder zu einer for-Schleife zurückwechseln.

Zitat:

Wenn length 0 ist, dann wird die Schleife übersprungen und wegen des mit True initialisierten bCriteria so getan, als ob IsHit() mindestens einmal erfolgreich aufgerufen wurde. Ob das so korrekt ist, kann ich nicht beurteilen, da der Kontext fehlt.
Autsch. Danke, das habe ich noch gar nicht gesehen. Das darf natürlich nicht sein.

Zitat:

Ich gehe davon aus, dass der gezeigte Code getestet wurde und funktioniert und dass du ihn nur nachdokumentierst. Wenn du den DebugCode in die Funktion IsHit() verlagern kannst, dann könnte eventuell Spielraum für eine klarere Formulierung entstehen.
Er ist getestet und funktioniert. Es handlet sich um eine Änderung/Erweiterung, die ich jetzt noch dokumentieren muss.

Besten Dank für eure Tipps und Meinungen.

Ich noch mal.

Folgender Auszug aus einer XML-Datei:
XML-Code:
   
    <doktyp FormularFilter="KOAU" SearchFieldName="Belegnummer">
      <kriterium kennung="AB" MapField="Buchungsschluessel" fromChar="0" Length="2" />
      <kriterium kennung="A16" MapField="Belegnummer" fromChar="2" Length="3" />
      <ziel>(#BUNG05)\GUTSRIFT</ziel>
    </doktyp>
Die Schleife iteriert jetzt durch die Knoten kriterium und nur, wenn alle Kriterien true liefern, darf der Zähler um eins erhöht werden.


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