2017-08-18 77 views
1

我的問題是這樣的:有沒有可以處理方法調用依賴性的設計模式?

當你設計一個C++類時,在某些情況下,一些方法只能在一些其他方法被調用後或者在一些數據成員已經被正確的準備好之後才能被調用。

我發現很難處理什麼時候有一些數據成員依賴關係通常不那麼明顯,並且需要擴展該類以支持更多的功能和功能。這真的很容易出錯。

代碼的執行速度對我而言並不重要,代碼的清晰度/可維護性/敏感性更重要。

+1

處理這種事情的常見方法是使用檢查的布爾標誌。但是也許更好的解決方案可能是不要求這種排序的設計? –

+3

沒有上下文/具體的例子很難解決這個問題。你能提供一個嗎? – piwi

+1

這個問題在這裏是主題,因爲你沒有代碼給我們看。但是,它是https://softwareengineering.stackexchange.com/ – Mawg

回答

0

您可以考慮添加枚舉變量state以記錄對象的狀態,並處理需要按順序調用的方法中的狀態檢查和轉換。 如果狀態變得太複雜,您應該考慮修改您的課程設計,並可能將其分爲更小的課程。

1

如果method2只能在method1之後被調用,那麼class有一個狀態。你想保持狀態一致,可以改變/使用這個狀態的方法不應該破壞狀態。

所以你需要封裝。封裝不是關於如何將字段設爲私有,而是創建setField()方法,但是關於誰可以改變狀態。正確答案:只有對象可以改變它的狀態。如果你對每一個領域都有一個設置者,你就有一個不受保護的對象,並且關於一致狀態的控制已經泄漏。

實際上,您可以重新設計代碼,以便僅在前面的步驟中設置數據。在這種情況下,您不必擔心檢查「數據準備好了嗎?」每次調用method2

爲了避免不合時宜的呼叫,有幾種方法。每個人都有親和對手。我假設你有state0鏈 - >方法1 - >狀態1 - >方法2 - >狀態2 - >方法3 - >狀態3

  • 拋出一個異常,如果對象有不同的狀態。 F.E.裏面添加方法1 if currentState.differs(state0) throw exception 最容易實現的,這種方式不會幫助你在理解方面和維護項目

  • 使用StateChain-of-responsibility模式的組合。將課程分成幾部分,每部分可接受前一課作爲輸入參數,並返回鏈中的下一課。 F.E. Class0將採用簽名爲Class1 method1(state0)的方法,Class1擁有Class2 method2(class1),Class 2擁有state3 method3(class2)。所以沒有人可以撥打Class2.method3method1(class3) - 它不會編譯。作爲副作用,你會得到很多課程。您也可以獲得嚴格的流程流程,但可能比下一個選項更靈活。

  • 使用Template模式。用process方法創建一個Processor類,並確保只有這個類可以調用所需的方法。 state3 process(state0) { prepareStuff(); state1 = method1(state0) somePreparation(state1) state2 = method2(state1) anotherPrepare(state2) return method3(state2) } 然後,您可以通過子類Processor和重寫準備方法來改變流程流程。沒有人可以覆蓋process()。缺點是你總是獲得的全過程和方法2後不能停止(其實你可以,但它會導致泄漏的狀態,你會得到再次uncontrolable過程) 還要注意policy模板

從某種意義上說,兩種方式都將進程狀態包含在更高的層次上。


還有另外一種方法來實現調用依賴。無論你選擇什麼,你必須嚴格限制隨時隨地調用方法的可能性。

+0

你的第二點是[State_pattern](https://en.wikipedia.org/wiki/State_pattern)比[Chain-of-responsibility_pattern](https://en.wikipedia.org/wiki/Chain-of-責任模式)。這將是我的首選方法。 – Jarod42

+0

@ Jarod42好點,我不知道那種模式。更新了我的答案 – ADS

相關問題