Leider. Ursache ist nach meiner Überzeugung nur das krampfhafte Bemühen der SAP, die Verwendung von Tabellenkopfzeilen zu eliminieren. Ich weiß, man kann auch damit argumentieren, dass man halt richtige Tabellentypen verwenden kann und soll, so dass ein separater Parameterblock für Tabellenparameter sich erübrigt hat, aber abgesehen davon, dass es der Übersichtlichkeit dient, übergebene Tabellen mit einem separaten Parameterblock zu kennzeichnen, kaufe ich der SAP diese Begründung nicht ab.TABLES an der Stelle ist aber obsolet
Sehe ich genauso. Kann aber auch eine Performancefalle sein und zwar dann, wenn der Resourcenverbrauch eines Befehls dem Entwickler nicht bewusst ist. Beispiele sind u.a. SORT, FIND, maskierte Vergleiche (CP), suchen mit Bezug auf Range-Tabellen. So ein SORT ist easy und lässt sich schnell schreiben; sogar in einem Loop - sicher ist sicher und manche Entwickler haben ein großes Sicherheitsbedürfnis.Und was das "ganz fauler Programmierer" angeht, so bin ich für alles, was Programmierern das Leben erleichtert, ohne den Code schlechter lesbar zu machen.
Das sehe ich ganz anders bzw. es kommt darauf an, wie der Entwickler sein Coding strukturiert. Man kann mittlerweile ziemlich viel in einer Zeile ABAP-Coding unterbringen. Da sind mir ein paar mehr (kommentierte) Zeilen meistens lieber, weil man dann beser nachvollziehen kann, was da gemacht wird.In den allermeisten Fällen ist kürzerer Code auch besser lesbar.
Also ich finde nicht, dass es mit Workareas unleserlicher wird. Außerdem gibt es durchaus einen vernünftigen Grund Tabellenkörper und Kopfzeile zu trennen. Denn bei Tabellen mit Kopfzeilen hat der Name der Tabelle zwei Bedeutungen, nämlich Kopfzeile oder Tabellenkörper und es hängt vom Befehl ab, was genau angesprochen wird. Bei CLEAR, FREE wird die Kopfzeile angesprochen. Bei LOOP, REFRESH wird der Tabellenkörper angesprochen. Aber in ABAP wird es aus Gründen der Abwärtskompatibilität wohl für immer Tabellen mit Kopfzeilen geben.Deswegen rege ich mich auch darüber auf, dass Kopfzeilen deprecated sind. Ich finde Code, der mit Kopfzeilen arbeitet, wunderbar lesbar und verständlich. Arbeitet man mit separaten "Arbeitszeilen", dann wird der Code wesentlich länger und damit unübersichtlicher, ohne tatsächlich Mehrwert an Information zu bieten (z.B. LOOP AT mytable INTO ls_mytable statt einfach LOOP AT mytable).
Check in LOOP wird wahrscheinlich nie "verboten" werden. Zu check in "Processing Blocks" stimme ich a-dead-trousers zu.Genauso bin ich auch ein Fan des CHECK-Befehls, der leider auch weitgehend deprecated ist, wenngleich die SAP ihn bislang meines Wissens noch nirgends verboten hat,
Ich finde die meisten neuen Funktionen und Expressions auch sehr gut. Insbesondere wenn man dabei die Deklaration von Hilfsvariablen sparen kann (siehe CONV). Doch CONCATENATE ist für mich auch OK; einfach deshalb, weil ich es mag, wenn der Name eines Befehls schon aussagt, was er tut.und ich mag auch die neuen Konstrukte NMIN( ) und LINES( ) sowie den gleichfalls relativ neuen &&-Operator (Das umständliche CONCATENATE war mir schon immer ein Dorn im Auge).
Dem kann ich bezüglich Lesbarkeit durchaus zustimmen. Doch es kommt auch darauf an, wie man es einsetzt. Und es ist wahrscheinlich auch eine Frage der Gewöhnung. Ich bevorzuge die Datendeklaration am Anfang einer Verarbeitungseinheit. Doch ich muss zugeben, dass es auch manchmal sehr mühsam ist, wenn man erst mal durch mehrere Seiten Datendeklaration scrollen muss, bis man das Coding findet.Andererseits verstehe ich nicht, wie man sich über Sachen wie die Inline-Deklaration von Variablen freuen kann, denn die macht den Code wirklich schlechter verständlich, und viel gewinnen tut man damit ja auch nicht
Unter dem Aspekt globale Datendeklaration so weit als möglich zu vermeiden, passt die Anmerkung glaube ich nicht ganz. Es sei denn du meinst mit Hauptcode Modules oder Report-Events. Das ist übrigens etwas, was mich schon lange stört; nämlich, dass Datendeklarationen in Modules und Report-Events immer global sind.(da kann man sich auch die Gliederung mit TOP-Include sparen, wenn man die Hälfte der Variablen am Ende doch im Hauptcode per Inline-Deklaration definiert).
Das ist meiner Meinung nach eindeutig eine Frage der Gewöhnung. Und der Performancegewinn ist, gerade bei Änderungen von Tabellen mit vielen Einträgen und mit "breiten" Tabellenzeilen, durchaus beachtlich.Auch LOOP in ein Feldsymbol mit nachfolgendem Tabellenändern ohne MODIFY mag zwar ein bisschen Performance bringen, macht den Code aber ganz sicher nicht verständlicher.
DeathAndPain hat geschrieben:In den allermeisten Fällen ist kürzerer Code auch besser lesbar.
Auf Performance-Auswirkungen nicht zu achten ist für mich eine Form von Dilettantismus. Gerade wenn es um Befehle wie SORT geht, bei dem jeder Programmierer aus seiner (wie auch immer gearteten) Grundausbildung wissen sollte, dass das ein Klassiker für Performancethemen ist.Kann aber auch eine Performancefalle sein und zwar dann, wenn der Resourcenverbrauch eines Befehls dem Entwickler nicht bewusst ist. Beispiele sind u.a. SORT, FIND, maskierte Vergleiche (CP), suchen mit Bezug auf Range-Tabellen. So ein SORT ist easy und lässt sich schnell schreiben; sogar in einem Loop - sicher ist sicher und manche Entwickler haben ein großes Sicherheitsbedürfnis.
Das sind zwei verschiedene Paar Schuhe. Ich bin ein ganz großer Fan von Codekommentaren, und wenn alle so viel Kommentare in ihren Code schreiben würden wie ich, dann wäre die Welt ein besserer Ort.Das sehe ich ganz anders bzw. es kommt darauf an, wie der Entwickler sein Coding strukturiert. Man kann mittlerweile ziemlich viel in einer Zeile ABAP-Coding unterbringen. Da sind mir ein paar mehr (kommentierte) Zeilen meistens lieber, weil man dann beser nachvollziehen kann, was da gemacht wird.
Das stimmt, aber wenn man ein bisschen Übung hat, dann sieht man auf einen Blick, welche Bedeutung an einer bestimmten Stelle die richtige ist. Wenn ich mir überlege, was im OO-Kontext von Programmierern für abstraktes Denken gefordert wird, wenn mit irgendwelchen Variablen hantiert wird, die überhaupt keinen Namen mehr haben, sondern im luftleeren Raum hängen und nur über Referenzzeiger angesprochen werden können (wobei jene Referenzzeiger jederzeit woandershin umgebogen werden können und dann plötzlich für eine ganz andere Variable stehen), dann finde ich es relativ trivial, sich zu merken, dass diese drei Befehle sich auf die Kopfzeile und jene drei sich auf den Rumpf beziehen.Außerdem gibt es durchaus einen vernünftigen Grund Tabellenkörper und Kopfzeile zu trennen. Denn bei Tabellen mit Kopfzeilen hat der Name der Tabelle zwei Bedeutungen, nämlich Kopfzeile oder Tabellenkörper und es hängt vom Befehl ab, was genau angesprochen wird.
Da bin ich auch nicht begeistert von, aber dahinter steht die Idee, den Befehl REFRESH zu deprecaten und komplett durch CLEAR zu ersetzen, ein Ziel, dass mit Blick auf die Abwärtskompatibilität halt nur zur Hälfte umgesetzt werden konnte. Aus meiner Sicht wäre in China kein OO-Sack umgefallen, wenn sie zum Löschen von internen Tabellen auch im OO-Kontext einfach REFRESH beibehalten hätten (was meines Wissens ja auch funktioniert).Was mich ein bisschen stört, ist, dass bei Tabellen ohne Kopfzeile der Befehl CLEAR die gleiche Wirkung hat wie REFRESH. Man kann dann nicht gleich erkennen, ob es eine interne Tabelle ist.
Ich schreibe oft Formroutinen, die irgendeinen Wert ermitteln sollen. Nehmen wir beispielsweise an, ich brauche zu der Personalnummer PERNR den Text des Personalbereichs und will eine FormroutineCheck in LOOP wird wahrscheinlich nie "verboten" werden. Zu check in "Processing Blocks" stimme ich a-dead-trousers zu.
Code: Alles auswählen.
FORM GET_PERBR_TEXT USING PERNR LIKE PA0001-PERNR
CHANGING PTEXT LIKE T500P-NAME1.
DATA WERKS LIKE PA0001-WERKS.
CLEAR PTEXT.
SELECT SINGLE WERKS INTO WERKS FROM PA0001
WHERE PERNR = PERNR
AND SUBTY = SPACE
AND OBJPS = SPACE
AND SPRPS = SPACE
AND ENDDA >= SY-DATUM
AND BEGDA <= SY-DATUM.
CHECK SY-SUBRC = 0.
SELECT SINGLE NAME1 INTO PTEXT FROM T500P
WHERE PERSA = WERKS.
ENDFORM.Der Name des Befehls ist nett (auch wenn er recht lang ist), aber seine Nutzung - und Lesbarkeit - ist a pain in the ass, insbesondere wenn man viele Elemente aneinanderfügen möchte. Endgültig furchtbar wird CONCATENATE aber, wenn man zwischen manchen dieser Elemente ein Leerzeichen haben möchte und zwischen anderen nicht. Dann muss man womöglich sogar mehrere CONCATENATEs hintereinander schalten, die jeweils einen Teil des Ganzen zusammensetzen (mal mit, mal ohne den elendiglich langen Zusatz SEPARATED BY SPACE). Da finde ich den &&-Operator, kombiniert mit diesem neuen Hochkommatyp (` ` statt ' ') um Größenordnungen kürzer und besser lesbar.Doch CONCATENATE ist für mich auch OK; einfach deshalb, weil ich es mag, wenn der Name eines Befehls schon aussagt, was er tut.
Der Einwand ist berechtigt, aber bei einem Unterprogramm (egal ob Form oder Methode) sollte sich die Zahl benötigter lokaler Variablen ohnehin in Grenzen halten. Andernfalls ist das ein so großes Gebilde, dass möglicherweise sogar dafür ein eigenes Variablen-Include gerechtfertigt ist.Unter dem Aspekt globale Datendeklaration so weit als möglich zu vermeiden, passt die Anmerkung glaube ich nicht ganz.(da kann man sich auch die Gliederung mit TOP-Include sparen, wenn man die Hälfte der Variablen am Ende doch im Hauptcode per Inline-Deklaration definiert).
Sowas ist doch ein Krampf! Und ganz ehrlich: den Vorteil sehe ich nicht. Dabei kann ich mich erinnern, wie in gewissen SAP-Foren gerade dieses Feature als große neue Errungenschaft gefeiert worden ist.Was mich ganz allgemein bei Inline-Deklarationen ein wenig stört, ist dass man sie beim zweiten mal - sagen wir mal - nicht mehr verwenden kann. Gerade beim LOOP oder READ TABLE mit assigning field-symbol(<l_wa>). In einer Verarbeitungseinheit geht es beim ersten mal mit assigning field-symbol(<l_wa>), und beim zweiten mal darf man dann nur noch assigning <l_wa> schreiben. Wenn man dann einzelne Blöcke verschiebt, kommt es zu einem Syntaxfehler.