ABAP编程中,函数组与ABAP OO编程的相似性

任何面向对象模型的核心都是对象,它们包含属性(数据)和方法(函数)。 在传统的ABAP开发过程中,ABAP中对象的最接近等价物是函数模块和函数组。在ABAP编程中,函数组(Function Group)和面向对象编程(ABAP OO)都提供了一种封装数据和操作数据的方法,尽管它们的实现方式有所不同。以下是一个案例,展示了如何在ABAP中使用函数组来模拟面向对象编程的一些特性。

案例:简单的计数器函数组

      在传统的ABAP编程中,我们可能会创建一个函数组来实现一个计数器的功能。这个函数组包含一个全局变量(COUNT)和三个函数模块(SET_COUNTER、INCREMENT_COUNTER、GET_COUNTER),用于设置、增加和获取计数器的值。

FUNCTION-POOL COUNTER.
DATA COUNT TYPE I.
FUNCTION SET_COUNTER.
* Local Interface IMPORTING VALUE(SET_VALUE)
 COUNT = SET_VALUE.
ENDFUNCTION.
FUNCTION INCREMENT_COUNTER.
 ADD 1 TO COUNT.
ENDFUNCTION.
FUNCTION GET_COUNTER.
* Local Interface: EXPORTING VALUE(GET_VALUE)
 GET_VALUE = COUNT.
ENDFUNCTION.

    该函数组有一个全局整数字段COUNT,以及三个与之工作的函数模块,SET_COUNTER、INCREMENT_COUNTER和GET_COUNTER。其中两个函数模块具有输入和输出参数。这些构成了功能组的数据接口。

      任何ABAP程序都可以与此功能组一起工作。例如:

REPORT Y_DEMO_TEST_153
DATA NUMBER TYPE I VALUE 5.
CALL FUNCTION 'SET_COUNTER' EXPORTING SET_VALUE = NUMBER.
DO 3 TIMES.
 CALL FUNCTION 'INCREMENT_COUNTER'.
ENDDO.
CALL FUNCTION 'GET_COUNTER' IMPORTING GET_VALUE = NUMBER.

    程序运行后,程序变量NUMBER的值将为8。程序本身无法访问函数组中的COUNT字段。对该字段的操作完全封装在函数模块中。程序只能通过调用其函数模块与函数组通信。

      在这个案例中,函数组的全局变量COUNT类似于面向对象编程中的类属性,而函数模块则类似于类的方法。这些函数模块提供了与COUNT变量交互的接口,允许外部程序通过这些接口来操作COUNT变量,而不需要直接访问它。

函数组与面向对象编程的相似性:

  1. 封装:函数组通过函数模块封装了对COUNT变量的操作,这与面向对象编程中的封装原则相似,即隐藏内部实现细节,只暴露必要的接口。

  2. 方法:函数组中的函数模块类似于面向对象编程中的对象方法,它们提供了对对象(在这种情况下是COUNT变量)进行操作的途径。

  3. 数据隐藏:函数组不允许外部程序直接访问COUNT变量,这与面向对象编程中的私有属性(private attributes)概念相似,确保了数据的安全性和一致性。

  4. 接口:函数组通过函数模块提供了一个明确的接口,外部程序必须通过这些接口来与函数组交互,这与面向对象编程中的公共方法(public methods)相似。

      尽管函数组在一定程度上模拟了面向对象编程的一些特性,但它们并不完全等同于面向对象编程。在ABAP OO编程中,我们可以创建类(Class),这些类可以包含属性(Attributes)和方法(Methods),并且可以支持继承(Inheritance)、多态(Polymorphism)等更高级的面向对象特性。例如,可以创建一个计数器类,它包含一个私有的计数器属性和一个公共的方法来增加计数器的值,这样就可以创建多个计数器对象,每个对象都有自己的计数器实例。

       作为比较,以下程序示例使用ABAP对象编程来实现一个计数器,达到与上述使用函数的相同功能。


REPORT Y_XF_TEST_153.
CLASS counter DEFINITION.
 PUBLIC SECTION.
 METHODS: set IMPORTING value(set_value) TYPE i,
 increment,
 get EXPORTING value(get_value) TYPE i.
 PROTECTED SECTION.
 DATA count TYPE i.
ENDCLASS.
CLASS counter IMPLEMENTATION.
 METHOD set.
 count = set_value.
 ENDMETHOD.
 METHOD increment.
 ADD 1 TO count.
 ENDMETHOD.
 METHOD get.
     get_value = count.
     write :/1 get_value .
 ENDMETHOD.
ENDCLASS.

DATA: count TYPE REF TO counter,
      number TYPE i VALUE 5 .

START-OF-SELECTION.
  CREATE OBJECT count TYPE counter.
  CALL METHOD count->set EXPORTING set_value = number.
  DO 3 TIMES.
     CALL METHOD count->increment.
  ENDDO.
  CALL METHOD count->get.

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ᝰ随心ꦿེএ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值