Funktionale Methode vs Exception Handling

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Funktionale Methode vs Exception Handling

Postby Maja967 » Mon Mar 07, 2011 3:45 pm

Hallo,

ich würde gerne Funktionale Methoden entwerfen um mir und meinen Kollegen das Leben einfacher zu machen.

BSP: Methode holt aus einer Internen Tabelle eines Statsichen Attributes einen Satz und liefert diesen
and den Aufrufer zurück:

Variante A:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  CALL METHOD bla2->GET_SATZ
  2.    EXPORTING
  3.      I_SHERKU  = va_sherku
  4.      I_BUKRS   = va_bukrs
  5.    RECEIVING
  6.      E_SATZ    =  ab_satz
  7.    EXCEPTIONS
  8.      NOT_FOUND = 1
  9.      others    = 2
  10.          .
  11.  IF SY-SUBRC <> 0.
  12. *  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
  13. *             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
GeSHi ©


und Variante B:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1.  try.
  2.    ab_satz = bla2->get_satz&#40; i_sherku = va_sherku i_bukrs = va_bukrs &#41;.
  3.  
  4. *   CATCH ??????
  5.  
GeSHi ©


ich würde Variante b) präferieren, da diese den gesamten Quellcode nicht so auseinander reißt ... jedoch habe ich keine Ahnung wie ich das Exception Handling lösen könnte .... ich vermute das wird dann genauso wie bei A ?
Maja967
...
...
 
Posts: 229
Joined: Tue Nov 29, 2005 2:44 pm

Postby Bianka4768 » Mon Mar 07, 2011 7:50 pm

Hallo cut1,
nachfolgend ein kleines Testprogramm (sinn- und funktionslos, aber möglichst deine Benennungen aufgegriffen):
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. REPORT  zrt_test.
  2. *
  3.   sherku TYPE kokrs.
  4. *
  5.   PERFORM s_o_s.
  6. *---Error classes
  7. CLASS cx_not_found DEFINITION
  8.   INHERITING FROM cx_static_check FINAL.
  9. ENDCLASS.                    "cx_not_found  DEFINITIO
  10. *
  11. CLASS cx_others DEFINITION
  12.   INHERITING FROM cx_static_check FINAL.
  13. ENDCLASS.                    "cx_others  DEFINITIO
  14. *
  15. CLASS test DEFINITION.
  16.   PUBLIC SECTION.
  17.     METHODS:
  18.       get_satz
  19.         IMPORTING
  20.           i_sherku TYPE sherku
  21.           i_bukrs TYPE bukrs
  22.         RETURNING
  23.           value&#40;e_satz&#41; TYPE i
  24.         RAISING
  25.           cx_not_found
  26.           cx_others.
  27. ENDCLASS.                    "test DEFINITION
  28. *
  29. CLASS test IMPLEMENTATION.
  30.   METHOD get_satz.
  31.     IF i_sherku = i_bukrs.
  32.       RAISE EXCEPTION TYPE cx_others.
  33.     ELSEIF i_sherku CN '1234567890' OR i_bukrs CN '1234567890'.
  34.       RAISE EXCEPTION TYPE cx_not_found.
  35.     ELSE.
  36.       e_satz = &#40; i_sherku + i_bukrs &#41; / 3.
  37.     ENDIF.
  38.   ENDMETHOD.                    "get_satz
  39. ENDCLASS.                    "test IMPLEMENTATION
  40. *
  41. FORM s_o_s.
  42.   PERFORM do_it USING '1234' '1234'. "exception cx_others
  43.   SKIP 1.
  44.   PERFORM do_it USING 'abcd' '1234'. "exception cx_not_found
  45.   SKIP 1.
  46.   PERFORM do_it USING '0007' '0013'. "ohne exception
  47. ENDFORM.                    "s_o_s
  48. *
  49. FORM do_it USING va_sherku TYPE sherku
  50.                  va_bukrs TYPE bukrs.
  51.   DATA:
  52.     ab_satz TYPE i,
  53.     bla2 TYPE REF TO test.
  54.  
  55.   CREATE OBJECT bla2.
  56.   TRY.
  57.       ab_satz = bla2->get_satz&#40;
  58.         i_sherku = va_sherku i_bukrs = va_bukrs &#41;.
  59.       WRITE:
  60.         / 'Ergebnis:',ab_satz.
  61.     CATCH cx_not_found.
  62.       WRITE:
  63.         / 'Not found', va_sherku, va_bukrs.
  64.     CATCH cx_others.
  65.       WRITE:
  66.         / 'others'.
  67.   ENDTRY.
  68. ENDFORM.                    "do_it
  69.  
