Re: [程式] Unity的Singleton Pattern實作-Instance

作者: cjcat2266 (CJ Cat)   2017-09-11 16:39:40
※ 引述《littleshan (我正在想要換什麼)》之銘言:
: 先感謝分享,但這邊提出一些不同的看法。
: Singleton 本身並不會降低耦合,實際上它造成很強烈的耦合。
感謝分享,我也想要提出一些意見提供參考
剛踏入業界的時候,我也是非常小心地遵從教科書上的教誨
大部分 "缺點多" 或者 "不建議使用" 的系統設計方式一概不碰
與老鳥們合作一段時間之後,反而有不太一樣的見解
我們家的共識是,全域變數用起來心裡會有疙瘩,沒錯
但是當其方便性夠值得的時候,還是就安心用下去吧
當然,前提是得保有紀律,不落入教科書提及的眾多圈套中
我們在乎的方便性不單只是程式寫起來簡不簡潔
是否在debugger裡面的watch window能方便檢視也很重要
過去我有幾次提出不同重構singleton的方法
同事們往往都一語中的: "Good luck getting that in the watch window."
上篇推文有提到,不用singleton那manager類型的物件怎麼管理?
放在MainGame物件裡面? 那單一MainGame物件到頭來也是個singleton呀
追朔遊戲的最上層,總是會有某種形式的singleton存在
所以說要死都不用singleton又顯得有點綁手綁腳
如果硬是要只有MainGame這個類別才准許有singleton
其實對watch window稍微不太友善
首先要在watch window裡面輸入g_mainGame
然後要嘛要手動展開g_mainGame找到想要檢視的manager
要嘛得多存個g_mainGame.m_myManager在watch window
當MainGame規模變大、如此手續重複次數變多,watch window使用效率就下降了
又如果為了抽象性,還把眾多manager藏到的更神祕的地方
那在一個隨便的break point要去挖資料還得更費工夫
我們的做法是,manager類型的直接用全域變數沒關係
像是InputManager, NpcManager, ObjectManager
我們都直接用赤裸裸的全域變數g_inputMgr, g_npcMgr, g_objManager
好處是不管遊戲停在哪個break point
我要看NPC的清單,然後檢視特定NPC的資料
只要在watch window輸入g_npcMgr就好,不用從別的出發點爬過去
+ g_npcMgr
|
作者: b87088 (ba)   2017-09-11 17:11:00
謝謝,感謝分享
作者: dreamnook (亞龍)   2017-09-11 18:03:00
推個 難得一系列好文
作者: johnny94 (32767)   2017-09-11 18:52:00
設計就是一系列的 trade-off
作者: joseph33 (理查帕迪)   2017-09-11 21:38:00
推 過度擔心反而開發起來綁手綁腳的
作者: kesamia (素材整理破百小時..)   2017-09-11 22:14:00
推一個
作者: feather623 (ㄇ ㄚˊ吉兔腦粉)   2017-09-11 23:49:00
感謝你的延伸分享!
作者: y3k (激流を制するは静水)   2017-09-12 17:00:00
可以說 任何寫法都有它的用處 只是singleton被誤用濫用造成的影響很不容易處理 也可以用其他寫法預防
作者: ycjcsie (ycj)   2017-09-16 15:47:00
我在弄system相關也是直接用singleton
作者: Ahtram (Ahtram)   2017-09-17 10:34:00
或者:把instance弄成private 然後開一堆method去包裝,這是比較保守而且讓寫類別的人可以掌控狀況的方法要寫比較多東西就是。其實我也常幹當作global變數使用就是
作者: NightDream08 (夜夢ND)   2017-09-23 00:14:00
輸入輸出這種「只需要而且也只應該有一組」的情況加上又不太容易有state互相影響的場合用Singleton應該沒什麼錯吧......?
作者: cjcat2266 (CJ Cat)   2017-09-23 01:50:00
是啊,我覺得合理就用singleton其實沒什麼問題以後有問題再改就好,反正又不能100%預知未來不如每次修改就以minimal viable product為目標

Links booklink

Contact Us: admin [ a t ] ucptt.com