我想知道,我最近讀了一篇文章,談到使用單例模式的缺點,說全球變量發生的缺點,正確地說,單例違反了我們從OOP學校學到的許多規則,單責任原則,接口和抽象類的編程,而不是具體的類......所有這些好東西。我想知道你如何像數據庫連接類一樣工作,你只需要一個連接到你的數據庫和你的數據庫的一個對象漂浮。作者提到了依賴注入原則,我認爲它依賴於依賴倒置規則。我如何知道和控制什麼對象作爲依賴被傳遞,而不是我創建這個類的事實,並期望每個人都使用它,並確保它們使用正確的資源?!面向對象編程原理
面向對象編程原理
回答
編輯:這個答案假定你使用的是依賴注入容器,你自己寫的一個,或者你從庫中獲得的。如果沒有,那麼使用DI容器:)
我怎麼知道和控制什麼對象被傳來傳去的比我創建的類並用它玩好,並確保每個人都期待的事實以外的依賴,他們正在使用正確的資源?
合同
的口頭合同 - 你寫了一個設計規範,說:「你不可直接實例化這個類」和「不可繞過你的依賴注入容器有任何對象如果你必須通過容器「。
編譯器契約 - 你給它們一個依賴注入容器,並且它們通過抽象接口抓取它的實例。如果只希望使用單個實例,則可以爲它們提供一個命名實例,它們會同時提取名稱和接口。
ISomething instance = serviceLocator.ResolveInstance<ISomething>(
"TheInstanceImSupposedToUse");
您也可以讓你的所有的具體類民營/內部/什麼具備的,你,只爲他們提供一個抽象的接口來對運行。這將阻止他們自己實例化類。
// This can only be instantiated by you, but can be used by them via ISomething
private class ConcreteSomething : ISomething
{
// ...
}
通過代碼審查
你讓整個集團的編碼和設計標準的公平性,並確保它們是由組內的每個人都知道。
您使用的是源代碼控制機制,並且在他們簽入之前需要進行代碼審查。您可以閱讀代碼,瞭解它們鏈接的內容,包含哪些標頭,實例化哪些對象以及傳遞哪些實例。
如果他們在代碼審查過程中違反了您的規則,那麼在修復代碼之前不要讓他們簽入。可選地,對於屢犯者,你讓他們付給你一美元,你讓他們買午餐,或者你僱用一個不同的承包商來替換他們。無論在你的組內工作得好:)
依賴注入容器(即使你自己開發的一個,這不是一個完全不常見的做法)通常是非常可配置的。在這種情況下你要做的事情就是配置它,以便實現的任何接口請求都能滿足該實現。即使它是一個單身人士。
例如,看看記錄器單在這裏被使用:http://www.pnpguidance.net/News/StructureMapTutorialDependencyInjectionIoCNET.aspx
對於那些誰批評Singleton模式的基礎上,SRP,這裏是一個opposing view。另外,我發現依賴注入容器可以創建儘可能多的問題。也就是說,我正在使用一個很有前途的折中方案,如another post所述。
不要把你在任何地方看到的東西當作絕對真理。閱讀它,理解它,然後然後你可以看到什麼時候最好應用某些東西。在你的情況下,你爲什麼不想創建一個靜態單例?
因爲可能會有更好的抽象。通常,更靈活的方法會使代碼更容易重構或重用。例如,有些原因希望能夠並行運行多個版本的代碼,即使通常只想保留一個連接,也可以單獨連接到數據庫。簡單的單例不會讓您靈活地更改設計以支持該場景。 – 2010-08-31 00:42:00
Merlyn我同意你的意見。我正在考慮做一些事情,你剛剛說的話引發了我的想法。很高興! – 2010-09-01 14:14:05
- 1. 處理 - 面向對象編程問題
- 2. 面向對象編程
- 3. 面向對象編程(OOP)
- 4. Python:面向對象編程
- 5. Python面向對象編程
- 6. 面向對象編程
- 7. 面向對象編程
- 8. Scala面向對象編程
- 9. android面向對象編程
- 10. mysqli面向對象編程
- 11. 面向對象編程(HOW!)
- 12. 面向對象編程
- 13. 的Javascript原型面向對象編程的疑惑
- 14. 面向對象的CRUD程序 - 面向對象設計的原因是什麼?
- 15. jQuery的click處理程序和麪向對象編程
- 16. 汽車類面向對象編程Python
- 17. 面向對象編程方法問題
- 18. 面向對象的編程設計?
- 19. 面向對象編程Nth子
- 20. 面向對象的編程邏輯
- 21. 不明白麪向對象編程
- 22. 面向對象編程,銀行業務
- 23. MVC/HMVC和麪向對象編程
- 24. 面向對象編程(Python)代碼
- 25. PHP編碼程序與面向對象
- 26. 的Javascript面向對象編程能力
- 27. 面向對象的python編程
- 28. c#面向對象編程問題
- 29. 指針和麪向對象編程
- 30. 面向對象的編程蟒蛇
IOC + DI:http://martinfowler.com/articles/injection.html – 2010-08-31 00:50:06