Umherspringende Methoden im quelltextbasierten Class Builder

Getting started ... Alles für einen gelungenen Start.
101 Beiträge • Vorherige Seite 5 von 7 (current) Nächste
101 Beiträge Vorherige Seite 5 von 7 (current) Nächste

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von ralf.wenzel (Top Expert / 3917 / 199 / 280 ) »
tar hat geschrieben:
25.10.2024 10:49
Herr im Himmel - es geht natürlich nur um die Präfixe.
Wenn du von Ungarischer Notation schreibst, gehe ich davon aus, dass du Ungarische Notation meinst. Wenn du irgendwas meinst, was nirgends definiert ist außer in deinem Kopf, solltest du dein Auditorium das wissen lassen, sonst kann dir keiner folgen.

Präfixe sind oft falsch verwendet (ich habe schon oft globale Tabellen gesehen, die lt_.... hießen), sind oft überflüssig (<lfs_....> für lokales Feldsymbol - obwohl globale Feldsymbole ohnehin kritisch sind UND Feldsymbole eine eigene Syntax haben) und eine Eindeutigkeit herzustellen, ist auch nicht einfach, weil einem einfach irgendwann die sprechenden Kürzel ausgehen.

Meistens führt das zu mehr Verwirrungen als man denkt.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von tar (ForumUser / 82 / 20 / 27 ) »
Klar - da muss man drauf achten. Das gilt aber generell.

Ich habe schon FREE <..> gesehen, wo eigentlich UNASSIGN <..> hingehörte und <..> = lt_..[ .. ] wo eigentlich ASSIGN lt_..[ .. ] to <..> hingehörte.

Die Ausführung hat da nur durch Zufall fehlerfrei funktioniert. Sollte man deswegen aber FREE, UNASSIGN usw. nicht mehr nutzen dürfen, weil es mitunter falsch verwendet wird? 🙃

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von ralf.wenzel (Top Expert / 3917 / 199 / 280 ) »
Nein, es gibt einen Haufen Gründe, warum man keine Präfixe verwenden soll. Ein paar hab ich genannt, ich habe einen langen Artikel geschrieben (siehe Signatur) wo noch mehr stehen. Und ich bin da in guter Gesellschaft, wie der Artikel zeigt. Zumal es sich um einen großen Irrtum handelt, wie ich dort auch ausführe.


Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
gtoXX

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von tar (ForumUser / 82 / 20 / 27 ) »
ralf.wenzel hat geschrieben:
25.10.2024 10:45
Du hast die Ungarische Notation nicht verstanden. Die besagt, dass der Name den Typ des Objektes widerspiegelt. Der Zeilentyp von LT_EKKO ist EKKO, weshalb sie LT_EKKO heißen muss, wenn man der Ungarischen Notation folgt.
Wie kommst du eigentlich auf diese Behauptung?

Der Variablentyp ist: interne Tabelle, daher LT.

Die Quelle mag EKKO sein. Ich hab jedoch noch nirgends gelesen, dass die Quelle Teil der ungarischen Notation sein sollte. Die Quelle interessiert auch überhaupt nicht, da es mehrere Quellen geben kann und man die Zielstruktur grundsätzlich selbst definieren (oder zumindest einschränken) sollte (und sei es über Wahl der zu selektierenden Spalten). Man könnte da also im faulsten aller Fälle (SELECT *) höchstens die Zielstruktur noch entsprechend der Quelle(n) benennen (also hier: LTY_EKKO). Da spricht nichts dagegen. Wobei, wenn man wirklich so faul ist, dann kann man gleich SELECT * INTO @DATA nutzen und braucht sich um die Benamung der Zielstruktur überhaupt keine Gedanken zu machen.

Variablen jedoch (die die Zielstrukturen und generell eigene Strukturen nutzen), sollte man generell passend zu deren inhaltlichen Daten bezeichnen.
Zuletzt geändert von tar am 25.10.2024 18:15, insgesamt 1-mal geändert.

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von ralf.wenzel (Top Expert / 3917 / 199 / 280 ) »
Die Ungarische Notation ist so DEFINIERT, das hatte ich ausgeführt. Quelle: Ihr „Erfinder“. Wenn der Erfinder dir als Quelle nicht reicht, kann ich dir auch nicht helfen.

Es geht auch nicht um die Quelle der Daten, sondern um den Typ. Die Tabelle EKKO ist vom (Zeilen)typ EKKO, darum muss nach HN die Tabelle LT_EKKO heißen (lokale Tabelle vom Typ EKKO). Und ja: Darum sind auch mehrere Quellen kein Problem, für eine View hast du ja auch einen Zeilentyp.