GeSHi ©


MfG

Thomas R.
Bianka4768
....
....
 
Posts: 567
Joined: Tue Dec 10, 2002 5:46 pm

Postby Maja967 » Tue Mar 08, 2011 10:31 am

Hi Thomas,

erstmal danke für deinen Quellcode -> das ist ja ein Service !!!

In der Hilfe gibt noch folgenden hinweis:
Wenn eine funktionale Methode in einer Operandenposition verwendet wird, können klassenbasierte Ausnahmen, die aus der Methode propagiert werden, wie üblich in einer TRY-Kontrollstruktur behandelt bzw. weiter propagiert werden. Die nicht-klassenbasierten Ausnahmen einer funktionalen Methode können dagegen an Operandenpositionen nicht behandelt werden und führen immer zu einem Laufzeitfehler.


-> Aus meiner Sicht handle ich uns die folgenden Nachteile ein, wenn ich auf Variante b) setze:

- Der Quellcode wird wie bei a) auch auseinander gerissen. also kein Gewinn
bei der Übersichtlichkeit
- der Verwender der Methode muß wissen das es eine Klassenbassierte
ausnahme gibt bzw welche Ausnahmen es gibt. (bei a) sieht er gleich welche Ausnahmen er abfangen kann ...

hmm mir fällt gerade kein Vorteil ein ... hast Du vielleicht noch `ne Idee ?
thx
Maja967
...
...
 
Posts: 229
Joined: Tue Nov 29, 2005 2:44 pm

Postby Bianka4768 » Tue Mar 08, 2011 10:59 am

Hallo cut1,
über Vor- und Nachteile kann man unterschiedlicher Meinung sein, dass kommt auf die Sichtweise an.
Da musst Du einfach zu einem Schluss für Dich kommen. Ich persönlich benutze bei Klassen, die ich implementiere auch klassenbasierte Ausnahmen.

MfG
Thomas R.
Bianka4768
....
....
 
Posts: 567
Joined: Tue Dec 10, 2002 5:46 pm

Postby Valentin1455 » Wed Mar 09, 2011 6:22 pm

Ich verstehe das mit dem außeinanderreisen Nachteil nicht, durch try catch habe ich ja die Möglichkeit den catch Block am Ende des Codes zu schreiben und dort alle Exceptions zu behandeln. Der Vollständigkeit gibt es auch noch Variante c) die aber vermutlich mit a) gleichzusetzen ist nur eine Einsparung von CALL METHOD:
Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. bla2->get_satz&#40; EXPORTING  i_sherku = va_sherku i_bukrs = va_bukrs
  2.                                      RECEIVING re_satz = ab_satz
  3.                                      EXCEPTIONS not_found = 1 others = 2 &#41;.
  4.             case sy-subrc.
  5.                    when 1...
  6.  
GeSHi ©


Ich sehe auch eher Vorteile bei Variante b) und der Verwendung von Klassenbasierten Exceptions da nur durch Klassenbasierte Exceptions ein einfacheres Exception Handling nötig ist (gerade Durchschleußen von Exceptions, Eindeutige Exception behandlung am Ende einer Methode,...).
Persönlich nutze ich Variante b), c) wenn es Methoden mit alten Exceptions sind die ich nicht refaktoren möchte bzw. kann und Variante a) versuch ich zu vermeiden. Aber das ist natürlich eine persönliche Meinung.

Gruß,
Flo
Valentin1455
...
...
 
Posts: 178
Joined: Fri Apr 30, 2004 11:26 am


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 21 guests