Da zeige ich dir in unserem System auf die Schnell 5077 Negativbeispiele:ralf.wenzel hat geschrieben: Für den Constructor gilt, was für alle Methoden gilt: Viele Parameter deuten darauf hin, dass in der Methode prozedural programmiert wurde. Komplexe Daten übergibt man am Besten als komplexe Struktur oder gleich als Objekt, weil sich die Schnittstelle nicht (oder automatisch mit-)ändert, wenn sich die übergebenen Parameter ändern. Es muss sich für einen Parameter nur die Konsistenzprüfung ändern, schon muss muss man ganzen Konstruktor neu testen. Außerdem führen viele Parameter bei jeder Methode zu vielen Testläufen, weil (wenn man es ordentlich macht) jedes Testtupel von mindestens einem Testlauf getroffen wird.
Code: Alles auswählen.
zcl_dbc=>require(
that = 'DATE is given, TIME is given or DATE and TIME are given'
which_is_true_if = boolc( ( date is initial and time is not initial )
or ( date is not initial and time is initial )
or ( date is not initial and time is not initial ) ) ).
Code: Alles auswählen.
IF myObject IS INITIAL. o_object = new #( container_name = 'CC_HUGO' ). ENDIF.
Code: Alles auswählen.
IF i_datum(4) > 3000. RAISE wrong_year.
IF i_datum+4(2) = '00' or i_datum+4(2) > 12. RAISE wrong_month.
IF i_datum+6(2) = '00' or i_datum+6(2) > 31. RAISE wrong_day.
Wofür soll jetzt die Extramethode gut sein bzw. was macht die anders als der Konstruktor?ewx hat geschrieben:Wo ich regelmäßig stolpere ist, wenn ich ein GUI-Control baue, dass ich für den Aufrufer möglichst einfach aufrufbar machen möchte.
Einfach heißt in dem Fall, dass der Aufrufer den Namen eines Custom-Containers oder eine Containerinstanz übergeben kann.
1.: bekommt der CONSTRUCTOR diese beiden Parameter mit?
2.: oder mache ich eine extra Methode DISPLAY?
Wie ich schon erwähnt hab ist der einzig wirkliche Vorteil, dass die "Redefinierbarkeit" voll gegeben ist.black_adept hat geschrieben:Wofür soll jetzt die Extramethode gut sein bzw. was macht die anders als der Konstruktor?
a-dead-trousers hat geschrieben:Wie ich schon erwähnt hab ist der einzig wirkliche Vorteil, dass die "Redefinierbarkeit" voll gegeben ist.
Mit dem Nachteil, dass man eben eine eigene Methode dafür (ver-)braucht.
Und genau sowas gehört in meinen Augen in die IF-Implementierung rein, die sicherstellt, dass ich der Methode nur gültige Datumsangaben übermittle. Die empfangende Methode sollte das nicht erst noch verproben müssen (um dann Ausnahmen zu werfen, wenn die Angaben ungültig sind). Der Vorteil bei Objekten ist halt: Sie können sich schön auf Konsistenz selbst prüfen und was immer das Objekt rausgibt, ist konsistent. Das ist ein Beispiel für "datenspezifische Logik". Einer Methode potentiell ungültige Daten vor die Füße zu werfen, finde ich schon deshalb doof, weil dann die Methode einen Fehler wirft, die gar nicht fehlerhaft ist, sondern deren Arbeitsvoraussetzungen. Den Fehler sucht man dann im Aufrufer, den man erstmal suchen muss.ewx hat geschrieben:Ein großes Problem bei Parametern ist m.E. häufig, dass gar nicht genau definiert ist, wann wie welche Parameter mit welchen Werten gefüllt sein müssen oder dürfen.
Wenn ich bei der Timestamp-Methode bleibe, dann möchte ich evtl. prüfen, ob die übergebenen Daten auch wirklich ein Datum oder eine Uhrzeit sind:Code: Alles auswählen.
IF i_datum(4) > 3000. RAISE wrong_year. IF i_datum+4(2) = '00' or i_datum+4(2) > 12. RAISE wrong_month. IF i_datum+6(2) = '00' or i_datum+6(2) > 31. RAISE wrong_day.
Davon solltest du dich lösen. Eine Ausnahmebehandlung ist (ganz grob gesagt) für alle Fälle sinnvoll, wo auch ein "if sy-subrc ne 0" sinnvoll ist. Das muss nicht in einer Fehlermeldung enden, sondern kann durchaus ein alternatives operatives Coding sein.a-dead-trousers hat geschrieben:Natürlich kann man darüber jetzt streiten, ob man das alles nicht doch besser mit Exception-Klassen löst oder nicht. Ich bin da je nach Anwendungsumfang recht flexibel. Mal machen echte Exceptions mehr Sinn und ein anderes Mal doch die "Statusauskunft". Vielleicht sehe ich das auch deswegen nicht so eng, weil Exceptions für mich immer irgendwie den Touch haben "hier ist Endstation und nichts geht mehr"
Sie macht nichts anders, sondern nur "separat".black_adept hat geschrieben:Wofür soll jetzt die Extramethode gut sein bzw. was macht die anders als der Konstruktor?ewx hat geschrieben:Wo ich regelmäßig stolpere ist, wenn ich ein GUI-Control baue, dass ich für den Aufrufer möglichst einfach aufrufbar machen möchte.
Einfach heißt in dem Fall, dass der Aufrufer den Namen eines Custom-Containers oder eine Containerinstanz übergeben kann.
1.: bekommt der CONSTRUCTOR diese beiden Parameter mit?
2.: oder mache ich eine extra Methode DISPLAY?
puh. Das ist aber schon einigermaßen dirty...black_adept hat geschrieben: Davon abgesehen - wenn du es wirklich einfach halten willst nimm einen Parameter - dafür vom Typ "ANY" und schreib in die Beschreibung rein was erwartet wird. Im Coding kannst du dann je nach übergebenem Typ ( Referenz oder C-Feld ) intern unterscheiden. Nachteil ist halt die dadurch auf die Runtime verschobene Typprüfung - Vorteil die einfache Bedienbarkeit. Manchmal muss man halt entscheiden was man für wichtiger hält.
ewx hat geschrieben:puh. Das ist aber schon einigermaßen dirty...
Schau dir mal in ABAP2XLSX die Methoden an, die irgendwie mit Spalten zu tun haben. Einerseits kann man die Spalten nummerisch, andererseits in der Excel-üblichen Schreibweise "A-Z,AA-ZZ, AAA..." angeben. Nahezu alle Methoden, die irgendwo eine Spalte erwarten sind so nett dem Aufrufer sowohl das eine als auch das andere zu erlauben, je nachdem was gerade beim Aufrufer zur Verfügung steht.ralf.wenzel hat geschrieben:Das ist nicht nur dirty, sondern der Aufrufer wird kaum verstehen, was er mitgeben muss. Also muss er die Methode lesen und das ist eigentlich gegen das Konzept.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 2):
ralf.wenzel • a-dead-trousers
Ja, die Methode hab ich auch.black_adept hat geschrieben:Beispiel ist eine Utilitymethode, die mir einen Feldkatalog zurückliefert. Und ob ich nun eine Tabelle, eine Struktur, eine Referenz auf eine Tabelle oder Struktur übergebe. Die Methode gibt mir immer schön einen Feldkatalog zurück.