Posted on December 12th, 2007 at 1:32 by fr3@K
去年我寫過一篇文章, 大意是在說 大多數人所使用的 Singleton 實作都是有問題的. 在文章靠近後面的部份, 我也介紹了一種較少為人知, 我常用在 lifetime 是全局但 scope 是局部的 (global) 變數的 Singleton 實作. 雖然這實作離 fool proof 還差得遠, 在使用者能夠正確地 include header 的情況下, 它可能已經是最接近 bullet proof 的實作了.
“好吧, 那我就用類似你的 Singleton 實作總行了吧!?” 先別急著動手改 code, 實作是容易更換的, 但使用 Singleton Pattern 的原因卻與更重要的介面, 甚至架構的設計思維息息相關. 工作的實務經驗以及本身的興趣研究讓我體會到, 大多數的情況下 Singleton 的使用是可以避免的. 在這些非必要情況卻依然採用 Singleton 的原因常是:
- 沒把問題想清楚
- 好玩
- 因為有個叫作 Singleton 的 pattern
有心學好寫好 C++ 的人可能不少都經歷過這個階段, 或許是為了好玩, 也可能是為了證明自己也可以做出好輪子. 在一本書一個網站上看到有趣的東西就自己也做一套出來.1 這個階段對個人的編程技巧的成長很可能會有一定程度的幫助. 但做了就把它拿來用在 project 上, 或是自以為需要就抄來用在 project 上, 又或是認為用了 pattern 的程式就是較好的, 這樣的行為與認知其實更容易對 project 產生負面的影響. 尤其當使用的 pattern 是 Singleton Pattern 的時候.
不談之前討論過不同的 Singleton 實作上的問題, 缺陷或盲點. Singleton Pattern 的實作多是只要 include 了 header, 每段 code 都可以 access 到某個 instance. 而 access 到該 instance 的時候, 它會處於初始化已經完成的狀態.2 使用這樣的 singleton 跟使用一個全局的 default constructible, 或是有初始值的 global variable 在架構上幾乎沒有區別.3 不是用個有響亮名字的 pattern 把 global variable 包裝起來就比直接使用 global variable 好到那裡去.
如果你不認同 global variable 的使用是一種漂亮的手法, 你也該一並鄙視全局的 singleton. 至少要以懷疑的眼光去檢視程式採用 Singleton Pattern 真正的原因.
![]() |
|
| Previous Post « WIN32 的 _TCHAR 與 std::wstring 的問題 « |
Next Post » Benchmarking Sequential Iterators » |








你問我了那個問題, 然後就沒再上線了…
被你打敗啦!
Comment by 一碗 — January 18, 2008 @ 23:06