DOCH!Daraus würde ich ihr aber auch keinen Vorwurf konstruieren wollen.
Ich kann das immer noch nicht sehen. Die Anweisung ist ein READ, der zwangsläufig nur einen Satz trifft. Genauso wie ich beim READ wissen muss, dass er nur einen Satz trifft, muss ich das bei der neuen Anweisung auch. Das merkt man schon daran, dass der Rückgabewert des Ausdrucks ein Zeilentyp ist und nicht eine Mehrzahl von Zeilentypen.Daniel hat geschrieben:DOCH! Eine Programmiersprache muss aus sich heraus verständlich sein.
Der AKÜFI führt auf Dauer zwangsläufig zu Fehlinterpretationen.
Nein, dafür verliert man den Überblich über die Methoden.ralf.wenzel hat geschrieben:In so kleinen Methoden verliert man den Überblick eher nicht,
Daniel hat geschrieben:DOCH! Eine Programmiersprache muss aus sich heraus verständlich sein.
Der AKÜFI führt auf Dauer zwangsläufig zu Fehlinterpretationen.
Wenn da READ steht ist klar daß es um eine Zeile geht.ralf.wenzel hat geschrieben:Ich kann das immer noch nicht sehen. Die Anweisung ist ein READ, der zwangsläufig nur einen Satz trifft. Genauso wie ich beim READ wissen muss, dass er nur einen Satz trifft, muss ich das bei der neuen Anweisung auch. Das merkt man schon daran, dass der Rückgabewert des Ausdrucks ein Zeilentyp ist und nicht eine Mehrzahl von Zeilentypen.
Dann ist Dein Problem aber nicht der CHECK, sondern der Monolith. Wer einen LOOP über 3000 Zeilen programmiert, ohne Blöcke innerhalb des LOOPs in Subroutinen zu gliedern, der kann nicht programmieren. Sowas ist selbst bei ältestem prozeduralen Programmierstil eine Katastrophe. Den CHECK zu vermeiden wird das auch nicht wieder rausreißen.ralf.wenzel hat geschrieben:Es gibt durchaus Monolithen, wo man dreimal überlegen muss "ist der IF von eben schon beendet?" oder "bin ich noch im DO oder bin ich da schon draußen?". Nicht umsonst wird unten im Editor angezeigt, wie "tief" ich im Coding bin. Zudem ist es nicht immer trivial, herauszufinden, wo denn der CHECK hinspringt, weil es keine schließende Anweisung gibt (ENDCHECK). Und sowas tritt sehr gern bei 3.000-Zeilen-Monolithen raus, die ich dann warten darf.
Code: Alles auswählen.
Man sollte Fehlerquellen minimieren - ausschließen kann man sie nicht.
Bei zu starker Fragmentierung würde ich da mitgehen, ansonsten finde ich eine Gliederung in Subroutinen (als Oberbegriff für Forms und Methoden) aber durchaus gut. Ich bemühe mich immer, mein Hauptprogramm so zu schreiben, dass es nur 10 Zeilen oder so lang ist, und die bestehen dann aus Subroutinen, die die wesentlichen Programmschritte ausführen (und je nach Größe selbst wieder modularisiert sind). Dann brauche ich mich z.B. nicht durch die ganze Datenbeschaffung zu kämpfen, wenn ich einen Bug im Bereich der Ausgabe ins ALV suche.Daniel hat geschrieben:Nein, dafür verliert man den Überblich über die Methoden.
Für eine neue Modularisierungseinheit muss es schon einen
vernünftigen Grund geben - sonst ist das Quatsch.
Ich sehe da in erster Linie die mehrfache Verwendung.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel
Das hängt vom INCLUDE ab. Den BDCRECX1 nicht wiederverwenden zu wollen wäre ziemlich unsinnig.Ralf hat geschrieben:INCLUDES z. B. *soll* man gar nicht mehrfach verwenden
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel
Natürlich ist eine vernünftige Gliederung unverzichtbar.DeathAndPain hat geschrieben:Bei zu starker Fragmentierung würde ich da mitgehen, ansonsten finde ich eine Gliederung in Subroutinen (als Oberbegriff für Forms und Methoden) aber durchaus gut.Daniel hat geschrieben:Nein, dafür verliert man den Überblich über die Methoden.
Für eine neue Modularisierungseinheit muss es schon einen
vernünftigen Grund geben - sonst ist das Quatsch.
Ich sehe da in erster Linie die mehrfache Verwendung.
Sehe ich genauso. Dann werden die Daten noch durch mindestens 25 verschiedeneDeathAndPain hat geschrieben: Wovor ich aber einen Horror habe, und das ist leider bei OO der große Hype, ist die tiefe Schachtelung funktionaler Methoden. Das finde ich ganz miserabel lesbar, obwohl - um nicht zu sagen weil - man damit ganz viel Funktionalität in eine einzige Programmzeile bekommt.
Der Zweck ist sicher ein anderer, aber das geht damit ganz hervorragend,DeathAndPain hat geschrieben: Leider habe ich das Gefühl, dass die neuen Befehle SWITCH und COND den Zweck verfolgen, dieses Problem noch zu verschärfen.
Ich bin ja schon glücklich, wenn es nur Tabellen sind. Der Horror sind tief strukturierte Container (selbstredend undokumentiert, oder die Doku liegt in einer Schublade bei der SAP oder auf der anderen Seite des Erdballs), in denen sich dann Referenzen auf unbenamt im Speicher liegende Datenobjekte (REF TO DATA) befinden, welche wieder auf andere Container verweisen usw. Am Ende tauchen die eigentlich gewünschten Daten dann aus den Tiefen des Nirwana auf, und man blickt gar nicht mehr durch, wo sie eigentlich herkommen - oder im Fehlerfall warum sie nicht gefunden werden und wo und wie sie zu erreichen sind. Vielleicht liegen sie ja auch nur versteckt in einem privaten Attribut ganz am Ende der Schachtelungskette. Tja, hätte man gewusst, dass es dafür eine GET-Methode gibt und in welcher Klasse sie sich befindet...Sehe ich genauso. Dann werden die Daten noch durch mindestens 25 verschiedene
Tabellen geschaukelt und am Ende weis niemand mehr genau wo gerade welcher
Wert aktuell ist.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel
Gebe ich Dir recht, aber das kriegt man in aller Regel noch raus. Notfalls setzt man sich da einen Breakpoint hin, dann hat man den FB-Namen, oder man verfolgt zurück, wo der Variablenname herkommt. Das ist mit Debuggermitteln in aller Regel noch beherrschbar (jedenfalls wenn der Name nicht per IMPORT FROM MEMORY vom Himmel fällt, weil man nicht weiß, wann und von wem er ins Memory geschoben worden ist).Das hat mich schon vor etlichen Jahren geärgert ("rufe einen Funktionsbaustein, dessen Namen in einer Variable steht" - und der irgendwo im Customizing gepflegt ist, und man darf sich dann auf die Suche begeben).