![]() |
AW: for-Schleife -Abbruch
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) ! |
AW: for-Schleife -Abbruch
Zitat:
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? |
AW: for-Schleife -Abbruch
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?
|
AW: for-Schleife -Abbruch
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:
also demnach so
// 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;
Delphi-Quellcode:
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin Result := not KandidatIstLeer(KandidatenIndex) and KandidatIstNumerisch(KandidatenIndex) and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag); end; |
AW: for-Schleife -Abbruch
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. |
AW: for-Schleife -Abbruch
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:
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.
function OperationIstLegal(KandidatenIndex: Integer): Boolean;
begin {$BOOLEVAL OFF} Result := not KandidatIstLeer(KandidatenIndex) and KandidatIstNumerisch(KandidatenIndex) and not (KandidatHatRoteHaare(KandidatenIndex) and HeuteIstDienstag); end; Zitat:
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. |
AW: for-Schleife -Abbruch
Zitat:
Delphi-Quellcode:
Siehe auch
// Shortcuts einschalten
{$B-} // oder {$BOOLEVAL OFF} // Shortcuts ausschalten {$B+} // oder {$BOOLEVAL ON} ![]() 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. |
AW: for-Schleife -Abbruch
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). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz