Leider nein, denn:ralf.wenzel hat geschrieben:Können wir jetzt wieder über das Thema diskutieren?
zzcpak hat geschrieben:Thread versaut
Code: Alles auswählen.
DATA o_classification_object TYPE REF TO ZCL_ABC_CLASS_DEF_ATTR_XY.
CREATE OBJECT o_classification_object
EXPORTING
param_a = 'eins'.
Code: Alles auswählen.
DATA(o_classification_object) = NEW ZCL_ABC_CLASS_DEF_ATTR_XY( param_a = 'eins'. ).
Ich muss gestehen, dass ich beide Punkte von Dir sehr überzeugend finde (wobei Du bei CONV bei mir offene Türen einrennst. Den Befehl finde ich klasse und schon lange überfällig. Was hab ich mich geärgert, wenn ich vor Aufruf eines Funktionsbausteins eine Hilfsvariable definieren musste, um damit den Typ PERSNO in den Typ PERNR_D zu wandeln, obgleich beide als N(8) definiert sind. Solche Faxen gehören jetzt elegant der Vergangenheit an).ralf.wenzel hat geschrieben:Ich sehe beides anders und ich kann dir auch sagen, warum:
Was du mit CREATE OBJECT machst, ist eine Zuweisung. Du erzeugst eine Instanz, die du in der Variable o_.... speicherst. Das wird durch die neue Schreibweise sofort klar. Es ist quasi eine Vereinheitlichung, ich hab mich früher schon gefragt, warum es nicht heißt o_.... = OBJECT( zcl_....) und genau DAS macht die neue Schreibweise ja (es heißt halt NEW und nicht OBJECT). Zudem unterscheidet sich die Schreibweise von CREATE OBJECT von allem anderen (ich kann EXPORTING nicht weglassen, etc.).
Und ich finde es deutlich lesbarer, eine Variable in einem anderen Typ zu übergeben (eben mit CONV) als wenn ich es erst durch eine Hilfsvariable schicke, um es zu konvertieren. Weil es in meinen Augen auch dem Sprachgebrauch ähnelt: "Übergib die MATNR als NUMC" statt "speichere die MATNR als NUMC" und "übergib das NUMC-Feld". Ohne Kommentar überleg ich jedesmal erst "warum schreibt der die MATNR nu in eine andere Variable? Ach, die ist NUMC, das ist nur zum Konvertieren". Denn Kommentare stehen ja meist nicht dabei.
Richtig und das aus gutem Grundblack_adept hat geschrieben:Bis auf die erste Antwort in diesem Thread von lausek hört es sich so an, als ob die Meisten, die die neuen Möglichkeiten verwenden, sich auf die einfacheren/kürzeren Neuerungen beschränken. Aber wie sieht das denn mit den etwas komplexeren Neuerungen aus wie z.B. FOR, REDUCE, FILTER, MESH?
Vielleicht eine Mischform, die dann auch nicht mehr die große Zeilenlänge hat und schön Datendefinition und Verwendung trennt:ewx hat geschrieben:vs.Code: Alles auswählen.
DATA o_classification_object TYPE REF TO ZCL_ABC_CLASS_DEF_ATTR_XY. CREATE OBJECT o_classification_object EXPORTING param_a = 'eins'.
Code: Alles auswählen.
DATA(o_classification_object) = NEW ZCL_ABC_CLASS_DEF_ATTR_XY( param_a = 'eins' ).
Code: Alles auswählen.
DATA o_classification_object TYPE REF TO ZCL_ABC_CLASS_DEF_ATTR_XY.
o_classification_object = NEW #( param_a = 'eins'. ).
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ralf.wenzel
Was gewinnt man dadurch? Dann ist für mich die einzeilige Variante doch ansprechender. Natürlich wird dadurch erst mal ein wenig Information verschluckt, aber es erscheint mir nachvollziehbar, welchen Datentyp "o_classification_object" hier haben muss, ohne dass man es noch einmal explizit in einer DATA Anweisung mitteilen muss.black_adept hat geschrieben: Vielleicht eine Mischform, die dann auch nicht mehr die große Zeilenlänge hat und schön Datendefinition und Verwendung trennt:Code: Alles auswählen.
DATA o_classification_object TYPE REF TO ZCL_ABC_CLASS_DEF_ATTR_XY. o_classification_object = NEW #( param_a = 'eins'. ).
Enno mag keine Inline-Deklarationen und langen Zeilen und DeathAndPain mag Deklarationen am Anfang.zzcpak hat geschrieben:Was gewinnt man dadurch?
Ich dachte immer das sei nur deine eigene Methodik, wann/wie du Inline-Deklarationen verwendest. Aber wenn das offiziell ist, magst du mal einen Link posten, wo H. Keller das genau schreibt? Denn ich habe das so nicht in der Doku gefunden.ralf.wenzel hat geschrieben:Ich zum Beispiel verstehe eines nicht: Warum muss ich eine Variable, die ich nur sehr begrenzt verwende, oben im Coding deklarieren? Nehmen wir einen LOOP AT mara ASSIGNING <mara>. Dann muss ich <mara> oben deklarieren und wenn ich den LOOP nicht in eine eigene Methode schreibe, ist gar nicht klar, dass das nur sehr begrenzt verwendet wird. Ein LOOP AT mara ASSIGNING FIELD-SYMBOL(<mara>) zeigt mir: Ah, <mara> wird nur in diesem LOOP verwendet. Und wenn man sich die Hinweise zum Befehl ansieht, sieht man, dass Horst sehr deutlich schreibt, dass die impliziten Deklarationen genau dafür gedacht sind und nicht inflationär verwendet werden sollen.
Kann ich nachvollziehen, doch die programmiersprachenseitige Umsetzung gefällt mir trotzdem nicht. Da, wo ich Inline-Deklarationen bisher angewandt gesehen habe, war es einfach dort, wo die Variable zum ersten Mal verwendet wurde. Die Beschränkung auf den Codeblock wird technisch nicht durchgesetzt, wie das etwa bei lokalen Variablen in FORMs und Methoden der Fall ist, und was passiert, wenn man hofft, dass Programmierer von sich aus ordentlich arbeiten, wissen wir alle.ralf hat geschrieben:Ich zum Beispiel verstehe eines nicht: Warum muss ich eine Variable, die ich nur sehr begrenzt verwende, oben im Coding deklarieren? Nehmen wir einen LOOP AT mara ASSIGNING <mara>. Dann muss ich <mara> oben deklarieren und wenn ich den LOOP nicht in eine eigene Methode schreibe, ist gar nicht klar, dass das nur sehr begrenzt verwendet wird. Ein LOOP AT mara ASSIGNING FIELD-SYMBOL(<mara>) zeigt mir: Ah, <mara> wird nur in diesem LOOP verwendet. Und wenn man sich die Hinweise zum Befehl ansieht, sieht man, dass Horst sehr deutlich schreibt, dass die impliziten Deklarationen genau dafür gedacht sind und nicht inflationär verwendet werden sollen.
Code: Alles auswählen.
DATA(itab) = VALUE t_itab( ( 1 ) ( 2 ) ( 3 ) ). " nix gegen das VALUE, das finde ich super; mir geht es nur um das DATA( )
Tatsächlich habe ich bis heute keine vernünftige Doku dazu gefunden, wie man REGEX für den Hausgebrauch und insbesondere in ABAP anwendet. Anscheinend gibt es ja unterschiedliche Umfänge, in denen reguläre Ausdrücke je nach Programmiersprache unterstützt sein können. Die Doku, was in ABAP geht, finde ich aber mehr als dürftig. Mir fehlt auch eine Beschreibung, die mit aussagekräftigen, nicht zu komplexen Beispielen hinterlegt wäre, sowie ein Kompendium, was alles möglich ist (ich denke da an etwas im Stil von SelfHTML). Im Prinzip sagt ABAP nur, ja, reguläre Ausdrücke unterstützen wir in Grenzen auch, und zwar dort und dort, und wie man das dann macht, soll man bei Wikipedia oder in irgendwelchen dicken Büchern nachlesen, die bei der Wissenschaft regulärer Ausdrücke aus dem Vollen schöpfen. IMHO nicht praktikabel. So dringend habe ich reguläre Ausdrücke in meiner ganzen Karriere noch nie gebraucht, dass solch Einarbeitungsaufwand auf der Basis mieser oder viel zu umfangreicher Dokumentation gerechtfertigt gewesen wäre.zzcpak hat geschrieben:Das ist ähnlich wie bei REGEX. Ein mächtiges Werkzeug, dass ich hie und da für einfache Fälle auch schon mal angewendet habe, um z.B. bestimmte Sachen aus Log-Dateien rauszufiltern. Allerdings sind diese Sachen alles andere als selbsterklärend.
Genau so sehe ich das auch. In Gedanken ist man bei dem, was man machen möchte (bzw. versucht bei fremdem Code nachzuvollziehen, was dessen Autor da tun möchte). Wenn man dann verwirrende Syntaxen nachvollziehen muss - auch wenn man das kann - dann ist das wie ein 3D-Film, bei dem mit 3D-Effekten herumgespielt wird und der Zuschauer dadurch aus dem Geschehen gerissen wird, statt sie unauffällig und stimmig einzubetten. Das war ja ein verbreiteter Fehler in der Frühphase des 3D-Kinos.zzcpak hat geschrieben:Mag sein, dass es einfacher wird, wenn man komplexere Befehle häufig anwendet. Aber trotzdem müsste man bei jeder Betrachtung solch eines Codings wohl erst mal intensiv nachdenken oder nachlesen, was dort eigentlich passiert. Das halte ich nicht für zielführend.
Auch hier bin ich komplett Deiner Meinung. Tatsächlich machen es aber die wenigsten. Ich glaube, das liegt nicht nur an Faulheit, sondern auch daran, dass viele nicht in der Lage sind, ihre Gedanken schlüssig in Worte zu fassen und damit dann auch noch vollständige, korrekte deutsche Sätze zu bilden. Ich kenne Programmierer, die echt pfiffig und definitiv nicht faul sind, aber die - durchaus vorhandenen - Kommentare in ihrem Code lesen sich zum Teil echt legasthenisch. Gut Text schreiben ist eine Fähigkeit für sich, die man hat oder auch nicht (obwohl man sie in gewissem Rahmen sicherlich auch trainieren kann). Und da darf unsereins halt nicht arrogant sein und ein textuelles Niveau fordern, zum dem nicht jeder in der Lage ist.ralf.wenzel hat geschrieben:Ich sage immer wieder Neu-Entwicklern: "Kommentieren, kommentieren, kommentieren. Und wenn du in einem Fremdprogramm etwas findest, was du nicht verstehst und du hast das irgendwann rausgefunden: KOMMENTAR REIN! - sonst stehst du in sechs Wochen wieder davor und suchst nach demselben Kram". Weil man sich das eben nicht merkt, was man vor 6 Wochen mal rausgefunden hat.
Ich halte diesen Ansatz für einen Denkfehler. Klar sollte man nach Möglichkeit nachvollziehbar coden und dafür auch gut modularisieren (egal ob mit oder ohne OO). Aber ich halte es für sehr günstig, wenn schon am Anfang einer Modularisierungseinheit (egal ob FORM, Methode oder einer Schleife) in klaren Worten steht, wozu das folgende Konstrukt da ist. Zum einen kann man daraus schnell das Sollverhalten des Programms erkennen, ohne den Codeblock erst lesen und sich die dahinterstehende Absicht gewissermaßen reverse engineeren zu müssen (auch wenn das bei gutem Code nicht allzu schwer möglich sein mag). Zum anderen sieht man auch sofort, ob das überhaupt der Block ist, den man im Rahmen seiner aktuellen Fragestellung (etwa auf der Suche nach einem Bug) überhaupt sucht oder ob es in dem Block um etwas geht, was für das, was man gerade machen möchte, irrelevant ist.zzcpak hat geschrieben:Ich versuche allerdings immer, mit möglichst wenig Kommentaren auszukommen. Vielmehr soll das Coding so strukturiert sein, dass sich schon aus den Methodennamen (auch Namen für Parameter, Variablen) der Sinn erschließt. Also kleine Klassen mit genau umrissenem Aufgabengebiet, kleine Methoden mit einer genauen Aufgabe. Führt auch schon mal dazu, dass meine Methodennamen zu lang werden
Sehe ich mich genötigt, eine Coding-Passage zu kommentieren, versuche ich daher zunächst, diese einfacher zu gestalten, um Kommentare zu vermeiden.
Ja, da gebe ich dir Recht. Wenn man es _mal_ benutzt. Gerade in verketteten Aufrufen verkomplizieren die CONV-Konstrukte, da es nicht nur der Befehl CONV ist, sondern noch mindestens ein # plus Klammern.ralf.wenzel hat geschrieben: Und ich finde es deutlich lesbarer, eine Variable in einem anderen Typ zu übergeben (eben mit CONV) als wenn ich es erst durch eine Hilfsvariable schicke, um es zu konvertieren.