Ralf *unterwegs, daher nur kurz
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von tar (ForumUser / 82 / 20 / 27 ) »
Es scheint, du verwechselst den grundsätzlichen Variablentyp (Referenz, Tabelle, Struktur, Wert) mit dem Datentyp (konkrete/s/r Interface;Klasse/Tabellentyp/Strukturtyp/Datenelement). Letzterer ist bei ABAP bzgl. der Variablenbezeichnungen grundsätzlich irrelevant und ich habe auch noch nirgends gelesen, dass man den einsetzen soll. Aber laut der allwissenden Müllhalde bist du da nicht der Erste, der Simonyi missverstanden hat.
Zuletzt geändert von tar am 25.10.2024 18:58, insgesamt 1-mal geändert.

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von ralf.wenzel (Top Expert / 3917 / 199 / 280 ) »
Für mich ist die Diskussion beendet. Offensichtlich kommen wir hier nicht zu neuen Erkenntnissen.

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von DeathAndPain (Top Expert / 1916 / 249 / 407 ) »
Ich würde hier gerne nochmal einhaken bzgl. des FREE-Befehls. Nur diesen anstelle von CLEAR oder REFRESH zu verwenden, habe ich tatsächlich schon bei Leuten gesehen und war entsetzt.

Speicherbereiche zu belegen oder wieder freizugeben kostet Rechenleistung. Aus diesem Grund gibt ABAP diesen Speicher nicht sofort bei CLEAR oder REFRESH wieder frei, sondern hält ihn für neue Werte belegt (und gibt ihn ggf. bei Routinenende frei). Das ist richtig und sinnvoll so. Dementsprechend solltest Du Dir die vorletzte Zeile der Onlinedokumentation des FREE-Befehls mal anschauen:

https://help.sap.com/doc/abapdocu_750_i ... object.htm

Da hast Du schwarz auf weiß die Meinung der SAP dazu. Woraus sich auch ergibt, was davon zu halten ist, wenn jemand immer nur FREE schreibt. Das ist nämlich ein klares Zeichen dafür, dass er nicht verstanden hat, was FREE im Vergleich zu CLEAR bedeutet.

FREE kann man vor allem bei kurzfristigen temporären Tabellen gebrauchen. Im Organisationsmanagement stehe ich beispielsweise häufiger mal vor dem Problem, eine Personalnummerntabelle als TABLE OF PERSNO vorzuliegen zu haben. Für den FOR ALL ENTRIES IN eines SELECT auf die Tabelle HRP1001 brauche ich die Zeilen aber im Format SOBID (das mehr Stellen hat). Da mache ich dann sowas wie

Code: Alles auswählen.

DATA(temp_pernrn_as_sobid) = VALUE #( FOR <zeile> IN pernrn ( <zeile> ) ). " CORRESPONDING geht nicht, da die Tabelle unstrukturiert ist

SELECT....

FREE temp_pernrn_as_sobid.
Da der einzige Zweck der Tabelle temp_pernrn_as_sobid darin besteht, in diesem SELECT verwendet zu werden, brauche ich sie anschließend für den Rest des Programms definitiv nicht mehr. Also kann ich den von ihr belegten Speicher sofort nach dem SELECT freigeben. An dieser Stelle ist FREE richtig. Ansonsten aber werden interne Tabellen in aller Regel weiter benötigt (bis zum Ende der Routine). Sie einzeln vorher freizugeben, lohnt auch nicht. Nur wenn man sich sicher ist, dass man eine der verwendeten (lokalen) internen Tabellen definitiv nicht mehr braucht und das Ende der Routine noch fern ist, lohnt ein FREE.

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von tar (ForumUser / 82 / 20 / 27 ) »
Ich verstehe, frage mich aber direkt, was das nun hierfür bedeutet:

Code: Alles auswählen.

method do_something.
  " ...
  loop at lt_entries assigning field-symbol(<entry>).
    <entry> = do_something_with_the_entry( <entry> ).
  endloop.
  " ...
endmethod.

method do_something_with_the_entry.
  ro_result = io_entry.

  data(lt_sub_entries) = ro_result->get_sub_entries( ).

  loop at lt_sub_entries assigning field-symbol(<sub_entry>).
    " ...
  endloop.

  " ...
endmethod.
Jeglicher Memory (auch der Initial-Memory) zu lt_sub_entries wird nach jedem Verlassen der Methode do_something_with_the_entry() automatisch freigeräumt (entspricht FREE) und eine separate Untermethode könnte man im Grunde für jeden Anwendungsfall erstellen, wo du momentan explizit CLEAR benutzt, nicht wahr?

