Das ist der Knackpunkt, auf den ich auch hinaus will. Die Deklarationen von Feldern, die in der ganzen Subroutine gebraucht werden, am Anfang der Subroutine alle ordentlich beieinander stehen zu haben, ist kein Problem. Inline-Deklarationen sind nützlich, wenn sie tatsächlich lokal sind, ansonsten aber verwirrend und abzulehnen (womit ich mich meines Wissens auf offizieller SAP-Linie befinde).ewx hat geschrieben:Wenn am Anfang eines Reports 50 Zeilen nur Datendeklarationen stehen, ist es nicht das Problem, dass sie am Anfang stehen, sondern, dass sie global sind...
Das ist eine rein ideologische Behauptung. Jede Variable hat eine Bedeutung, also einen semantischen Kontext, wofür sie steht und wofür sie verwendet wird (wobei ich bereit bin, Dir die Ausnahme rein lokaler Hilfsvariablen zuzugestehen. Zum Glück braucht man diese dank der neuen 7.40-Syntax fast gar nicht mehr). Eine gute Variable hat einen sprechenden Namen, der ihre Bedeutung ausdrückt (und bei dem ich schon oft genug gegen die heute nicht mehr zeitgemäße 30-Zeichen-Grenze gelaufen bin).Ralf hat geschrieben:Zudem ist ein Attribut nicht einfach nur eine Varible, sondern eine Variable mit einem semantischen Kontext, die den Zustand des Objektes beschreibt
Das ist ja das Schlimmste daran: In dem Moment, in dem ich ein Attribut auf "private" stelle, fällt auch noch seine Eigenschaft weg, das Objekt von außen sichtbar zu charakterisieren. Dann ist es wirklich nichts anderes mehr als eine globale Variable innerhalb der Klasse.Ralf hat geschrieben:Und schlussendlich kann man die Sichtbarkeit von Attributen auch noch ändern.
Das tue ich auch nicht; das ist extrem ausgedrückt. Ich kann das gegenteilige Extrem dagegensetzen: Man kann globale Variablen ("Attribute") in einer riesigen Klasse, die von vielen Methoden der Klasse nach Gusto verändert werden und wo keiner mehr durchschaut, wo ihre Werte herkommen, nicht vergleichen mit einem kleinen Report, der eine globale interne Tabelle M mit Materialien hat, für die er nacheinander in einer Reihe von Unterprogrammen die Werte aus MARC, MARD usw. zusammensucht, ohne sich die Mühe zu machen, die Tabelle jedesmal als Parameter zu übergeben, und am Ende, wenn die Tabelle komplett gefüllt ist, gibt er sie als ALV aus. Ein solcher Report wäre problemlos nachvollziehbar; die Globalität dieser Tabelle wäre kein praktisches Problem dabei.Ralf hat geschrieben:Insofern kann man globale Variablen in einem Koloss wie MEDRUCK nicht vergleichen mit einer Klasse, die einen eng umrissenen Umfang hat.
Meinst du damit am Anfang einer FORM-Routine / Methode oder als globale Variable bzw. Membervariable?Sebastian82 hat geschrieben:In Abap erlebe ich es aber immer wieder, dass alle Variablen die jemals benötigt werden direkt im Kopf deklariert werden.
Im Java ist dies eher üblich*. Man hat eine Klasse mit PRIVATE-Variablen und hat dazu GETTER und SETTER. Die kann man in Eclipse reicht einfach generieren lassen.DeathAndPain hat geschrieben:Es ist durchaus auch nicht unüblich, Attribute nur per GET/SET-Methode zu setzen bzw. auszulesen. Böse Zungen könnten die zwar mit dem guten alten EXPORT TO MEMORY-Befehl vergleichen,
Oha, lass das nicht Ralf hören, dass Du gleichfalls der Ansicht bist, dass man Funktionsgruppen als (eine einfache Form von) Klassen ansehen kann und ihre globalen Variablen als Attribute. Der reißt Dir dafür den Kopf ab!Wenn man nun die Funktionsgruppe als Klasse betrachtet und die darin enthaltenen FORM-Routinen als Methoden, sind in Funktionsgruppen die globalen Variablen quasi die Membervariablen.
Gegenfrage: Warum deklarierst Du Methoden nicht mitten in irgendeinem Implementierungsteil einer anderen Methode, halt da, wo Du erstere Methode zum ersten Mal aufrufst?Ich deklariere Variable auch manchmal mitten drin. Dann sind aber Kollegen der Meinung, sie müssen dies aufräumen.
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag (Insgesamt 2):
Daniel • black_adept
Quatsch, ich reiße Leuten höchstens den Kopf ab, wenn sie für mich programmieren und dabei Murks machen.DeathAndPain hat geschrieben:Oha, lass das nicht Ralf hören, dass Du gleichfalls der Ansicht bist, dass man Funktionsgruppen als (eine einfache Form von) Klassen ansehen kann und ihre globalen Variablen als Attribute. Der reißt Dir dafür den Kopf ab!Wenn man nun die Funktionsgruppe als Klasse betrachtet und die darin enthaltenen FORM-Routinen als Methoden, sind in Funktionsgruppen die globalen Variablen quasi die Membervariablen.
Bis dahin: Ja.DeathAndPain hat geschrieben:Wenn man man für einen LOOP ein Zielfeldsymbol braucht, das man innerhalb des LOOPs verwendet und sonst nicht mehr, dann ist es gut les- und nachvollziehbar, wenn man das direkt beim LOOP-Befehl per ASSIGNING FIELD-SYMBOL tut.
Ich schätze das nicht besonders, aber wenn man damit sparsamDeathAndPain hat geschrieben:Eine rein lokale Inlinedeklaration mit DATA(), z.B. wenn man rasch mal ein Hilfsfeld braucht, um etwas zu berechnen oder um den Exportparameter eines PERFORM zu versorgen, ist hingegen in Ordnung.
Ja, absolut!DeathAndPain hat geschrieben:Überdies läuft eine Inline-Deklaration per DATA() oft inhaltlich auf ein LIKE LINE OF hinaus, wenn man sich damit eine Workarea zieht. Und ein LIKE LINE OF ist bedeutend verständlicher, wenn es direkt unter der Deklaration der internen Tabelle steht, auf die es sich bezieht.
Folgende Benutzer bedankten sich beim Autor Daniel für den Beitrag:
black_adept