看看面向过程和面向对象的方式是如何实现封装的。
面向过程模式的封装
在面向过程模式中有两种变量:
全局变量:他在程序的全部分声明,可以在程序的仍何不分应用。
局部变量:他在某个过程(form of function module)中声明也只能在其中应
用。
全局变量的生命周期取决于整个程序的生命周期,局部变量的生命周期取决
于该过程的生命周期。由于生命周期的限制,局部变量不适合于封装,它是
过程中为了达到某个目的而使用的辅助变量。如果没有使用 TABLES 和
COMMON PARTS 语句那么程序中所声明的全局变量只能被该程序内部的各
个模块调用。那么这就决定了在面向过程的模式中数据的封装只对程序本省
有效。下面是一个简单的如何通过功能池实现对一个银行帐号的封装。
Function-pool Account
DATA: current_account TYPE accounts-amount.
Function deposit.
* IMPORTING REFERENCE(amount) TYPE account-amount
Current_amount = current_amount + amount.
EndFunction.
Function withdraw.
* IMPORTING REFERENCE(amount) TYPE account-amount
* RAISING
* CK_NEGATIVE_AMOUNT
IF current_amount > amount.
Current_amount = current_amount – amount.
ELSE.
RAISE EXCEPTION TYPE CK_NEGATIVE_AMOUNT.
ENDIF.
ENDFUNCTION.
这个模块池封装了银行账户的余额,并且通过功能模块 deposit 和 withdraw 来
处理银行账户的余额。虽然单单是一个银行帐号的话这个模块池工作的非常好,但如果是
多个应行帐号并要实现银行帐号之间交互的功能,问题就出现了。为了实现现实世界中多
个银行帐号的管理,你不得不为每一个银行帐号建一个唯一名字的模块池和功能模块,这
显然是不可取的。下面是个把所有银行帐号封装在一个模块池中的例子:
FUNCTION-POOL accounts.
DATA: account_table TYPE SORTED TABLE OF accounts
WITH UNIQUE KEY id.
ENDFUNCTION.
LOAD-OF-PROGRAM.
SELECT * INTO TABLE account_table
FROM accounts.
FUNCTION deposit.
* IMPORTING