Jetzt überlege ich ferner, wie oft und wie arg tief verschachtelt die Logik - also der Stack - im SAP-Standard ist und kann nur schlussfolgern: es ist geradewegs umgekehrt der Ausnahmefall, gezielt CLEAR benutzen zu wollen/müssen.

Oder habe ich hier einen argen Denkfehler?

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von DeathAndPain (Top Expert / 1916 / 249 / 407 ) »
Jeglicher Memory (auch der Initial-Memory) zu lt_sub_entries wird nach jedem Verlassen der Methode do_something_with_the_entry() automatisch freigeräumt (entspricht FREE)
Das würde ich vermuten. Auch wenn der Optimierer von ABAP zuweilen Erstaunliches tut.
und eine separate Untermethode könnte man im Grunde für jeden Anwendungsfall erstellen, wo du momentan explizit CLEAR benutzt, nicht wahr?
Diesen Gedanken verstehe ich nicht. Weshalb solltest Du jedesmal, wenn Du eine interne Tabelle leeren möchtest, stattdessen eine Untermethode rufen wollen?

Bedenke zudem, dass das Ganze nur relevant ist, wenn die interne Tabelle ausschließlich in der Untermethode genutzt wird. Ist sie Teil der Parameterschnittstelle (oder global), dann wird da gar nichts geleert (außer bei Wertübergabe, die bekanntlich etwas Performance kostet).
Jetzt überlege ich ferner, wie oft und wie arg tief verschachtelt die Logik - also der Stack - im SAP-Standard ist und kann nur schlussfolgern: es ist geradewegs umgekehrt der Ausnahmefall, gezielt CLEAR benutzen zu wollen/müssen.
Ich denke, wie genau die Stackverwaltung von ABAP programmiert ist, wissen wir alle nicht. Aber das Anfordern (Belegen) neuen Hauptspeichers sowie das Freigeben desselben erfordert einen gewissen Rechenaufwand. Bereits belegten Hauptspeicher zu nutzen, erspart dies. Daran lässt die SAP ja im oben verlinkten Hilfetext keinen Zweifel.

Bei klassischen Datenbanktabellen ist es übrigens seit jeher genauso. Deswegen hat man ja ein Problem, wenn man aus Versehen eine Tabelle mit Millionen von Müllzeilen füllt: Auch wenn Du diese anschließend wieder löschst, wird der dadurch belegte Platz im Tablespace der Datenbank mitnichten wieder freigegeben, denn auch die Datenbank geht davon aus, dass dieser Platz für zukünftige neue Tabelleneinträge recyclet werden kann und will keine Performance verschwenden. Willst Du den Platz wiederhaben, musst Du eine Reorganisation des Tablespaces anstoßen (und die dauert!). Zumindest habe ich es so in Erinnerung. Datenbanken entwickeln sich weiter und verhalten sich heutzutage womöglich anders als in den Zeiten, als ich sie administriert habe.

Selbst beim Dateisystem NTFS (von Windows) ist es so: Legst Du Millionen von Dateien an, wächst der von der Plattenverwaltung belegte Speicherplatz auf der Festplatte. Diesen bekommst Du nicht zurück, wenn Du die ganzen Dateien wieder löschst.

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von tar (ForumUser / 82 / 20 / 27 ) »
DeathAndPain hat geschrieben:
29.10.2024 12:06
und eine separate Untermethode könnte man im Grunde für jeden Anwendungsfall erstellen, wo du momentan explizit CLEAR benutzt, nicht wahr?
Diesen Gedanken verstehe ich nicht. Weshalb solltest Du jedesmal, wenn Du eine interne Tabelle leeren möchtest, stattdessen eine Untermethode rufen wollen?
Ich meinte nicht, um lediglich die interne Tabelle zu leeren usw., sondern den gesamten Codeblock, in dem du eben eine interne Tabelle aufbaust, füllst, für irgendwas nutzt und leerst. Das könnte man immer in eine eigene Methode auslagern und dabei eben auf das Leeren verzichten, weil das durch das Verlassen der Methode ohnehin passiert. Je nach Komplexität/Umfang/Verständlichkeit der Methode wird man dies sowieso tun - gerade auch dann, wenn man 100%-ig sicherstellen will, dass im nächsten Durchlauf keine falsch gefüllten Variablen vorhanden sind.
Aber das Anfordern (Belegen) neuen Hauptspeichers sowie das Freigeben desselben erfordert einen gewissen Rechenaufwand. Bereits belegten Hauptspeicher zu nutzen, erspart dies. Daran lässt die SAP ja im oben verlinkten Hilfetext keinen Zweifel.
Du hattest doch weiter oben ein Beispiel genannt, wo du ganz gezielt nutzt. Kannst du da vielleicht mal einen Benchmark mit jeweils 1000 Wiederholungen fahren mit diesen 3 Varianten?
- Loop mit CLEAR []
- Loop mit FREE
- Untermethode (in der die Tabelle erzeugt und gefüllt wird, aber ohne CLEAR und ohne FREE)

