Ob man eine Methode oder eine Funktion aufruft macht kaum einen Unterschiedralf.wenzel hat geschrieben:Das ist eine funktionale Methode, die nur den conversion exit aufruft. Die schreibt man einmal und genießt die (in meinen Augen durchaus vorhandenen Vorteile) immer wieder.
"Völliger Unfug" sagt Daniel dazu wörtlich. Ich habe ihm geschrieben, in welchem Kontext das sinnvoll ist, weil man dann eben nicht diesen coding-zerschneidenden "geschwätzigen Codingblock" ggf. mit Hilfsvariablen einbauen muss (den ICH subjektiv als leseerschwerend empfinde, muss nicht jeder so sehen), sondern das Ergebnis dieser Methode an funktionalen Operandenpositionen einsetzen kann. Für bestimmte Konvertierungen ist es darüber hinaus sinnvoll, den Eingabewert zu verproben, damit kein Müll rauskommt, was man dann zentral einbauen kann.
Die beiden haben das lediglich zur Kenntnis genommen. Und BA-Studenten die seitralf.wenzel hat geschrieben:Aus diesen zwei Gründen habe ich in Absprache mit internen Entwicklern diese Klasse und auch die gezeigte Methode geschrieben
Ja, das setzt aber aus wenn es nicht mehr um die Sache sondern um Ideologien geht.ralf.wenzel hat geschrieben:Erfahrenen Entwicklern unterstelle ich grundsätzlich zunächst immer, dass sie sich dabei was gedacht haben, was sie tun.
Nicht alles ist Unfug, nicht alle sind Dilettanten. Einiges und Einige schon.ralf.wenzel hat geschrieben:Aber bestimmte Leute, die hier schreiben, als hätten sie das Rad erfunden, deklarieren einfach schnell alles als Unfug, was / wessen Kontext sie nicht verstehen. Alles Unfug - SAPUI5, OO, ABAP 7.40 mit seinen Kurzformen, Polymorphie. Und die bei der SAP, die das machen, haben nicht etwa eine unbekannte Motivation, sie sind Dilettanten, die keine Ahnung haben.
Evtl. erinnerst du dich daß ich die Anwendung für Auftragserfassung auf dem Ipadralf.wenzel hat geschrieben:Ein Blutspendedienst will keinen PC zum Blutspendetermin schleppen, wenn ein Tablet für die Datenerfassung reicht und außerdem eine Kamera eingebaut ist, mit der man beliebige Bar-/QR-Codes lesen kann, die auf Blutspendeausweisen und Proben vorhanden sind. Da kann man sich als Entwickler im Kreis drehen und Sch... schreien, der Anwender ist der Boss.
Genau. Und deshalb ist 00 nur eines von vielen Werkzeugen. Man wähle das fürralf.wenzel hat geschrieben:Für jemanden mit einem Hammer ist jedes Problem ein Nagel.
Daniel hat geschrieben: Ob man eine Methode oder eine Funktion aufruft macht kaum einen Unterschied
im Coding. Ich kann die Stellen des Aufrufs ja posten - die sind einfach nur im
laufenden Coding eingefügt.
Daniel hat geschrieben: Das verschachteln von Funktionen im Methoden ist nicht nur Unsinn sondern auch
höchst gefährlich.
Ein Hello-World-Programm hat wohl auch kaum die Aufgabe, "Hello world" auszugeben...Daniel hat geschrieben:Viele Funktionen müssen in einer bestimmten Reihenfolge gerufen
werden. Beispielsweise der MB_CREATE_GOODS_MOVEMENT. Ruft man Ihn ein zweites
Mal bevor man den MB_POST_GOODS_MOVEMENT gerufen und comittet hat bricht er
ab weil das nicht zulässig ist. Wird der Aufruf allerdings in einer Methode verschalt
bemerkt er den wiederholten Aufruf nicht.Daniel hat geschrieben: Da hätte ich ja gerne einen Beweis für, dass die Verschalung damit zu tun hat...
Und gerade mit einer Verschalung kann man solche Umstände, super in der Schale abbilden und entsprechend reagieren.
Das ist ja nun auch großer Quatsch!Daniel hat geschrieben:Wenn man in 00 programmieren will dann muß an das auch in Reinform praktizieren.
Für die Mischschform ist das System nicht ausgelegt. Daher ist solches Vorgehen nur
als anfängliches Unvermögen zu bezeichen.
Daniel hat geschrieben: Wenn ich dann sehe daß jemand für ein Hello-World-Prog
eine Methode aufmacht sind wir genau bei dem Hammer. Das ist Blödsinn.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
ralf.wenzel
Nö. Sieht immer noch so aus (Nur ein Beispiel):ralf.wenzel hat geschrieben:Und sie haben es nicht zur Kenntnis genommen, sondern diskutiert und ausgebaut.
Code: Alles auswählen.
TRY.
" this statement has to be that complex: we do need SERNR in table extension_in in CHAR18 format to convert it to GERNR format
" otherwise, we'll get CX_SY_CONVERSION_NO_NUMBER dumps
sernr = zcl_abap_conversion_exits=>conversion_exit_gernr_input( CONV char18( me->zif_app_cluster~extension_in[ structure = 'SERNR' valuepart2 = <item>-itm_number ]-valuepart1 ) ).
CATCH cx_sy_itab_line_not_found.
" no equipment
CONTINUE.
ENDTRY.
Habe ich jahrelang auch so gemacht und erwische mich immer noch von Zeit zu Zeit dabei. Allerdings habe ich auch genug kleine Programme geschrieben, die in den folgenden Jahren zu immer größeren Gebilden gewuchert sind und wo man sich dann beim Einfügen eines neuen Schalters ärgert, wenn man auf einmal 10-20 Aufrufe vorfindet, die angepasst werden müssen.DeathAndPain hat geschrieben:Bei dem von Dir genannten kleinen Programm erweitere ich halt rasch neben der Formroutine auch die Aufrufe. Dort, wo der Parameter nicht benötigt wird, übergebe ich halt SPACE oder 0. Das dauert nicht lange, und wenn ich das als Literal (bzw. SPACE als Naturkonstante ) übergebe, dann ist auch dem Leser klar, dass diese Parameter hier keine relevanten Daten transportieren.
Ich frage mich trotzdem was an dem Overhead jetzt so schlimm ist.DeathAndPain hat geschrieben:Doch der Preis, den man dafür zahlt, ist hoch, denn man muss extra eine (statische) Klasse definieren, dann eine Methodendefinition schreiben, dann eine Methodenimplementation schreiben, bei der man hoffentlich alle Parameter auswendig im Kopf hat, denn bei lokalen Methoden stehen die ja nicht am Anfang der Form, sondern ggf. am anderen Ende des Programms, [...] Der ganze Mülloverhead halt, den das OO erzwingt.
Was ist daran ketzerisch? Definitionen - egal ob von Variablen, Typen oder auch Objekte - gehören zusammen und wenn man mit TOP-Includes arbeiten möchte gehören die dann halt da hin.DeathAndPain hat geschrieben:Solche Miniklassen packe ich aber auch ketzerischerweise ins TOP-Include, wo sie zusammen mit dem ganzen übrigen Definitionskram aus meinem tatsächlichen Code herausgehalten werden.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
ralf.wenzel • ewx
Jein. Es ist mehr, denke ich. Auch eine Philosophie.Daniel hat geschrieben:Es ist ein Werkzeug daß man verwendet wenn es geeignet ist.
Nicht mehr und nicht weniger.
Saubere Schnittstellen: jaDaniel hat geschrieben: Eine Testumgebung und saubere Schnittstellen gab es lang vor 00.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
ralf.wenzel
Paul Hardy hat geschrieben: https://blogs.sap.com/2016/10/29/harlem ... e-shuffle/
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
ralf.wenzel
Auch hierzu kann man eine andere Meinung haben.ewx hat geschrieben:Übrigens ein lesenswerter Artikel, der auch noch gut zum Thema passt:Paul Hardy hat geschrieben: https://blogs.sap.com/2016/10/29/harlem ... e-shuffle/
Doch, hat es. Das ist ja der Klassiker, den man als "Hello World"-Programm bezeichnet: einfach "Hello World" auszugeben als trivialstmöglichstes Beispiel eines Programms, das sichtbar was tut.Ein Hello-World-Programm hat wohl auch kaum die Aufgabe, "Hello world" auszugeben...
Aber eben auch erhebliche Nachteile, gerade auch im Bereich der Wartung. Man ist viel mehr auf gute Doku angewiesen, um fremden Code zu verstehen, und wenn es die (wie immer) nicht gibt, dann ist man aufgeschmissen. Vor allem aber kann man den Debugger kaum noch nutzen. Der ist ja nicht nur ein nützliches Tool zur Fehlersuche, sondern oft auch die Rettung, wenn man Probleme hat, fremden Code zu verstehen (und bevor man ihn debuggt oder erweitert, muss man ja erst mal seine Arbeitsweise verstanden haben). Wenn der Code nur noch aus "selbstgemachten" Befehlen in Form von Objekten und Methoden besteht, deren Verhalten kontextabhängig ist (da er sich abhängig von in privaten Attributen versteckten Werten ändert) und bei denen man noch nicht mal das Sollverhalten kennt, dann tut man sich mit dem Debugger extrem schwer, sich darauf einen Reim zu machen.Und ja, oftmals hat man etwas mehr Aufwand. Aber gerade im SAP-System leben wir in einem Ökosystem, in dem die vorhandenen Programme auch gewartet werden müssen. Und gerad da bietet OO viele Vorteile. Von Testklassen bis hin zu sauberen Schnittstellen, wodurch eine Funktion schnell durch eine andere ausgetauscht werden kann.
Solche Hilfsmethoden nutze ich ja in der von mir geschilderten Form. Aber das ist ja - ebenso wie übrigens auch Ralfs Konversionsmethode - letztlich alles statischer Kram. Mal abgesehen davon, dass es inhaltlich keine Punkte bringt, dafür eine Klasse definieren zu müssen, ist ja gerade die Frage, wie es bei "richtigen" Unterprogrammen, die mehr sind als nur eine kleine funktionale Methode und daher auch eine nennenswerte Latte von Parametern haben, aussieht. Und da kriege ich bei Methoden eine Macke. F2 in Eclipse ist eine Hilfe, aber keine perfekte Lösung.Ich frage mich trotzdem was an dem Overhead jetzt so schlimm ist.
...Bei solchen Hilfsmethoden ist bei mir die Anzahl der Parameter recht überschaubar
- Alle Parameter auswendig...
Ja, das habe ich bei anderen OO-Programmierern auch schon gesehen. Aber das kann es doch nicht sein, dass man, nachdem man die Methode fertig definiert hat, noch händisch die ganzen Parameter in einen Kommentar an der Implementierung umkopieren muss. Abgesehen von dem an sich schon unzumutbaren Zusatzaufwand landen wir da dann ganz schnell auch wieder bei Deiner Anmerkung, was denn ist, wenn man mal einen Parameter ergänzt (oder löscht oder ändert). Schwupp stimmt der Kommentar nicht mehr, und Du darfst ihn auch wieder nachpflegen. Oder Du vergisst es, und der nächste Programmierer (oder Du selber) orientiert sich beim Bearbeiten der Methode dann an einer Schnittstellenbeschreibung, die nicht stimmt.Das ist der einzige Punkt, der mich auch stört weil ich 1x mehr klicken muss. Naja - bei komplizierteren Methoden habe ich mir angewöhnt die Definition als Kommentar vor die Implementierung zu schreiben - das hilft zumindest.
- Signatur der Methode fehlt in Implementierung
Ich kann mich erinnern, mir dafür vom System eine Meldung gefangen zu haben, in der ich belehrt wurde, dass solches Coding in einem Top-Include keinen "Sinn" machen würde (das Wort "Sinn" stand da wirklich drin!). Ich glaube, das war eine Warnung von der Syntaxprüfung, die als gelbes Dreieck in Eclipse hochkommt. Bin mir aber nicht mehr ganz sicher. Auf jeden Fall kam das. Fand ich schon ganz lustig, dass das System allein anhand des Include-Namens messerscharf (und nicht falsch) auf dessen Zweck schließt und mich belehrt, was da reingehöre und was nicht. Idiotisch fand ich es freilich auch.Was ist daran ketzerisch? Definitionen - egal ob von Variablen, Typen oder auch Objekte - gehören zusammen und wenn man mit TOP-Includes arbeiten möchte gehören die dann halt da hin.Solche Miniklassen packe ich aber auch ketzerischerweise ins TOP-Include, wo sie zusammen mit dem ganzen übrigen Definitionskram aus meinem tatsächlichen Code herausgehalten werden.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Daniel
Nein - das ist ein Missverständnis deinerseits was dich dazu führt Äpfel mit Birnen zu vergleichen.DeathAndPain hat geschrieben:Gipfeln tut das im (zum Glück optionalen) DEFINITION DEFERRED. Bei einer Formroutine ist es völlig egal, wo sie steht. Wenn es sie gibt, wird sie angesprungen. Eine Methode (oder Klasse) aber muss in der Reihenfolge vor dem Code stehen, der sie aufruft, sonst kennt er sie nicht. Was ist das für eine altertümliche Einschränkung?[...]Auch hier wieder: rein akademischer Grund; in der Praxis nicht mehr als ein Ärgernis.
Quatsch. Die Parameter der FBs stehen fein säuberlich in der Tabelle fupararef.ralf.wenzel hat geschrieben:DAS ist der Grund, warum die einfache Syntaxprüfung einen Typfehler in der Parameterübergabe erkennt und moniert, bei Funktionsbausteinen aber nicht (weil das viel zu lange dauern würde). Dazu braucht man dann die Erweiterte Programmprüfung mit "Teure übergreifende Prüfungen" (oder so ähnlich).
Folgende Benutzer bedankten sich beim Autor Daniel für den Beitrag:
DeathAndPain
DAS ist leider nicht der Grund. Der Grund ist, dass FuBa eigentlich immer dynamisch aufgerufen werden und SAP keinen statischen Aufruf vorgesehen hat. Das Dumme ist nur, dass der übliche Aufruf via Funktionsbausteinnamen ein dynamischer Aufruf mittels Literal ist, was zwar de facto dann ein statischer Aufruf ist aber vom Interpreter immer noch als dynamisch angesehen wird. Entspricht etwa folgendem dynamischen (aber de facto statischen) SELECT-Konstructralf.wenzel hat geschrieben:DAS ist der Grund, warum die einfache Syntaxprüfung einen Typfehler in der Parameterübergabe erkennt und moniert, bei Funktionsbausteinen aber nicht (weil das viel zu lange dauern würde)
Code: Alles auswählen.
SELECT ... FROM ('MARA') .....
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
ralf.wenzel • DeathAndPain