目前工作当中使用的编程语言是SAP平台的ABPA语言,出于好奇心,我想把之前用JAVA(用C++也写过,事实上,我每学一个新的语言,就会尝试去实现这个小程序)写过的计算一个正整数的因子的程序用ABAP写出来。JAVA的版本如下:
import java.util.ArrayList; public class GetNumberFactors { private static int origin_n; private static ArrayList result_list = new ArrayList(); public static ArrayList get_factor(int n, int x){ origin_n = n; judge(n, x); return result_list; } public static ArrayList get_factor(int n){ return get_factor(n, 2); } public static void judge(int n, int x){ if (n % x == 0){ result_list.add(x); n = n / x; judge(n, x); }else { if (x < n){ x = x + 1; judge(n, x); } } } }
这个小程序用的编程要素主要有三个:面向对象、动态数组、递归。只要是有这三个要素的编程语言应该都能实现这个小程序。ABAP作为在SAP平台上用来编写报表查询程序或者和用户交互的数据库程序的一种语言,业务当中是绝对不会遇到需要编写类似上面这样的程序的情况的。大概也是因为这个原因,ABAP一直听低调的,基本看不到有人用ABAP编写一些有趣的东西的。由于我是财务人出身,半路开始学习编程语言,所以好奇心有些过剩,因此,就冒出了用ABAP编写上面这样的程序的想法。代码如下:
class ZM_GET_NUMBER_FACTORS definition public abstract final. "一个虚的final类,也不能实例化,也不能继承 public section. class-methods GET_FACTOR "公用类方法 importing "参数 value(N) type I value(X) type I default returning "返回值 value(RETURN_RESULT) type /BA1/F4_TAB_INT_NUMBERS . protected section. private section. . "用来把原始的n存下来,目前没用什么用 class-data RESULT_LIST type /BA1/F4_TAB_INT_NUMBERS . "用来接受结果 "/BA1/F4_TAB_INT_NUMBERS是sap内部定义好的一个内表,可以作为I型array,也可以自定义一个 class-methods JUDGE "私用方法,用来做递归计算 importing value(N) type I value(X) type I . ENDCLASS. CLASS ZM_GET_NUMBER_FACTORS IMPLEMENTATION. METHOD get_factor. origin_n = n. . return_result = result_list. ENDMETHOD. METHOD judge. DATA result_list_line LIKE LINE OF result_list. . MOVE x TO result_list_line. APPEND result_list_line TO result_list. n = n / x. CALL METHOD judge EXPORTING n = n x = x. else. IF x le n. add to x. CALL METHOD judge EXPORTING n = n x = x. ENDIF. ENDIF. ENDMETHOD. ENDCLASS.
ABAP写出来看上去要长好多,一个原因是因为ABAP有类定义和类实现两个部分,并且语法类似VB,所以写出来比较多,但实际上,上面的代码没有比JAVA麻烦。可以看到,ABAP原理也可以递归的呢,真是个好语言。不过能用在什么实际场合呢?
调用上面的ABAP类很简单,甚至比JAVA还用简单:
) INTO data(get_result). "1000里的因子,应该有三个2和三个5. WRITE / get_result. ENDLOOP.