Es wäre nett, wenn Du das genauer erläutern könnntest.für manche Sachen ist es im Konstruktor einfach zu spät.
Nur wird damit die im Vergleich ohnehin schon hundsmiserable Performance von OO nochmal ein Stückchen schlechter. In den meisten Fällen mag ABAP-Performance keine Rolle spielen, aber in manchen eben doch (etwa wenn man einen Report programmiert, der sehr viele Zeilen kompliziert zu lesender Werte ermittelt).Ich mag öffentliche RO-Attribute nicht, es gibt IMMER GET-Methoden, weil sich oft herausstellt, dass für manche Lesezugriffe auf Attribute doch ein bisschen Logik notwendig ist. Auch wenn das in 9 von 10 Fällen nicht der Fall ist.
boaey, geht das schon wieder los?DeathAndPain hat geschrieben:hundsmiserable Performance von OO
Was hat das mit objektorientierter Programmierung zu tun?DeathAndPain hat geschrieben:da ich die Datenbanktabellenzugriffe einmal zu Programmbeginn per SELECT FOR ALL ENTRIES IN puffere, was die Datenbankzugriffszeit auf einen winzigen Bruchteil reduziert. Wenn ich da OO einsetzen würde, dann würde die Laufzeit drastisch ansteigen.
gegen OO zu stänkern mit einem Thema, das mit OO nichts zu tun hat.DeathAndPain hat geschrieben:Ich habe das nur am Rande erwähnt, um
Tja, da sind wir halt unterschiedlicher Meinung.ewx hat geschrieben:Trotzdem bezweifle ich, dass eine OO-Programmierung deines Lieblingsschätzchens eklatant langsamer wäre.
Da hast Du vollkommen recht, und das wollte ich auch nicht behaupten. Ich wollte nur darauf hinweisen, dass bei der kleinsten Verwendung von OO-Elementen, wie eine solche Ausnahmeklasse sie darstellt, sofort die ABAP-Performance eklatant einknickt.ewx hat geschrieben:Und nur weil man die 7.40er Syntax benutzt, programmiert man noch lange nicht objektorientiert.
Das ist so nicht richtig, wenn man die Funktionalität dagegen hält. Immerhin halten Kaskaden von Ausnahmeklassen ganze Protokolle im Speicher, die man zum Beispiel ins Application Log schreiben kann. Das kannst du auch prozedural nicht nennenswert schneller machen. Du fragst den sy-subrc ab und sagst, das gehe schneller. Klar geht das schneller, aber das musst du ja irgendwie gescheit verarbeiten. Und diese Verarbeitung ist, bei entsprechender Komplexität, ein Performancefresser (ich nehme mal das provokante Wort, weil SO schlimm kann das nicht sein, sonst hätten wir das im Projekt gemerkt).DeathAndPain hat geschrieben:Da hast Du vollkommen recht, und das wollte ich auch nicht behaupten. Ich wollte nur darauf hinweisen, dass bei der kleinsten Verwendung von OO-Elementen, wie eine solche Ausnahmeklasse sie darstellt, sofort die ABAP-Performance eklatant einknickt.
Nein. Außer, dass beide aus ABAP-Coding bestehen, gibt es praktisch keine Parallelen. Ich kann (ohne Dirty Assign) nicht von außen auf Attribute einer Funktionsgruppe zugreifen (streng genommen HAT eine Funktionsgruppe keine Attribute, sondern Variablen, weil sie keinen Zustand hat). Ich kann auch keine Hilfs-Funktionsbausteine als geschützt deklarieren, damit sie nicht von außen im Zugriff sind. Dieses Problem habe ich gerade bei einem RFC-Funktionsbaustein, der eigentlich von anderen nicht aufgerufen werden darf. Es gibt auch keine Vererbung, ich kann nicht mehrere Funktionsgruppen-Instanzen im Speicher halten. Sprich: Ich muss dem Funktionsbaustein zum Verbuchen einer Blutspende stets alle Daten mitgeben, weil es eben nur eine Instanz gibt (darum hat eine Funktionsgruppe auch keinen Zustand, weil es eh nur eine Instanz gibt). Das Interface einer Funktionsgruppe besteht aus den Funktionsbausteinschnittstellen. Ich kann also nicht eine Teilfunktionalität an eine (wie auch immer realisierte) Prozedur übergeben. Genau genommen: Ich kann eine Funktionsgruppe oder einen Funktionsbaustein überhaupt nicht an eine Prozedur übergeben.DeathAndPain hat geschrieben:Funktionsgruppen haben ja so große Ähnlichkeiten mit Klassen
Das war ein Versehen, weil ich erst nur auf den geklammerten Teil Bezug nehmen wollte und dann gemerkt habe, dass es sich eben nicht auf den in Klammern stehenden Teil bezog...DeathAndPain hat geschrieben: Ich kann nicht glauben, dass hier bei einem 209 Wörter umfassenden Beitrag von mir, der eine 22 Wörter umfassende, explizit in Klammern gesetzte Randbemerkung enthält, krampfhaft versucht wird, diese als Kern des Beitrags darzustellen.
Du hängst dich immer wieder an diesem einen Beispiel auf... Es ist wichtig zu wissen, dass das so ist. Und wenn dieser READ[ index ], der zudem oftmals fehlschlagen kann, ein zentrales, performancekritisches Element in der Programmierung ist, dann darf man ihn halt nicht verwenden. Aber die Aussage, "dass bei der kleinsten Verwendung von OO-Elementen [...] sofort die ABAP-Performance eklatant einknickt." ist definitiv falsch.DeathAndPain hat geschrieben:Da hast Du vollkommen recht, und das wollte ich auch nicht behaupten. Ich wollte nur darauf hinweisen, dass bei der kleinsten Verwendung von OO-Elementen, wie eine solche Ausnahmeklasse sie darstellt, sofort die ABAP-Performance eklatant einknickt.ewx hat geschrieben:Und nur weil man die 7.40er Syntax benutzt, programmiert man noch lange nicht objektorientiert.
Du vergleichst Äpfel mit Rosinen... Performance hat so viele Facetten, die man nicht auf solche Dinge wie "Klasse" oder "Funktionsbaustein" reduzieren kann.DeathAndPain hat geschrieben:Was ich nicht untersucht habe, was aber mal interessant wäre, ist, wie die Performance sich darstellen würde, wenn man FBs statt Formroutinen verwenden würde. Funktionsgruppen haben ja so große Ähnlichkeiten mit Klassen, dass ich sie als Vorläufer von Klassen einschätzen würde. Allerdings gibt es sie schon so lange, dass ihre Performance auch auf aus heutiger Sicht antiker Hardware noch in Ordnung sein sollte. Müsste man mal ein Testprogrämmchen für schreiben.
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
ralf.wenzel • AdrianSchm
Du beharrst darauf, nicht beim Thema zu bleiben. Dass OO viele Funktionalitäten bietet, die ohne nicht (bzw. nur auf Umwegen) erreichbar sind, ist unbestritten, hat aber mit der Performance nichts zu tun. Und wenn ich Daten für eine komplizierte Liste bereitstellen muss, bei der ich aus vielen Tabellen mit vielen Iterationen die Ergebniszeilen zusammenbasteln muss, dann nützen mir Kaskaden von Logs nichts, aus denen ich ersehen kann, an welcher Stelle mein Programm wegen Timeouts abgebrochen hat. Dann brauche ich einfach effizienten Code ohne Ballast.Ralf hat geschrieben:Das ist so nicht richtig, wenn man die Funktionalität dagegen hält.
Da bin ich anderer Meinung. Natürlich sind Klassen viel neuer und damit ausgefeilter und umfassender. Man kann Funktionsgruppen als Vorläufer der Klassen bezeichnen. Aber wie Klassen enthalten Funktionsgruppen eine Ansammlung aufrufbarer Unterroutinen mit definierter Parameterschnittstelle, wie bei Klassen kann ich in Funktionsgruppen Werte verstecken, die Zustände definieren und von außen (legal) nicht zugreifbar sind, wie bei Klassen kann ich Ausnahmen zurückliefern (auch wenn man bei Klassen mehr damit anstellen kann). Klassen haben diverse Vorteile, weil bei ihnen das Konzept eben erheblich weiterentwickelt ist. Dafür haben Funktionsbausteine allerdings einen Vorteil, den ich persönlich als sehr gravierend wahrnehme: Sie bieten hervorragende Unterstützung von Online-Dokumentation bis hinunter zur plakativ angeboteten Detaildoku jedes einzelnen Parameters und jeder einzelnen Ausnahme an, während die Online-Dokumöglichkeiten von Methoden versteckt über das Menü, wo eh nie jemand reinschaut, nur als stiefmütterlich bezeichnet werden können.Ralf hat geschrieben:Nein. Außer, dass beide aus ABAP-Coding bestehen, gibt es praktisch keine Parallelen.
Jein. Ich halte das für eine Blickwinkelfrage. Der einzelne Befehl wird mit OO erheblich langsamer. Im Kontext betrachtet hat man aber in einem Benutzerdialog vielleicht eine Laufzeit von 200 ms, bis das nächste Fenster auf dem Schirm steht. Selbst wenn sich diese auf 400 ms verdoppeln würde, würde der Anwender es kaum wahrnehmen, so dass man nicht von einem unperformant laufenden Programm reden könnte. Diesen oder vergleichbare Fälle hat man oft in der Praxis, so dass die besseren Abstraktionsmöglichkeiten von OO durchaus ausschlaggebende Vorteile bieten können. Allerdings nach meiner Überzeugung eben nur bei hochkomplexen Großprojekten wie Ralfs Blutspendedienst, deren Komplexität mit konventionellen Programmiermethoden nicht beherrschbar ist, so dass man in den sauren Apfel beißen und zu OO-Code greifen muss, den später kein Projektfremder mehr versteht, wenn er nicht vorher seitenweise die Dokus der ganzen Objekte liest und versteht. Dazu müssen diese Dokus freilich existieren und detailliert und verständlich geschrieben sein. Gerade Letzteres ist ein bedeutsamer Engpass, denn die meisten Menschen (und ich rede noch nicht mal von Ausländern) sind gar nicht fähig, detaillierte Zusammenhänge strukturiert und nachvollziehbar in Worte zu kleiden. Und nun lass noch Englisch als Projektsprache gefordert sein... Es ist einfach ein nicht zu unterschätzender Vorteil, wenn man noch eine Chance hat, sich aus dem Programmcode selbst dessen Funktionsweise zu erarbeiten. Auch dann, wenn noch der eine oder andere Bug vorhanden ist (was bei Klassen auch bitter ist, denn wenn ich versuche, eine Klasse zu verstehen und diese sich dann nicht sollgemäß verhält, dann lege ich mir die Karten angesichts der Frage, ob das ein Bug ist oder ich nur noch nicht richtig verstanden habe, wie die Klasse funktioniert).ewx hat geschrieben:Aber die Aussage, "dass bei der kleinsten Verwendung von OO-Elementen [...] sofort die ABAP-Performance eklatant einknickt." ist definitiv falsch.
Du meinst, die zugehörige Klasse mit ihren Attributen usw. wird nicht in den Speicher geladen? Ist das Dein Ernst?!? Eine Klasse ist ein Rahmenprogramm. Ohne dieses sind die zugehörigen Methoden doch gar nicht funktionsfähig!ewx hat geschrieben:Beim Aufruf eines Funktionsbausteins wird übrigens die gesamte Funktionsgruppe in den Speicher geladen, beim Aufruf einer Methode nur der Sourcecode dieser Methode...
Ich kann nicht einfach Firmencode ins Internet hochladen. Zumal sich einzelne Funktionen nicht wirklich isoliert betrachten lassen, sondern sich das über die Iterationen verzahnt. Im Prinzip habe ich eine Tabelle von Mitarbeitern (da könnteste im MM aber genauso gut Materialien nehmen). Zu diesen lese ich jetzt innerhalb eines Zeitraums einen Wert, sagen wir, die Mitarbeitergruppe. Immer, wenn sie sich ändert, erzeuge ich eine neue Zeile. Ändert sich für Mitarbeiter X im Zeitintervall also zweimal die Mitarbeitergruppe, dann hat er in der Ergebnistabelle hinterher drei Zeilen.ewx hat geschrieben:Pack doch mal eine oder zwei zentrale Funktionen deines Lieblingsprogramm mit einem Demodatenbestand von x Datensätzen auf github und wir schauen mal, ob es überhaupt relevant ist, mit welcher Methodik es programmiert wird und was sich für Vorteile ergeben, wenn man es evtl. doch objektorientiert aufbaut...
Bitte nachreichen, wo diese Information offiziell dokumentiert ist ( falls es überhaupt stimmt, was ich ohne die nachzureichende Doku erst mal bezweifele ).ewx hat geschrieben:Beim Aufruf eines Funktionsbausteins wird übrigens die gesamte Funktionsgruppe in den Speicher geladen, beim Aufruf einer Methode nur der Sourcecode dieser Methode...
Mit dieser Aussage machst du dir weder Ralf noch D&P zum Freund. Aber ich kann dir endlich mal vollumfänglich zustimmen.ewx hat geschrieben:Und - um noch einmal die Kurve zum eigentlichen Thema zu bekommen - von einem SAP-Entwickler erwarte ich, dass er einen guten Kompromiss aus Wartbarkeit und Entwicklungszeit findet. Und dafür muss man sich zumindest etwas in OO auskennen.[...]. Das heißt nicht, dass OO das stets perfekte Tool ist. Bei vielen Aufgaben ist es definitiv egal, ob ich den Report old-school oder objektorientiert programmiere.
Ein Bewerber, der mir im Bewerbungsgespräch sagen würde: "OO benutze ich nicht - das ist ja viel zu langsam", würde ich ziemlich sicher ziemlich zügig eine Absage schicken.
Das gilt aber fast ausschließlich für Sichtbarkeiten - alles andere ist auch ohne OO machbar/möglich - evtl. aber deutlich aufwändiger.ewx hat geschrieben:Denn vieles ist definitiv nur mit OO möglich.
@Ralf: Doch - die beiden haben große Ähnlichkeiten in der Verwendung.ralf.wenzel hat geschrieben:Nein. Außer, dass beide aus ABAP-Coding bestehenDeathAndPain hat geschrieben:Funktionsgruppen haben ja so große Ähnlichkeiten mit Klassen
Wenn ich andere Posts von dir lese stellst du auch all deine Attribute auf privat und arbeitest mit Settern und Gettern, so dass das dann doch wieder ähnliches Verhalten istralf.wenzel hat geschrieben: Ich kann (ohne Dirty Assign) nicht von außen auf Attribute einer Funktionsgruppe zugreifen
Wenn du den Namen der FuGr oder des FuBa übergibst ist das völlig ausreichend um damit i.a. das abzubilden von dem ich glaube, dass du es meinst.ralf.wenzel hat geschrieben:Ich kann eine Funktionsgruppe oder einen Funktionsbaustein überhaupt nicht an eine Prozedur übergeben.