Daniel hat geschrieben:Und was veranlasst dich dann anzunehmen daß man seine R/3-Programme
in S/4 einfach so (ohne Anpassung und ohne Testen) weiterverwenden kann?
Das ist ganz einfach zu erklären, da ich aber auf Metaphern stehe, wird es jetzt etwas wortreich:
Ich habe ein Programm mit drei "Knöpfen" (es sind Buttons, aber ich bin aus dem Pott, da sind das "Knöppe"). Einer davon erzeugt ein Formular, einer selektiert Daten und zeigt einen ALV etc.
Normalfall:
Man schreibt einen Report, der die Knöpfe anzeigt und über einen CASE sy-ucomm abfragt und die Funktion ausführt. Hast du SAPscript und willst Adobe PDF, änderst du das Programm und musst es komplett testen. Willst du eine weitere Funktion dazubasteln, musst du das Programm an mehreren Stellen erweitern und eben auch neu testen. Du erfindest das Rad jedesmal neu.
Besser:
Du teilst das Programm in zwei Teile: Den Dialogteil nennen wir Dialogcontroller, den Rest Applikationscontroller.
Der Dialogteil stellt die Knöpfe da. Wenn du einen Knopf drückst, meldet der Dialogcontroller an den Applikationscontroller "hey, der Knopf X wurde gedrückt" und der Applikationscontroller erzeugt führt die Funktion aus und meldet das Ergebnis an den Dialogcontroller zurück.
Wenn du jetzt SAPUI5 einführst, hast du einfach einen anderen Dialogcontroller. Die Funktion selbst ist ja von der UI unabhängig, also funktioniert die weiter.
NOCH Besser - mit OO:
Im OO ist ein Knopf eine Klasse, der eine bestimmte Schnittstelle implementiert. Das bedeutet: Weder Dialogcontroller noch Applikationscontroller WISSEN, was der Knopf genau macht. Der Dialogcontroller meldet "dieser Knopf hier wurde gedrückt" und übergibt den Knopf (genauer: die Schnittstellenimplementierung) an den Applikationscontroller. Der sagt dann nur noch dem Knopf "führe bitte mal deine Funktion aus", ohne zu wissen, was der überhaupt macht. Der Knopf selbst ist eine in sich geschlossene (und testbare!) Einheit, die man einfach in den Dialog hängt oder eben nicht.
Es gibt natürlich noch andere Funktionen, die vom Applikationscontroller selbst ausgeführt werden, aber gerade bei den Knöpfen ist das eben nicht nötig. Weil der Knopf WEISS, welche Funktion er ausführt (man übergibt ja mit der Schnittstelle auch das Coding, die Implementierung). Und das sind eben Dinge, die ohne OO nicht gehen. Du kannst an einen Funktionsbaustein Daten übergeben, aber eben kein Coding. Das musst du aber machen, weil jeder Knopf natürlich anderes Coding ausführt.
Das heißt auch: Brauchst du eine neue Funktion, schreibst du eine Klasse dafür, implementierst die Schnittstelle, die diese Klasse als Knopf identifiziert und das daraus entstehende Objekt registriert sich in der "Knopfleiste". Dann brauchst du weder Dialog- noch Applikationscontroller zu ändern.
Das ist jetzt eine vereinfachte Darstellung ohne Servicelayer und Datenbankabtrennung, aber das Prinzip dürfte klar sein: Man hat unterschiedliche Schichten, die voneinander unabhängig sind und über definierte Schnittstellen miteinander kommunizieren. Und darum kann ich jede Schicht austauschen.
Und dann ist eben egal, aus welcher UI die Anweisung kommt "mach mir mal bitte ein Formular". Es ist sogar egal, was für ein Formular das ist, weil das kann ich auch austauschen (Servicelayer).
Zum Datenbanklayer: Es erscheint aufwendig, wenn man die Anweisungen SELECT, UPDATE, etc. nicht in Programmen einsetzen darf. Stattdessen ruft man ein Unterprogramm (OO: Methode) in einem separaten Programm (OO: Klasse) auf, die diese Daten besorgt und zurückliefert. Im einfachsten Falle hat man dann eine Reihe von Programmen (Klassen), in der alle DB-Zugriffe gekapselt sind. Wenn S/4 kommt, schreibt man NUR diesen Teil neu, denn man hat ja definierte Schnittstellen: Eingabeparameter und Ausgabeparameter. Der Applikation kann im Grunde vollkommen egal sein, wo die Daten herkommen. Das Programm braucht die Daten, mehr nicht.
Edit: Und wenn man das nicht neu erfinden will, nimmt man BOPF, da ist das alles schon fertig. /Edit
Und was ich nicht ändere, muss ich eben auch nicht testen. Ich muss nur sicherstellen, dass die neue Lösung dieselben Daten liefert wie die alte. Und ob der Bestand, den ich abfrage, aus der MARC kommt oder ob die HANA-DB viel schneller den Bestand aus der MSEG errechnet, ist dem Programm völlig egal. Das braucht den Bestand, fertig.
Wenn ich (Dialogcontroller) meiner Frau (Applikationscontroller) sage "ich will jetzt ne Pizza mit Schinken und Pilzen!" ist mir auch egal, ob sie die bestellt oder selbst macht. Am Ende muss ne Pizza rauskommen. "Verbergen der Implementierung" im realen Leben
- ich muss nicht die Frau wechseln, weil ich ne andere Pizza haben will.
Und ehe ich jetzt noch eine Mail schreibe, noch ein Insider zur ZC**N: Da habe ich haufenweise Bestandscoding aus der bestehenden, produktiv laufenden und funktionierenden Anwendung genommen und die Spezifika in Subklassen ausgelagert. Da ich bestehende Entwicklungsobjekte nicht angerührt habe, musste ich auch nicht testen, ob beim Erweitern was kaputtgegangen ist. Die Alternative wäre gewesen: Ein komplett neues Programm (Ohgott) oder man wurschtelt in dem alten herum mit dem Risiko, Fehler einzubauen, die sich dann im laufenden Betrieb auswirken (noch ohgotter).
Wie gesagt: Ich war lange kein Freund von OO - aber ich habe an praktischen Beispielen gelernt, welche Vorteile das hat, schon aufgrund des deutlich höheren Abstraktionsniveaus.
Ralf