2011-07-18 86 views
0

很簡單,當設計一個新班級時,我該如何弄清楚不變量應該是什麼?什麼定義了不變量?我聽說它與有效性有關,但這仍然不明確。是什麼讓一個給定的實例有效或無效是有爭議的。如何確定不變量是什麼?

我應該用我的「直覺」去感受嗎?是否有指導方法來確定不變量是什麼?

+0

我不認爲有一個* *不變量 - 根據您設計的方式需要保持一致:這些是不變量。 – Owen

回答

2

不變可以始終表示爲謂詞,參數是類的一些或全部狀態變量(字段)。一個類可以有更多的一個不變量。例如,假設您有一個Account類,它具有initialBalance,listOfTransactions,currentBalance。此外,我們將交易保存在排序的(按日期)列表中。對於這個類有一些應保持在至少兩個不變量:

1)initialBalance + SUM(交易金額)= currentBalance
2),用於在listOfTransactions每個元素,交易時i位置timestamp應如果i < j始終小於位置j處的交易的timestamp

不變量取決於class正在做什麼以及該類如何實現。

假設我們可以再添加一個狀態變量:closedDate,還會出現一個不變量:closeDate後沒有事務可以有日期。

或者如果列表不是按日期排序,而是按交易金額排序,那麼侵略者會改變。

又如:
讓我們假設你有兩個字段,r1r2這對於r1r2制定者定義可變Ellipse類。這個類沒有任何不變性,因爲r1和r2的任何值都可以表示定義良好的橢圓。

現在讓我們假設您創建了新的Circle類,它擴展了可變的Ellipse。 (r1 == r2)。爲了保持不變,必須禁止某人設置r1或r2,從而發生r1!= r2。

在另一方面,如果EllipseCircle不變你不必關心對象的生命過程中的不變量,視病情只會在施工期間進行檢查。

隨着前面的例子中,我想說明的是
1)不變量建立和維護的方式在很大程度上取決於中的類之間的關係設計的選擇。
2)班上正在做什麼
3)該班是如何實施的。

不可變爲了保持它們的不變性,它們往往不那麼複雜,因爲它們在施工時就已經建立起來了,而且從不改變。(不變性還有許多其他的好處 - 不在答案的範圍內)

+1

我想說,從Ellipse派生'Circle'違反了LSP。它與方形/矩形問題相同。 – Maxpm

+0

如果它們是不可變的,它不會違反LSP,因爲沒有人可以改變狀態。如果可變,它會。 –