2016-06-01 61 views
1

我的班級有3個州。在每一種狀態下,它都會做一些工作,並進入其他狀態,或者保持在相同的狀態(95%或更多的情況下,它將保持在相同的狀態)。我可以實現狀態模式(我假設你知道它)。我很喜歡的另一種方法是:「狀態模式」vs「每個狀態的一個成員函數」?

我有一個每個狀態的成員函數,還有一個指向成員函數的指針,它指向當前狀態函數。當我想進入另一個狀態時,我只是將該函數指針指向另一個狀態函數。 (也許這不完全等同於狀態模式,但在我的情況下它工作正常)。

我想這兩種方式幾乎是一樣的。

所以,我的問題是:

  1. 哪種方案更好(取決於什麼)?
  2. 是否值得爲每個狀態聲明一個類(它只有一個函數)?我認爲這是人爲的。
  3. 性能怎麼樣?沒有創造新的國家階級對象(在國家模式的情況下)帶來輕微的開銷? (當然狀態類不應該有會員,但無論如何,它應該花費的東西)
+0

如果您的代碼工作那麼代碼審查可能是因爲它在正確的地方。 –

+0

我的問題是一般,不與我的代碼連接。 – user1289

+0

考慮瀏覽/張貼程序員板然後 –

回答

1

你真的不提下,你的程序將運行的約束,所以專門很難評價關於一個實現比其他的開銷,所以我就做出有關代碼的可維護性評論。

我個人認爲,除非你的狀態機非常簡單並且保持簡單,那麼爲每個狀態聲明一個類是可維護的,可擴展的&可讀。一個好的經驗法則可能是,如果你不能看你班上的代碼,並把整個圖片放在腦海中,那麼你的班級可能會做太多。在爲每個狀態聲明一個類時,您付出的小額開銷可能非常值得您從編寫模塊化代碼(或任何最終維護它的人)獲得的生產力提高。我遇到了太多'超級'類,它們本質上是一個大型(非常難以維護)的狀態機,可能是作爲一個簡單的狀態機開始的,否則就會推薦。

的「S」和「O」的SOLID縮寫的部分(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)總是好東西要牢記。

+0

這就是我想的,爲了保持簡單我會有一些開銷像國家班級將參考主要班級,必須是它的朋友訪問私人成員等......),但可能它更有意義。謝謝。 – user1289

0
  1. 這取決於如果你需要訪問對象或沒有的私有成員。如果不是這樣,那麼類外實現會將您的代碼打碎成更小的碎片,因此可能更可取(但這不是客觀的:這兩種解決方案有利有弊)。

  2. 這不是必需的,但增加了一層抽象並放鬆耦合。使用接口,您可以更改每個實現而不影響其他實現(例如,添加類字段...)

  3. 無關緊要,分配新的空類或調用函數的開銷相同。

+1

通常是有幫助的,空的類包含malloc調用?我想是的,因爲它應該有一個地址(它的大小是1而不是0)。所以如果它調用malloc,它應該會影響性能。 – user1289

+0

它可能會。那麼,我在這裏有點挑釁,我從C世界走了一段路,發現C程序員太擔心他們的代碼在他們不應該執行的地方執行。 1.你說切換狀態不是很頻繁,2.你仍然可以使用像mobdnilo這樣的靜態實例指出,所以不要將你的代碼設計決策放在性能問題上。 –

+0

是的,在我的情況下,它並沒有太大的影響,是的molbdnilo的解決方案很好,但總的來說,我們應該總是考慮性能:) – user1289