Jeden Fall dann vielleicht 10x ausführen und den Mittelwert bilden. Dann hätte man mal einen Anhaltspunkt, ob und wie hoch überhaupt die Performanceunterschiede tatsächlich sind.

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von ralf.wenzel (Top Expert / 3917 / 199 / 280 ) »
tar hat geschrieben:
30.10.2024 01:37
Ich meinte nicht, um lediglich die interne Tabelle zu leeren usw., sondern den gesamten Codeblock, in dem du eben eine interne Tabelle aufbaust, füllst, für irgendwas nutzt und leerst.
Wichtige interne Tabellen verwalte ich über ein Iterator-ähnliches Konstrukt (also in einer eigenen lokalen Klasse). Schon deshalb, weil aus einem READ dann ein Methodenaufruf wird, der sprechend ist. hole_formularsatz( ) oder so.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von black_adept (Top Expert / 4066 / 120 / 934 ) »
ralf.wenzel hat geschrieben:
30.10.2024 09:06
Wichtige interne Tabellen verwalte ich über ein Iterator-ähnliches Konstrukt
Ralf
Argh. Wenn ich, gerade bei dir, Ralf, "Iterator-ähnliches Konstrukt" lese, rollen sich mir die Zehnägel auf. Es ist mir unverständlich warum man sein Designpatternwissen überall unmotiviert einzusetzen auslebt. SAP bietet durch LOOP mit seinen diversen Ausprägungen bzw durch die SORTED-Tabellentypen doch implizit vorhandene Iteratoren, die wahrscheinlich >95% aller Fälle, wo man einen Iterator benötigt, abdecken. Das ist "programmieren an der Sprache ABAP vorbei".
Why 😱 ?

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
ralf.wenzel hat geschrieben:
20.10.2024 18:09
Ich stimme dir in Allem zu - bis auf eines:
DeathAndPain hat geschrieben:
20.10.2024 18:02
INTO vor FROM. Nach meinem Dafürhalten war das einst bei SQL sogar so vorgeschrieben, jedenfalls bei Informix 4GL war diese Reihenfolge Pflicht. In ABAP schreibt aber sonst jeder zuerst FROM und danach erst INTO. ABAP akzeptiert beides.
Wenn ich etwas von A nach B lege, dann sage ich im normalen Sprachgebrauch IMMER erst, von wo und dann nach wo ich es lege. Sieht man ja schon am Anfang des Satzes.

Darum finde ich FROM vor INTO deutlich einfacher zu lesen.


Ralf
Nun ja die Frage stellt sich eher weniger. SAP schreibt im strikten Modus INTO immer als letzten Teil der Select Anweisung vor. Hat auch eine gewisse Logik Was->Woher->mit welchen Bedingungen->mit welchen Parametern->Wohin ?
"Code lügt nicht ^^"

Re: Umherspringende Methoden im quelltextbasierten Class Builder

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
tar hat geschrieben:
21.10.2024 23:33

Findest du, Dumps zu erzwingen statt Exceptions zu werfen oder noch besser: den Fehler direkt zu behandeln (und wenn es ein Message Type E ist), nicht irgendwie seltsam?
Hier musst du folgendes Bedenken : Der Verwender deines Codes kann eine Exception catchen und einfach fortsetzen. Eine ASSERT Anweisung definiert einen klar inkonsistenten Programmzustand. Es ist also durchaus berechtigt, hier einen Dump zu erzeugen.

Folgende Benutzer bedankten sich beim Autor gtoXX für den Beitrag:
DeathAndPain

"Code lügt nicht ^^"

Vergleichbare Themen

10
Antw.
2821
Views
Top-Includes im Class-Builder
von mwcem » 27.06.2006 16:39 • Verfasst in ABAP Objects®
3
Antw.
5108
Views
Interne Tabelle in Class Builder definieren
von mamaierhofer » 20.03.2007 16:14 • Verfasst in ABAP Objects®
5
Antw.
6702
Views
Abstrakte Methode im Class Builder anlegen
von jay-tee » 18.12.2006 14:22 • Verfasst in ABAP Objects®
5
Antw.
3231
Views
Class Builder: Default für Meth.param. gepackt mit Dezimalen
von Gast » 06.02.2006 13:57 • Verfasst in ABAP Objects®
0
Antw.
2501
Views
Solution Builder (Build Block Builder)
von SAP_ENTWICKLER » 19.12.2018 09:59 • Verfasst in Sonstige Module

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.