ABAP OO的八大理由(四)
OO編程優(yōu)于過程編程的五個原因
下面的部分里我們將著重論述OO編程的主要優(yōu)點,盡管這里所提到的優(yōu)點與其他的OO語言(JAVA C++)沒有什么太大的區(qū)別,我們這里著重在ABAP OO與傳統(tǒng)的ABAP程序相比而體現(xiàn)處來的優(yōu)點。我們將通過實現(xiàn)一個銀行賬戶管理的簡單例子來比較兩種模式的差別。
原因一:數(shù)據(jù)封裝
將數(shù)據(jù)和程序封裝在一個組件中將使程序變得容易修改。不要把一個應(yīng)用的所有的數(shù)據(jù)和功能放在同各超長的程序里,你只需要把你的應(yīng)用通過組件的穩(wěn)定的接口把需要的部分包進來即可。如果一個封裝的組件有一個好的接口,而這些接口的設(shè)計比較完善的話,那么這些接口的內(nèi)部結(jié)構(gòu)就會被很好的隱蔽起來,對這個部件的內(nèi)部的修改便不會影響到應(yīng)用的其他部件。讓我們來看看面向過程和面向?qū)ο蟮姆绞绞侨绾螌崿F(xiàn)封裝的。
面向過程模式的封裝
在面向過程模式中有兩種變量:
全局變量:他在程序的全部分聲明,可以在程序的仍何不分應(yīng)用。
局部變量:他在某個過程(form of function module)中聲明也只能在其中應(yīng)用。
全局變量的生命周期取決于整個程序的生命周期,局部變量的生命周期取決于該過程的生命周期。由于生命周期的限制,局部變量不適合于封裝,它是過程中為了達到某個目的而使用的輔助變量。如果沒有使用TABLES和COMMON PARTS語句那么程序中所聲明的全局變量只能被該程序內(nèi)部的各個模塊調(diào)用。那么這就決定了在面向過程的模式中數(shù)據(jù)的封裝只對程序本省有效。下面是一個簡單的如何通過功能池實現(xiàn)對一個銀行帳號的封裝。
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來處理銀行賬戶的余額。雖然單單是一個銀行帳號的話這個模塊池工作的非常好,但如果是多個應(yīng)行帳號并要實現(xiàn)銀行帳號之間交互的功能,問題就出現(xiàn)了。為了實現(xiàn)現(xiàn)實世界中多個銀行帳號的管理,你不得不為每一個銀行帳號建一個唯一名字的模塊池和功能模塊,這顯然是不可取的。下面是個把所有銀行帳號封裝在一個模塊池中的例子:
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
*??? REFERENCE(id) TYPE accounts-id
*??? REFERENCE(amount) TYPE accounts-amount
DATA: account_wa TYPE accounts.
READ TABLE account_tabe
INTO account_wa
WITH TABLE KEY id = id.
Account_wa-amount = account_wa-amount + amount.
MODIFY account_table FROM account_wa.
ENDFUNCTION.
FUNCTION withdraw.
* IMPORTING
*??? REFERENCE(id) TYPE accounts-id
*??? REFERENCE(amount) TYPE accounts-amount
* RAISE
* CX_NEGATIVE_AMOUNT
DATA: account_wa TYPE accounts.
READ TABLE account_table
INTO account_wa
WITH TABLE KEY id = id.
IF account-amount > amount.
Account-amount = account-amount – amount.
MODIFY account_table FROM account_wa.
ELSE.
RAISE EXCEPTION TYPE CX_NEGATIVE_AMOUNT.
ENDIF.
ENDFUNCTION.
FUNCTION transfer.
* IMPORTING
*??? REFERENCE(id_from) TYPE accounts-id
*??? REFERENCE(id_to) TYPE accounts-id
*??? REFERENCE(amount) TYPE accounts-amount
* RAISE
* CX_NEGATIVE_AMOUNT
??? CALL FUNCTION ‘withdraw’
?????? EXPORTING id = id
?????????????????? Amount = amount.
??? CALL FUNCTION ‘deposit’
?????? EXPORTING id = id
?????????????????? Amount = amount.
ENDFUNCTION.
這樣多個銀行帳號就被封裝在內(nèi)表account_tab中,每個銀行帳號是通過關(guān)鍵字ID來區(qū)分的。內(nèi)表account_tab在模塊池被調(diào)用時被填充以便模塊池中的所有功能模塊都可以使用它。功能模塊deposit和withdraw通過id來處理一個銀行帳號,而新的功能模塊transer來實現(xiàn)兩個銀行帳號之間的轉(zhuǎn)賬。這樣我們通過一定的技巧實現(xiàn)了多個銀行帳號的管理但是為了區(qū)別每個銀行帳號卻增加了每個功能模塊接口參數(shù)的復(fù)雜性。
轉(zhuǎn)載于:https://www.cnblogs.com/andyfurong/archive/2011/01/05/1926407.html
總結(jié)
以上是生活随笔為你收集整理的ABAP OO的八大理由(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表的增删改查
- 下一篇: Singleton