C++為什么不提倡使用單例模式?
C++為什么不提倡使用單例模式?
我是不提倡C++當(dāng)中使用單例模式的,在很早以前寫過一個(gè)答案提過關(guān)于單例的問題。
正好最近有個(gè)朋友剛翻譯了C++ core guidelines,里面的I.3也提了單例模式的危害,直接用“避免單例”作為標(biāo)題,今天可以稍微展開聊聊為什么單例在C++中不推薦。最近很多小伙伴找我,說想要一些C++資料,然后我根據(jù)自己從業(yè)十年經(jīng)驗(yàn),熬夜搞了幾個(gè)通宵,精心整理了一份「C++專業(yè)入門到高級(jí)教程+工具包」,點(diǎn)個(gè)關(guān)注,全部無償共享給大家!?。?/p>
評(píng)論區(qū)回復(fù)“888”,關(guān)注我之后私信回復(fù)“666”,即可拿走。
首先,我們得先討論全局變量的危害。由于全局變量完全破壞了RAII的封裝性,像神一樣直接干涉萬(wàn)物。在C++ core guidelines里列舉了以下四點(diǎn):
可測(cè)試性
你無法孤立地測(cè)試你的實(shí)體。如果單元不存在,那么單元測(cè)試也將不存在。你只能進(jìn)行系統(tǒng)測(cè)試。實(shí)體的執(zhí)行效果要依賴整個(gè)系統(tǒng)的狀態(tài)。
重構(gòu)
因?yàn)槟銦o法孤立地對(duì)代碼進(jìn)行推理,重構(gòu)它會(huì)相當(dāng)有挑戰(zhàn)。
優(yōu)化
你無法輕易地重新安排函數(shù)的調(diào)用或者在不同的線程上進(jìn)行函數(shù)調(diào)用,因?yàn)榭赡苡须[藏的依賴。緩存之前的函數(shù)調(diào)用結(jié)果也極為危險(xiǎn)。
并發(fā)
產(chǎn)生數(shù)據(jù)競(jìng)爭(zhēng)的必要條件是有共享而可變的狀態(tài),而非const全局變量正是共享而可變的。
拾人牙慧部分結(jié)束:
代碼要對(duì)輸入輸出負(fù)責(zé),當(dāng)依賴全局的變量來作為輸入或者輸出的單元的時(shí)候,誰(shuí)也不知道有誰(shuí)的惡心代碼用什么惡心的姿勢(shì)把全局變量的值在啥時(shí)候給tm改了??蓽y(cè)試性無從談起,可重用性基本為0,模塊化、可維護(hù)性也幾乎為零,可讀性蕩然無存。