Belajar ABAP Part 10: OOP Concepts in ABAP (Class, Inheritance, Polymorphism, Exception, Design Pattern)
Belajar ABAP Part 10: OOP Concepts in ABAP
1. Pengenalan OOP di ABAP
ABAP mendukung OOP sejak SAP Basis 4.6C. Dengan paradigma ini, developer dapat membuat kode yang lebih terstruktur, reusable, dan maintainable. Konsep utama OOP di ABAP meliputi encapsulation, inheritance, polymorphism, dan abstraction.
2. Class & Object
Class adalah blueprint, sedangkan object adalah instance dari class tersebut. Public method dapat dipanggil dari luar, sementara private hanya bisa diakses dari dalam class.
CLASS zcl_hello DEFINITION.
PUBLIC SECTION.
METHODS: say_hello.
ENDCLASS.
CLASS zcl_hello IMPLEMENTATION.
METHOD say_hello.
WRITE: / 'Hello ABAP OOP!'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_hello) = NEW zcl_hello( ).
lo_hello->say_hello( ).
3. Inheritance
Inheritance memungkinkan sebuah class untuk mewarisi properti dan method dari class lain. Jika method di class parent tidak sesuai, kita bisa melakukan REDEFINITION di child class.
CLASS zcl_animal DEFINITION.
PUBLIC SECTION.
METHODS: speak.
ENDCLASS.
CLASS zcl_animal IMPLEMENTATION.
METHOD speak.
WRITE: / 'Animal sound'.
ENDMETHOD.
ENDCLASS.
CLASS zcl_dog DEFINITION INHERITING FROM zcl_animal.
PUBLIC SECTION.
METHODS: speak REDEFINITION.
ENDCLASS.
CLASS zcl_dog IMPLEMENTATION.
METHOD speak.
WRITE: / 'Woof! Woof!'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_pet) = NEW zcl_dog( ).
lo_pet->speak( ).
4. Polymorphism
Polymorphism memungkinkan object yang berbeda memberikan respon berbeda terhadap method yang sama.
Dengan cara ini, kode lebih fleksibel tanpa perlu banyak IF/CASE
.
CLASS zcl_cat DEFINITION INHERITING FROM zcl_animal.
PUBLIC SECTION.
METHODS: speak REDEFINITION.
ENDCLASS.
CLASS zcl_cat IMPLEMENTATION.
METHOD speak.
WRITE: / 'Meow!'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_animal) TYPE REF TO zcl_animal.
lo_animal = NEW zcl_dog( ).
lo_animal->speak( ). "Output: Woof!
lo_animal = NEW zcl_cat( ).
lo_animal->speak( ). "Output: Meow!
5. Exception Class
Untuk menangani error, ABAP menyediakan exception class. Dengan cara ini, error dapat ditangani lebih terstruktur dibandingkan sekadar IF condition.
CLASS zcx_invalid_input DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
CLASS zcl_calc DEFINITION.
PUBLIC SECTION.
METHODS divide IMPORTING iv_a TYPE i iv_b TYPE i
RETURNING VALUE(rv_res) TYPE f
RAISING zcx_invalid_input.
ENDCLASS.
CLASS zcl_calc IMPLEMENTATION.
METHOD divide.
IF iv_b = 0.
RAISE EXCEPTION TYPE zcx_invalid_input.
ENDIF.
rv_res = iv_a / iv_b.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
TRY.
DATA(lo_calc) = NEW zcl_calc( ).
WRITE: / lo_calc->divide( 10, 0 ).
CATCH zcx_invalid_input.
WRITE: / 'Error: Division by zero!'.
ENDTRY.
6. Real Case: Sales Order Object
Implementasi nyata: membuat object untuk Sales Order. Data disimpan dalam atribut private dan hanya diakses via method.
CLASS zcl_sales_order DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING iv_so TYPE vbeln,
display,
get_total RETURNING VALUE(rv_total) TYPE netwr.
PRIVATE SECTION.
DATA: gv_so TYPE vbeln,
gv_total TYPE netwr.
ENDCLASS.
CLASS zcl_sales_order IMPLEMENTATION.
METHOD constructor.
gv_so = iv_so.
" Simulasi fetch SO dari DB
gv_total = 10000.
ENDMETHOD.
METHOD display.
WRITE: / 'SO:', gv_so, 'Total:', gv_total.
ENDMETHOD.
METHOD get_total.
rv_total = gv_total.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_so) = NEW zcl_sales_order( '4500001234' ).
lo_so->display( ).
7. Design Pattern: Factory
Factory Pattern memisahkan logika pembuatan object. Caller cukup meminta object berdasarkan tipe, tanpa tahu implementasi detailnya.
INTERFACE if_payment_method.
METHODS pay IMPORTING iv_amount TYPE i.
ENDINTERFACE.
CLASS zcl_payment_cash DEFINITION.
PUBLIC SECTION.
INTERFACES if_payment_method.
ENDCLASS.
CLASS zcl_payment_cash IMPLEMENTATION.
METHOD if_payment_method~pay.
WRITE: / 'Paid in CASH:', iv_amount.
ENDMETHOD.
ENDCLASS.
CLASS zcl_payment_card DEFINITION.
PUBLIC SECTION.
INTERFACES if_payment_method.
ENDCLASS.
CLASS zcl_payment_card IMPLEMENTATION.
METHOD if_payment_method~pay.
WRITE: / 'Paid with CARD:', iv_amount.
ENDMETHOD.
ENDCLASS.
CLASS zcl_payment_factory DEFINITION.
PUBLIC SECTION.
CLASS-METHODS get_payment
IMPORTING iv_type TYPE string
RETURNING VALUE(ro_pay) TYPE REF TO if_payment_method.
ENDCLASS.
CLASS zcl_payment_factory IMPLEMENTATION.
METHOD get_payment.
CASE iv_type.
WHEN 'CASH'. CREATE OBJECT ro_pay TYPE zcl_payment_cash.
WHEN 'CARD'. CREATE OBJECT ro_pay TYPE zcl_payment_card.
WHEN OTHERS. ro_pay = NULL.
ENDCASE.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_pay) = zcl_payment_factory=>get_payment( 'CARD' ).
IF lo_pay IS BOUND.
lo_pay->pay( 500000 ).
ENDIF.
8. Design Pattern: Strategy
Strategy Pattern memungkinkan algoritma dipilih secara fleksibel di runtime. Contoh: perhitungan diskon bisa berbeda untuk pelanggan biasa vs VIP.
INTERFACE if_discount_strategy.
METHODS calc_discount IMPORTING iv_amount TYPE p DECIMALS 2
RETURNING VALUE(rv_disc) TYPE p DECIMALS 2.
ENDINTERFACE.
CLASS zcl_disc_normal DEFINITION.
PUBLIC SECTION.
INTERFACES if_discount_strategy.
ENDCLASS.
CLASS zcl_disc_normal IMPLEMENTATION.
METHOD if_discount_strategy~calc_discount.
rv_disc = iv_amount * 0.05.
ENDMETHOD.
ENDCLASS.
CLASS zcl_disc_vip DEFINITION.
PUBLIC SECTION.
INTERFACES if_discount_strategy.
ENDCLASS.
CLASS zcl_disc_vip IMPLEMENTATION.
METHOD if_discount_strategy~calc_discount.
rv_disc = iv_amount * 0.15.
ENDMETHOD.
ENDCLASS.
CLASS zcl_discount_context DEFINITION.
PUBLIC SECTION.
METHODS: constructor IMPORTING io_strat TYPE REF TO if_discount_strategy,
get_discount IMPORTING iv_amount TYPE p DECIMALS 2
RETURNING VALUE(rv_disc) TYPE p DECIMALS 2.
PRIVATE SECTION.
DATA: mo_strategy TYPE REF TO if_discount_strategy.
ENDCLASS.
CLASS zcl_discount_context IMPLEMENTATION.
METHOD constructor.
mo_strategy = io_strat.
ENDMETHOD.
METHOD get_discount.
rv_disc = mo_strategy->calc_discount( iv_amount ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA(lo_vip) = NEW zcl_discount_context( NEW zcl_disc_vip( ) ).
WRITE: / 'VIP disc for 1,000,000 =', lo_vip->get_discount( 1000000 ).
DATA(lo_norm) = NEW zcl_discount_context( NEW zcl_disc_normal( ) ).
WRITE: / 'Normal disc for 1,000,000 =', lo_norm->get_discount( 1000000 ).
9. Kesimpulan
OOP di ABAP memberi struktur kuat untuk development modern. Dengan class, inheritance, polymorphism, dan exception handling, program menjadi lebih terstruktur. Ditambah lagi dengan design pattern seperti Factory dan Strategy, kita bisa membangun sistem yang lebih fleksibel, scalable, dan maintainable.
Comments
Post a Comment