Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Bright4.5
Code: Alles auswählen.
DATA: gd_top_of_page TYPE abap_bool.
Code: Alles auswählen.
IF gd_top_of_page EQ abap_true.
RETURN.
ENDIF.
Code: Alles auswählen.
gd_top_of_page = abap_true.
Oder kürzer:a-dead-trousers hat geschrieben:Am Beginn deiner Form-Routine:Code: Alles auswählen.
IF gd_top_of_page EQ abap_true. RETURN. ENDIF.
Code: Alles auswählen.
CHECK gd_top_of_page EQ abap_false.
Code: Alles auswählen.
IF gd_top_of_page NE abap_true.
* Hier die Verarbeitung machen die nur einmal ausgeführt werden soll.
gd_top_of_page = abap_true.
ENDIF.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel
Code: Alles auswählen.
EXIT. " LOOP
Viele Zeilen zu haben ist erst mal kein Drama, solange sich die Programmierer an die klassischen Grundsätze strukturierter Programmierung gehalten haben. Die besagen, dass man eben keinen schlauchförmigen Spaghetticode schreiben soll, sondern seinen Quellcode möglichst fein in aussagekräftig benamte Unterprogramme gliedern soll. Wenn die einzelne Formroutine eine klar definierte Schnittstelle, optimalerweise sogar noch eine kurze Funktionsbeschreibung im Kopfkommentar hat (ich weiß, das machen die wenigsten) und ihre Länge nicht aus dem Ruder läuft, dann mag der Gesamtcode gerne 30.000 Zeilen haben. Den kann man dann vielleicht auf ein paar Includes aufteilen, damit der Scrollbalken länger und weniger empfindlich wird, aber das Programm bleibt dann gut wartbar. Sind einzelne Formroutinen zu lang, dann ist das ein Zeichen dafür, dass sich ihr Schöpfer vor einer Untergliederung in Teil-Unterprogramme gedrückt hat, die dann angezeigt gewesen wäre.Wir haben *einige* uralte, rießige (+10.000 Zeilen) Programme im Einsatz
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
ewx • black_adept
Ich geb die Schuld ja nicht dem CHECK an sich, sondern dem Programmierparadigma (Spaghetticode) das dieser Befehl (und auch andere wie EXIT und RETURN) begünstigt.DeathAndPain hat geschrieben:Die Schuld für Schlamperei in diesen Bereichen dem CHECK-Befehl zuzuschieben finde ich aber in höchstem Maße unfair.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel
Und den Fall haben wir doch hier. Wenn der erste Befehl der Form (oder Methode) ein CHECK ist, dann ist es doch einerlei, wieviel Code dahinter noch kommt; dann ist das auf jeden Fall völlig problemlos verständlich, was da passiert.Wie du richtig sagst, gibt es durchaus Anwendungsbeispiele in denen der Befehl sogar Sinn macht. Zum Beispiel in LOOPs wo man nach der ersten Fundstelle nicht mehr weiterzusuchen braucht oder eben in kleinen(!) Methoden bei denen die Weiterverarbeitung bei einem fehlerhaften Parameter nicht mehr sinnvoll ist
Code: Alles auswählen.
LOOP at xyz ASSIGNING FIELD-SYMBOL(<xyz>).
PERFORM form1 USING <xyz>.
CHECK sy-subrc = 0.
PERFORM form2 USING <xyz>.
CHECK <xyz>-whatever > 200.
PERFORM form3 USING <xyz>.
ENDLOOP.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel
Wenn das der einzige Fall ist, dann würde ich gerne mal eine DO-Schleife ohne TIMES-Angabe von Dir sehen. EXIT und RETURN sind da die einzigen Möglichkeiten zu verhindern, dass man in einer Endlosschleife endet. (wenn man mal von radikalen Lösungen wie LEAVE TO SCREEN '0' oder MESSAGE TYPE 'A' absieht) Aber auch bei WHILE verwende ich EXIT gerne mal, wenn ich einen Absprung jenseits der regulären WHILE-Bedingung brauche.Die EXITs verwende ich notgedrungen nur um performant Schleifen zu verlassen, solange es kein READ TABLE mit CP (Contains Pattern) gibt.
Damit löst Du aber nur ein Problem, dass Du beim CHECK gar nicht erst hast. Ein IF-RETURN-ENDIF-Block ist sperrige drei Zeilen lang, die man damit auf eine Zeile verdichten kann. EIn CHECK hat von Hause aus nur eine Zeile, und da steht die volle Information drin, ohne dass man es nötig hätte, der Übersichtlichkeit halber was wegzublenden.Ein Vorteil eines IF-ENDIF gegenüber einem CHECK oder CONTINUE im Sinne der Lesbarkeit ist mit gerade eingefallen. Bei einem Doppelklick im Editor auf das IF lande ich beim ENDIF. Mit ALT+Doppelklick sogar bei eventuell vorhandenen ELSE[IF]s. Und außerdem lassen sich diese Blöcke mit Code-Folding wegblenden.
Das nehme ich anders wahr als Du. Wenn ich in einem LOOP einen Fall feststelle, bei dem ich die aktuelle Tabellenzeile nicht weiter bearbeiten muss, dann finde ich ein CONTINUE für den Leser bedeutend plakativer, als wenn ich den ganzen Rest des LOOPs in einen IF-ENDIF-Block verpacke und der Leser sich erst durch probehalbes Einklappen davon überzeugen muss, dass nach dem IF die Schleife endet und da nichts mehr passiert. Und wenn Du dann noch mehrere davon hast, dann erzeugt jeder davon eine weitere Einrückung, so dass man in der selbst heute noch schmalspurigen SE38 oder gar im Debugger kaum noch was sieht, weil der halbe Code rechts vom sichtbaren Fenster steht. Hohe Einrückungstiefen wirken schon optisch abschreckend auf den Leser, da sie eine hohe Komplexität suggerieren, die in diesem Fall aber gar nicht vorhanden ist. Es gibt nur halt innerhalb der Schleife einige Bedingungen, bei denen für diese Tabellenzeile die Schleife nicht weiter abgearbeitet werden muss.Bei einem CHECK oder CONTINUE muss man da oft mehr Hirnschmalz reinstecken um zu erkennen wie sich dieser Befehl auf den Gesamtlauf auswirkt.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
a-dead-trousers
Könntest du dann bitte auch mal gegen den MODIFY-Befehl wettern und ebenso gegen das "+" und vor allem das "-" oder "=" Zeichen aus dem selben Grund?ralf.wenzel hat geschrieben:Es ist in jedem Falle ganz übel, eine Anweisung zu definieren, die kontextabhängig unterschiedliches Verhalten aufweist.
Jeder hat da wohl so seine eigenen Vorlieben und Vorstellungen. Ich verwende die liebend gerne, weil m.E. die Lesbarkeit stark zunimmt ( so wie ich es zumindest verwende ).a-dead-trousers hat geschrieben:Ich mag die CHECKs und CONTINUEs einfach nicht, weil sie mir schon viel zu oft Hirnkrämpfe verursacht haben.
Warum "notgedrungen"? Ist nicht gerade der Sinn des "EXIT"-Befehls einen Verarbeitungsblock ( Schleife ) zu verlassen? Und wenn du "EXIT" nicht magst - du könntest auch immer einen Try-Catchblock verwenden um durch eine Exception die Schleife zu verlassen.a-dead-trousers hat geschrieben:Die EXITs verwende ich notgedrungen nur um performant Schleifen zu verlassen, solange es kein READ TABLE mit CP (Contains Pattern) gibt.
Spätestens wenn in der Methode geschachtelte Schleifen sind und du in der innersten der Schleifen merkst, dass du gar nicht weitermachen willst/brauchst. Die üblichen Alternativen arbeiten mit Hilfsvariablen, die versuchen die Funktionalität des RETURNs zu erreichen und erschweren die Wart/Lesbarkeit durch die Verwendung kaskadierender EXITs.a-dead-trousers hat geschrieben:Die RETURNs verwende ich nur bei Parameterprüfungen um schnell eine Methode zu verlassen und mir die Einrückungen zu sparen.
Hab ich, oft genug. Wobei MODIFY eine Sonderstellung einnimmt, weil die Anweisung nicht kontextabhängig unterschiedliches Verhalten zeigt. Egal wo die Anweisung steht, sie macht dasselbe.black_adept hat geschrieben:Könntest du dann bitte auch mal gegen den MODIFY-Befehl wettern und ebenso gegen das "+" und vor allem das "-" oder "=" Zeichen aus dem selben Grund?ralf.wenzel hat geschrieben:Es ist in jedem Falle ganz übel, eine Anweisung zu definieren, die kontextabhängig unterschiedliches Verhalten aufweist.
*Nickt* --> aber ich wettere auch nicht so sehr gegen überladene Befehleralf.wenzel hat geschrieben: Wenn ich aber schreibe "Zuweisungen macht man mit =, Vergleiche mit EQ", wie ich das hier schon gemacht habe, bist du der erste, der hinter seinem Stein hervorkriecht und meckert.