AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

for-Schleife -Abbruch

Ein Thema von thomasschaf · begonnen am 15. Nov 2011 · letzter Beitrag vom 18. Nov 2011
Antwort Antwort
Seite 2 von 2     12
thomasschaf
(Gast)

n/a Beiträge
 
#11

AW: for-Schleife -Abbruch

  Alt 15. Nov 2011, 19:27
Hallo und danke für die vielen Antworten

Am Beispiel habe ich ausprobiert, dass "A AND B" einen Fehler ergibt.

Weiß vielleicht jemand, wo ich das umstellen kann ?
Müsste ja irgendwo in "Compilereinstellungen" sein...
(In meiner Signatur steht, was ich benutze.)

Die Idee, die Überprüfung in der Funktion selbst einzubauen, ist aber wohl die beste (leddls Beitrag) !
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#12

AW: for-Schleife -Abbruch

  Alt 15. Nov 2011, 20:21
Erst schreibst du übersichtlich und dann widersprichst du dir indem du Exit in dieser Art und Weise benutzt...
Ach Gott, noch so ein Methusalem aus den Tiefen der Uraltprogrammierung.

Ich finde es sehr übersichtlich. Und lesbar. Und kompakt.

Wie würdest Du das denn umsetzen, das es ebenso lesbar und kompakt und nicht redundant ist?
  Mit Zitat antworten Zitat
Lutex

Registriert seit: 2. Feb 2008
7 Beiträge
 
Delphi 2 Desktop
 
#13

AW: for-Schleife -Abbruch

  Alt 15. Nov 2011, 23:36
Genau. Ich persönlich finde es außerordentlich übersichtlich, wenn am Anfang einer Funktion die Bedingungen aufgelistet sind, unter denen sie nicht abgearbeitet werden soll (Objekt noch nicht komplett initialisiert, falsche Parameter, ungültige Zeiger...). Wo kann es eine sinnvollere Verwendung für das "exit" geben als hier?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.504 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: for-Schleife -Abbruch

  Alt 16. Nov 2011, 00:05
Bei dem genannten Beispiel ist das halt kürzer und ein Exit ist unnötig, da vor/nach den Exit's nur das booleanische Result gesetzt wird ... also kann man die Ifbedingungen auch direkt an das Result weitergeben.
Delphi-Quellcode:
// man schreibt ja auch
Result := irgendwas;

// und nicht
if irgendwas then
  Result := True
else
  Result := False;

// oder
Result := False;
if irgendwas then
  Result := True;

// oder eben das genannte
Result := False;
if not irgendwas then
  Exit;
Result := True;
also demnach so
Delphi-Quellcode:
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin
  Result := not KandidatIstLeer(KandidatenIndex)
    and KandidatIstNumerisch(KandidatenIndex)
    and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#15

AW: for-Schleife -Abbruch

  Alt 16. Nov 2011, 07:43
himitsu, ein Widerspruch ist das ja nicht, nur Geschmackssache.

Egal wie: Eine Entscheidungsfunktion hat den großen Vorteil, das sie direkt lesbar, einfach wartbar und noch einfacher erweiterbar ist, und darum geht es doch in erster Linie bei der Programmierung.

Die Entscheidung findet an einer zentralen (EINE), benannten (KOMMENTIERTE) und ausgelagerten (FUNKTION) Stelle statt.

Die Bedingungen sind untereinander von der Aussage her äquivalent, denn sie benennen immer genau eine Bedingung, weshalb die Operation illegal ist.

Solange Du deine Entscheidungsfunktion auslagerst, und ordentlich refaktorisierst, kannst Du das natürlich auch mit einer AND/OR-Verknüpfung machen. Einen fundamentalen Unterschied sehe ich hier aber nicht.
Für mich ist meine Version meistens leichter zu lesen, das kann aber auch am Alter liegen.

Übrigens: Um A AND B so kompilieren zu lassen, das B nur dann evaluiert wird, wenn A TRUE ergibt, geht man in die Kompileroptionen und sucht nach etwas wie "komplette bool'sche Ausdrücke' oder ähnlich. Bei mir war das in den Optionen unten links, aber ich habe gerade kein Delphi.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.503 Beiträge
 
Delphi 10.4 Sydney
 
#16

AW: for-Schleife -Abbruch

  Alt 16. Nov 2011, 08:52
Das dort umzuschalten ist aber keine so gute Idee. Besser ist es das an der Stelle zu schreiben, die eine bestimmte Einstellung voraussetzt.
Sprich:
Delphi-Quellcode:
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin
  {$BOOLEVAL OFF}
  Result := not KandidatIstLeer(KandidatenIndex)
    and KandidatIstNumerisch(KandidatenIndex)
    and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag);
end;
Denn wenn man das in den Projektoptionen einstellt (wobei das aus Optimierungsgründen auch die Voreinstellung ist), verlässt man sich darauf, dass es dort korrekt eingestellt ist. Wenn aber jemand anderes das dort umstellt, kann er sich über die Folgen nicht bewusst sein, da dort ja keinerlei Bezug zu dem Quelltext besteht, wo die Einstellung ggf. anders benötigt wird.

Einen fundamentalen Unterschied sehe ich hier aber nicht.
Für mich ist meine Version meistens leichter zu lesen, das kann aber auch am Alter liegen.
Fundamental ist der Unterschied auch nicht, aber es ist deutlich schneller zu sehen, wenn man als Unbeteiligter auf den Code schaut, wie das Result zugewiesen wird, wenn man nicht erst jede Zeile auf ein Exit durchschauen muss.
In diesem Fall ist das noch akzeptabel, aber ich habe schon Quelltexte gesehen wo ich große Mühe hatte den Quelltext genau nachzuvollziehen warum wo rausgesprungen wird und warum wo der Rückgabewert vorher gesetzt wurde...

Nebenbei gilt für mich der Grundsatz: Ein Befehl pro Zeile. Das Exit irgendwo hinten in der Zeile zu verstecken (statt es in eine neue Zeile zu schreiben) ist zusätzlich... suboptimal.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!

Geändert von jaenicke (16. Nov 2011 um 08:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
603 Beiträge
 
FreePascal / Lazarus
 
#17

AW: for-Schleife -Abbruch

  Alt 16. Nov 2011, 10:43
Am Beispiel habe ich ausprobiert, dass "A AND B" einen Fehler ergibt.

Weiß vielleicht jemand, wo ich das umstellen kann ?
Müsste ja irgendwo in "Compilereinstellungen" sein...
(In meiner Signatur steht, was ich benutze.)
Die Standardeinstellung von Free Pascal ist es boolsche Ausdrücke abzukürzen, wenn möglich. Da er keine Kommandozeilenoption hierfür kennt, bietet Lazarus auch keine Option dafür an. Die einzige Möglichkeit dies zu beeinflussen ist innerhalb des Quellcodes:

Delphi-Quellcode:
// Shortcuts einschalten
{$B-}
// oder
{$BOOLEVAL OFF}

// Shortcuts ausschalten
{$B+}
// oder
{$BOOLEVAL ON}
Siehe auch hier.

Ich glaube auch, dass es eine lokale Einstellung ist, das heißt, dass du dies für einzelne Bedingungen ändern kannst (müsste das jedoch nachprüfen).

Zur Semantik (vielleicht hattest du ja was vertauscht):

Bei einem AND wird abgebrochen, wenn die erste Bedingung FALSE ergibt (die gesamte Bedingung kann eh nicht mehr TRUE ergeben).
Bei einem OR wird abgebrochen, wenn die erste Bedingung TRUE ergibt (die gesamte Bedingung kann eh nicht mehr FALSE ergeben).

Gruß,
Sven

PS: Die aktuelle Version von Lazarus ist mittlerweile 0.9.30 mit Free Pascal 2.4.2. Wenn du noch etwas wartest sollte auch bald 0.9.30.2 (mit Free Pascal 2.4.4) veröffentlicht werden.
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
thomasschaf
(Gast)

n/a Beiträge
 
#18

AW: for-Schleife -Abbruch

  Alt 18. Nov 2011, 20:04
Danke, für die Antworten.
Jetzt ist es mir sehr klar geworden.

Die neue Version habe ich vor kurzem schon bereits probiert zu installieren, habe es nach einiger Zeit wegen zu vielen mir unbekannten Fehlern aufgegeben. Zusätzlich müsste ich die IDE dann noch neu kompilieren, weil ich sehr viel daran geändert habe (Komponenten hinzugefügt).
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf