Einzelnen Beitrag anzeigen

jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#15

Re: Break schlechter Programmierstil?

  Alt 11. Dez 2003, 16:04
Bei so einfachen Beispielen ist die Benutzung von Break sicher nicht begründet. Das break ist eher für eine Schleife, in der mehr als nur eine Anweisung steht gedacht, wobei die restlichen Anweisungen bei einer bestimmten Bedingung nicht mehr ausgeführt und die Schleife verlassen werden soll.

Versuche mal folgenden Code ohne Break (und natürlich ohne goto) zu realisieren. Welcher der beiden Codes wird leichter zu lesen sein?
Delphi-Quellcode:
    while (i < lCount) or (ri < rCount) do begin
      if i < lCount then l := FLocalFL.Items[Integer(lList.Objects[i])]
       else begin
        // alle restlichen Remote-Dateien in die Delete-Listen
        while ri < rCount do begin
          if FRemoteFL.Items[Integer(rList.Objects[ri])].IsDir
           then delDirs.AddObject('-d' + rList[ri], rList.Objects[ri])
           else delFiles.AddObject('-f' + rList[ri], rList.Objects[ri]);
          inc(ri);
        end;
        break; // und raus
      end;
      if ri < rCount then rl := FRemoteFL.Items[Integer(rList.Objects[ri])]
       else begin
         // alle restlichen Local-Dateien in die Add-Listen
         while i < lCount do begin
           if FLocalFL.Items[Integer(lList.Objects[i])].IsDir
            then addDirs.AddObject('+d' + lList[i], lList.Objects[i])
            else addFiles.AddObject('+f' + lList[i], lList.Objects[i]);
           inc(i);
         end;
         break; // und raus
      end;

      if not DoCompare(l.Name, rl.Name) then begin
        // Datei suchen
         x := ri;
         while (x < rCount) and (not DoCompare(rList[x], l.Name)) do inc(x);
         if x = rCount then begin
           // nicht gefunden

          // Datei/Ordner hinzufügen
            if l.IsDir then addDirs.AddObject('+d' + l.Name, lList.Objects[i])
             else addFiles.AddObject('+f' + l.Name, lList.Objects[i]); // neue Datei // LocalIndex

            dec(ri); // und ri am Ende nicht erhöhen
          end else begin
           // gefunden

           // Alle dazwischenliegenden Dateien löschen
           while ri < x do begin
             if FRemoteFL.Items[Integer(rList.Objects[ri])].IsDir
              then delDirs.AddObject('-d' + rList[ri], rList.Objects[ri])
              else delFiles.AddObject('-f' + rList[ri], rList.Objects[ri]);
             inc(ri);
           end;
          // Daten holen
           rl := FRemoteFL.Items[Integer(rList.Objects[ri])];
         end;
      end;

      if DoCompare(l.Name, rl.Name) then begin
         if l.IsDir and rl.IsDir then begin end // Verzeichnisse nicht überprüfen
          else if l.IsDir <> rl.IsDir then begin
            if rl.IsDir then begin
              // eine Datei ist ein remote Verzeichnis ??? -> remote Verzeichnis mit Subdirs löschen.
               delDirs.AddObject('-d' + rl.Name, rList.Objects[ri]); // RemoteIndex
               dir := rl.Name + '/';
               len := length(dir);
               inc(ri);
              // Unterordner löschen
               while (ri < rCount) do begin
                 rl := FRemoteFL.Items[Integer(rList.Objects[ri])];
                 if DoCompare(copy(rl.Name, 1, len), dir) then begin
                    if rl.IsDir
                     then delDirs.AddObject('-d' + rl.Name, rList.Objects[ri])
                     else delFiles.AddObject('-f' + rl.Name, rList.Objects[ri]); // RemoteIndex
                 end else break;
                 inc(ri);
               end;
               dec(ri);
              // und die Datei hinzufügen
               addFiles.AddObject('+f' + l.Name, lList.Objects[i]); // LocalIndex
             end else begin
              // ein Verzeichnis ist eine remote Datei ??? -> remote Datei löschen
               delFiles.AddObject('-f' + rl.Name, rList.Objects[ri]); // RemoteIndex
              // und das Verzeichnis hinzufügen
               addDirs.AddObject('+d' + l.Name, lList.Objects[i]); // LocalIndex
            end;
          end else begin
          // nur Dateien hier:
           update := False;
           if (FUpdateDate) then begin
              update := ((not FUpdateOnlyNewerDate) and
                         (l.LastWriteTime <> rl.LastWriteTime))
                         or
                        ((FUpdateOnlyNewerDate) and
                         (l.LastWriteTime > rl.LastWriteTime));
           end;
           if (FUpdateSize) and (l.Size <> rl.Size) then update := True;

           if update then
              updFiles.AddObject('*f' + l.Name, lList.Objects[i]); // LocalIndex
         end; // if
      end; // if

      inc(i);
      inc(ri);
    end; // while
  Mit Zitat antworten Zitat