[碼農] 微軟彈珠台是由巨型switch()語句組成

作者: geminitea (維亞)   2025-09-08 16:15:16
https://reurl.cc/OmeMaR
以下內容轉自臉書(連結如上)
https://files.catbox.moe/0pu43a.png
前幾日微軟工程師 Dave W Plummer 分享
當初微軟推出新的作業系統 Windows NT 後
要把立體彈珠台 (Pinball) 這個內建遊戲改寫到新的作業系統
於是被交派這個任務的他看了原本的程式碼
結果發現是一個超級巨型的 swtich() 語句
底下有超過五十個 case 所組成
作者: serding (累緊地們)   2025-09-08 16:16:00
不能亂動了
作者: SangoGO (隱世的外來人Lv.1)   2025-09-08 16:16:00
至少他還有用Switch而不是if else
作者: HJC6666 (帕修)   2025-09-08 16:16:00
switch也沒很亂吧 總比把東西亂放好
作者: yezero (肥雁改)   2025-09-08 16:16:00
可以想像只是有點失望
作者: kirimaru73 (霧丸)   2025-09-08 16:17:00
很合理啊 都是用球去撞switch成五十塊反而可以讓每塊的深度不要太深
作者: xga00mex (七祈綺契)   2025-09-08 16:17:00
然後發現第一個case永遠為true
作者: StarTouching (撫星)   2025-09-08 16:18:00
巨型狀態機 這不是很棒嗎?
作者: h0103661 (路人喵)   2025-09-08 16:18:00
1993年欸,那個時候上課都在用組語
作者: HJC6666 (帕修)   2025-09-08 16:18:00
永遠true更爽了 剩下49條砍掉都不怕出事= =
作者: h0103661 (路人喵)   2025-09-08 16:19:00
用switch已經是高階語言了
作者: tnlinna (serena)   2025-09-08 16:19:00
好奇那個年代可以呈現出那樣的彈珠彈跳感算是很厲害嗎?那時有物理引擎之類的東西了?
作者: gino0717 (gino0717)   2025-09-08 16:19:00
那個誰跟你說你應該總是使用if else還出了本書
作者: piyan5566   2025-09-08 16:19:00
至少不是寫成巢狀if else
作者: kirimaru73 (霧丸)   2025-09-08 16:20:00
二維運動反彈加個重力 不算太複雜
作者: twosheep0603 (兩羊)   2025-09-08 16:20:00
狀態機 沒有問題
作者: HolyBugTw (HolyBug)   2025-09-08 16:20:00
還有什麼更好的寫法嗎?願聞其詳
作者: speedingriot (純樸島民)   2025-09-08 16:22:00
以彈珠台這例子來說,用switch沒有什麼不好吧?
作者: oyaji5566 (大叔56)   2025-09-08 16:22:00
if else if else if else if else if else if else
作者: Gwaewluin (神無月 孝臣)   2025-09-08 16:27:00
至少比全都if好很多了
作者: kirimaru73 (霧丸)   2025-09-08 16:27:00
這個案例寫50個case或50個if else都算是合理用法
作者: StarTouching (撫星)   2025-09-08 16:27:00
任天堂又贏
作者: xxxzxcvb (阿........)   2025-09-08 16:28:00
不然要一堆if else 喔 最後的判斷要把前面全都跑過
作者: xga00mex (七祈綺契)   2025-09-08 16:29:00
寫到50我猜是用來判斷撞到什麼 現代可能寫成物件吧
作者: kirimaru73 (霧丸)   2025-09-08 16:29:00
if else要判斷的只有if裡面的東西啊 switch一樣要比較如果那50個東西被彈珠撞的反應有明顯的樹狀結構
作者: xga00mex (七祈綺契)   2025-09-08 16:30:00
不過邏輯如果不複雜用switch也沒差
作者: kirimaru73 (霧丸)   2025-09-08 16:30:00
那就會寫成樹狀if else了 不過我也不是做這遊戲的
作者: yezero (肥雁改)   2025-09-08 16:31:00
只是在這裡聽到switch這種程設課前幾堂就學到的東西覺得有點奇怪而已。身為微軟的程式猿沒有更神奇的寫法嗎…
作者: kirimaru73 (霧丸)   2025-09-08 16:31:00
如果處理50種碰撞都是相異的小事 那並列沒什麼問題
作者: xga00mex (七祈綺契)   2025-09-08 16:31:00
能寫的簡單幹嘛複雜化
作者: kirimaru73 (霧丸)   2025-09-08 16:32:00
彈珠檯本身就是個貼圖碰撞遊戲 不管你是要顯示外觀還是要處理彈珠碰撞 switch和if else都是最直接的選擇我個人是比較偏好if else啦 switch你還要想一下冒號換行 以及裡面如果要宣告變數可能會有什麼麻煩
作者: lsd25968 (cookie)   2025-09-08 16:34:00
這邊switch case很合理吧 每個事件都是平等的話 如果一
作者: kirimaru73 (霧丸)   2025-09-08 16:34:00
當然你內容夠簡單的話用哪個都沒差
作者: llabc1000 (野生的攻城獅)   2025-09-08 16:35:00
只要她會動,那就沒問題。
作者: kirimaru73 (霧丸)   2025-09-08 16:35:00
50個case和50個else if其實看起來也差不多case裡面宣告變數反而還稍微有點問題
作者: shallreturn (千本鳥居)   2025-09-08 16:35:00
菜雞覺得用switch 很美(X
作者: npc776 (二次元居民)   2025-09-08 16:35:00
牛用奶頭走路.gif
作者: vios10009 (vios10009)   2025-09-08 16:37:00
至少不是用if else 外加 goto
作者: clh960524 (CLH)   2025-09-08 16:38:00
我倒是覺得是用 X-macro 加上 array,之後套 switch-case這樣只要維護 X-macro 就好
作者: kirimaru73 (霧丸)   2025-09-08 16:41:00
以這張圖來說 只知道是跟這50個彈珠檯零件有關的判斷
作者: FertilizerN (七星破軍迅送頭)   2025-09-08 16:41:00
If it works, it works
作者: ltytw (ltytw)   2025-09-08 16:47:00
用switch會好讀嗎
作者: NightDream08 (夜夢ND)   2025-09-08 16:50:00
這個的關鍵不是在switch,而是"巨型"。無論什麼程式碼你只要聽到某個"巨型"的東西(不管那東西是條件判斷還是函式還是其他的什麼),那通常都會讓人類一個頭兩個大,就這樣。
作者: ULTIMGBK (幻殺)   2025-09-08 16:51:00
看起來就是球跟場地有互動就來跑這個switch 簡單粗暴 比什麼不小心搜尋到整個包包造成卡頓 還是什麼你看這顆石頭有幾百萬面但優化0分 拍賣太多人用會壞掉 好很多
作者: YeaPa (葉胖)   2025-09-08 16:51:00
我猜碰觸物件之後該物件會觸發一個共同event,而不是每個物件有獨立的event,然後再從參數裡面帶物件的編號,所以後面的handler用switch case去處理,如果是這樣的話那會比if else好很多,包括效能的部分
作者: npc776 (二次元居民)   2025-09-08 16:52:00
我有點忘記 場上是不是可以多一顆球 這樣運作沒問題嗎
作者: ss218 (大青花魚)   2025-09-08 16:54:00
那時代的程式語言就差不多那樣吧
作者: ymsc30102 (囧臉蔥)   2025-09-08 16:54:00
可以三顆噢
作者: EXTECH (EXTECH)   2025-09-08 16:54:00
寫得蠻好的啊
作者: Giornno (喬魯諾.喬三槐)   2025-09-08 16:57:00
至少不是if
作者: ilohoo (ilohoo)   2025-09-08 16:58:00
switch case比if else好讀 不過要是能物件化每個物件各自處理碰撞事件會更好擴充
作者: Giornno (喬魯諾.喬三槐)   2025-09-08 16:58:00
或者是用jumpx跳來跳去的
作者: inte629l   2025-09-08 16:58:00
多球不知道如何設計 handler再傳入ball*之類的? 但又要忙多顆球的物理有點忙C++的話有種想套template method XD
作者: EXTECH (EXTECH)   2025-09-08 17:06:00
如果是50物件都有獨自物理特性,沒毛病啊
作者: whosu (HiHi)   2025-09-08 17:06:00
看他這個圖片的案例 switch確實沒啥問題 就是很多而已
作者: Pixis (說好不擺爛)   2025-09-08 17:17:00
童年
作者: crazyanight (crazyanight)   2025-09-08 17:28:00
我比較喜歡看if else switch還要找break不過如果內容簡單的話確實switch更合理
作者: ao40418 (噗嚕嚕咕)   2025-09-08 17:34:00
switch控制狀態機不是基本到不行嗎
作者: edgefish02   2025-09-08 17:51:00
至少不是用goto 大家就要知足 XD
作者: axis0985 (YOO)   2025-09-08 18:03:00
難不成想看到一堆goto嗎?
作者: anondog (anon)   2025-09-08 18:27:00
原始訪談 https://youtu.be/Lmi_TuIYXYw拿到手的原始碼基本都是組合語言,核心的switch statements還有彩蛋藏在裡面,不過訪談沒說是什麼彩蛋
作者: WiLLSTW (WiLLS)   2025-09-08 18:30:00
沒有問題吧 遊戲就是一個巨大的狀態機
作者: anondog (anon)   2025-09-08 18:32:00
Windows工作管理員也是他寫出來的
作者: spfy (spfy)   2025-09-08 18:48:00
這東西開發的時候還 設計模式 物件導向還不是主流吧

Links booklink

Contact Us: admin [ a t ] ucptt.com