C++ 不變式

2023-03-20 16:50 更新

對于一個復(fù)數(shù)對象,有些條件我們期望是真的。
舉例來說,如果笛卡爾坐標系的標志量被設(shè)置了,那么我們就期望real和imag的值是有效的,類似地,如果極坐標系的標志量被設(shè)置了,我們期望mag和theta也是有效的。最后,如果兩個標志位都設(shè)置了的話,我們希望四個值是一致的,即他們應(yīng)該是以不同的表示方式表示相同的一個復(fù)數(shù)。
這樣的條件即為不變式,由于很顯而易見的原因他們是不變的——他們總是應(yīng)該為真。編寫幾乎沒有bug的高質(zhì)量代碼就是要指出你的類中那些是不變式,并讓改變他們成為不可能。
數(shù)據(jù)封裝的好處之一就是幫助保證不變式。第一部是通過將變量變?yōu)樗接袕亩柚共皇芗s束的訪問。然后更改對象的唯一辦法就是通過訪問函數(shù)和更改器了。如果我們檢查所所有的訪問函數(shù)和更改器并發(fā)現(xiàn)他們都能保證不變式不變,那么我們就可以證明一個不變式是不會被篡改的了。
在Complex 類中,我們列出對變量進行賦值的函數(shù):
第二個構(gòu)造函數(shù)
calculateCartesian
calculatePolar
setCartesian
setPolar
在每一個函數(shù)中,很明顯他們能保持上面提到的不變性。這里我們需要小心一些。注意到我說的是“保持”不變性。這就意味著,如果這個不變式為真,那么當(dāng)這個函數(shù)被調(diào)用后仍然為真。
這樣的定義允許了兩處漏洞。首先在函數(shù)執(zhí)行過程中可能有不變式為假的情況,這是沒關(guān)系的,有些時候是不可避免的。只要不變式在函數(shù)執(zhí)行之后恢復(fù)即可。
另外一處漏洞是如果在函數(shù)執(zhí)行開始時不變式為真我們只需保持該不變性即可。如果開始執(zhí)行時部位真,所有都是徒勞了。如果不變式在某處被更改了,我們能做的一般來說就是檢測到出錯,打印錯誤信息,然后退出。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號