原文地址:http://zevolving.com/2013/03/abap-object-oriented-approach-for-reports-redesign/
By Naimesh Patel | March 27, 2013 | ABAP Objects, OO Design Patterns
在本篇文章中,我将使用ABAP对象向你展示一种更加灵活的设计。该设计用于尽可能的解耦业务逻辑、参数、数据展示。
介绍
如前一篇文章讨论所述(一种用于ABAP面向对象的Report的初始设计,其得到了非常好的反响),我看到很多开发者在试图使用面向对象时遵循了糟糕的设计。由于那样的设计没有利用任何面向对象的特性,我通常将他们成为伪对象设计。
我将向你展示如何用面向对象的设计实现我在前一篇文章中提到的例子。这个方法纯粹基于MVC的设计模式。如果你对MVC还不是很熟悉,我建议你可以阅读我更早的3篇系列文章——可以从《ABAP Objects Design Patterns – Model View Controller (MVC) Part 1》这篇开始。
相关对象
为制作这个简单的报表程序,我将创建三个类:
- SEL-选择参数类
- DATA(Model)-数据选择和处理类(类似于模型类)
- ALV(View)-用于展示数据的类
- 包含所有来自于选择屏幕的参数和选项
- 包含选择屏幕上的自动生成的默认值的方法
- 包含验证选择屏幕数据合法性的方法
- 所有属性将仅在处理START-OF-SELECTION事件时被设置
* Types for the Attributes
TYPES:
tt_MSGNR_Range TYPE RANGE OF t100-MSGNR .
DATA V_ARBGB TYPE T100-ARBGB .
DATA T_MSGNR_RANGE TYPE TT_MSGNR_RANGE .
*
CLASS ZCL_REPORT_T100_SEL IMPLEMENTATION.
METHOD GET_DEFAULT.
" returning value(RV_ARBGB) type T100-ARBGB .
rv_arbgb = '00'.
ENDMETHOD.
*
METHOD validate_message_class.
" importing !IV_ARBGB type T100-ARBGB
" raising ZCX_MSG .
DATA: ls_msg TYPE symsg.
SELECT SINGLE arbgb
INTO v_arbgb
FROM t100
WHERE arbgb = iv_arbgb.
IF sy-subrc NE 0.
ls_msg-msgty ='E'.
ls_msg-msgid ='00'.
ls_msg-msgno = '398'.
ls_msg-msgv1 = 'No Message class found'.
RAISE EXCEPTION TYPE zcx_msg
EXPORTING
msg = ls_msg.
ENDIF.
ENDMETHOD.
ENDCLASS.
DATA类
- 包含用于数据选择的所有方法
- 将使用来自于SEL对象的属性用于数据选择和筛选
- 将包含实例属性。仅仅只有一个需要被暴露给外界的属性被声明为Public,剩下的全部声明为Private。
- 这可以反过来根据需要使用不同的对象
这个类包含两个属性:O_SEL——类型为ZCL_REPORT_T100_SEL,T_T100——类型为TABLE T100,用于存放筛选后的数据。在构造方法中,我们为O_SEL做初始化赋值。GET_DATA方法使用SEL对象的属性筛选数据。
DATA类ZCL_REPORT_T100_DATA的代码行:
CLASS ZCL_REPORT_T100_DATA IMPLEMENTATION.
METHOD CONSTRUCTOR.
" importing !IO_SEL type ref to ZCL_REPORT_T100_SEL .
me->o_Sel = io_sel.
ENDMETHOD.
*
METHOD GET_DATA.
SELECT * FROM t100
INTO TABLE t_t100
WHERE arbgb = me->o_sel->v_arbgb
AND msgnr IN me->o_Sel->T_MSGNR_RANGE.
ENDMETHOD.
ENDCLASS.
ALV类
典型的View类负责向调用者显示数据以及任何处理操作。ALV类:
- 将包含有关ALV处理的逻辑
- 也包含用于处理任何需要事件的事件处理方法
- 将包含一个DATA类的属性。这是一个Public属性,因此外部将可以获取DATA的内容。
CLASS ZCL_REPORT_T100_ALV IMPLEMENTATION.
METHOD CONSTRUCTOR.
" importing !IO_DATA type ref to ZCL_REPORT_T100_DATA .
me->o_Data = io_data.
ENDMETHOD.
*
METHOD GENERATE_ALV.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = me->o_salv
CHANGING
t_table = me->o_data->t_t100.
*
me->o_salv->display( ).
*
CATCH cx_salv_msg .
ENDTRY.
ENDMETHOD.
ENDCLASS.
基于面向对象设计方法的程序
*&---------------------------------------------------------------------*
*& Purpose - Object Oriented Implementation for a Report
*& Author - Naimesh Patel
*& URL - http://zevolving.com/?p=2045
*&---------------------------------------------------------------------*
REPORT ztest_np_t100_OO_report.
*
DATA: v_msgnr TYPE t100-msgnr. " for selection screen
*
DATA: o_data TYPE REF TO zcl_report_t100_data.
DATA: o_sel TYPE REF TO zcl_report_t100_sel.
DATA: o_alv TYPE REF TO zcl_report_t100_alv.
DATA: o_exc TYPE REF TO zcx_msg.
*
SELECTION-SCREEN: BEGIN OF BLOCK blk1 WITH FRAME TITLE text-t01.
PARAMETERS: p_arbgb TYPE t100-arbgb OBLIGATORY.
SELECT-OPTIONS: s_msgno FOR v_msgnr.
SELECTION-SCREEN: END OF BLOCK blk1.
*
INITIALIZATION.
CREATE OBJECT o_sel.
CREATE OBJECT o_data EXPORTING io_sel = o_sel.
CREATE OBJECT o_alv EXPORTING io_data = o_data.
p_arbgb = o_sel->get_default( ).
*
AT SELECTION-SCREEN ON p_arbgb.
TRY.
o_sel->validate_message_class( p_arbgb ).
CATCH zcx_msg INTO o_exc.
MESSAGE ID o_exc->msg-msgid TYPE o_exc->msg-msgty
NUMBER o_exc->msg-msgno
WITH o_exc->msg-msgv1 o_exc->msg-msgv2
o_exc->msg-msgv3 o_exc->msg-msgv4.
ENDTRY.
*
START-OF-SELECTION.
" Set the attributes of the SEL object from the
" Selection screen parameters & Options
o_sel->v_arbgb = p_arbgb.
o_sel->t_msgnr_range = s_msgno[].
*
* Get the data
o_data->get_data( ).
*
* Generate the ALV
o_alv->generate_alv( ).
demo程序的UML
- 由于模型类从主程序中解耦出来,它独立运作。这样使得它能更加方便的扩展并可用于不同的视图中。
- 分离的SEL对象使得不用在方法中与使用选择屏幕参数和选项耦合。这比使用任何选择屏幕更加独立。只要你设置合适的属性,你将能够用DATA类来使用它。
- 分离视图提高了可重用性