
302
|
第 9 章
因此只能得到大致的具體答案。在這種情況,抽象結果
Sign::NEGATIVE
告訴我們,任何
如
-1
、
-2
、
-3
等具體的數值都可能是
6 * -9
的答案,但它的答案一定不是
0
或任何像
是
1
或
500
的正數。
請注意,因為 Ruby 的值是物件(以它們搭載其運算的資料結構),因此根據我們提供
用作引數的是具體(
Fixnum
)還是抽象(
Sign
)物件,我們可以使用相同的 Ruby 運算
式來執行具體或抽象的計算。這是以特定方式相乘 3 個數值的
#calculate
方法:
def calculate(x, y, z)
(x * y) * (x * z)
end
如果我們以
Fixnum
物件呼叫
#calculate
,這樣的計算將由
Fixnum#*
完成,而且我們會
得到具體的
Fixnum
結果。如果我們改以
Sign
實體呼叫它,就會使用
Sign#*
運算,並且
產生
Sign
結果。
>> calculate(3, -5, 0)
=> 0
>> calculate(Sign::POSITIVE, Sign::NEGATIVE, Sign::ZERO)
=> #<Sign zero>
只要藉著將具體引數換成它們的抽象對應物,並且不需修改即可執行剩餘的程式碼,就
可讓我們有少許的機會在真正的 Ruby 程式裡執行抽象解譯。
這種技術讓人聯想到用在自動化單元測試的
測試替身
(
test double
,例如
虛設
常式
[
stub
] 和
替身
[
mock
])。測試替身是將特定的替代物件注入程
式碼,以此作為控制和驗證其行為的方式。使用更逼真的物件作為測試資 ...