PTT推薦

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

看板C_Chat標題[碼農] 微軟彈珠台是由巨型switch()語句組成作者
geminitea
(維亞)
時間推噓43 推:43 噓:0 →:63

https://reurl.cc/OmeMaR
以下內容轉自臉書(連結如上)

https://files.catbox.moe/0pu43a.png

圖 微軟彈珠台是由巨型switch()語句組成

前幾日微軟工程師 Dave W Plummer 分享

當初微軟推出新的作業系統 Windows NT 後

要把立體彈珠台 (Pinball) 這個內建遊戲改寫到新的作業系統

於是被交派這個任務的他看了原本的程式碼

結果發現是一個超級巨型的 swtich() 語句

底下有超過五十個 case 所組成
-----
Sent from MeowPtt on my SH-M28


--

※ PTT留言評論
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.200.133 (臺灣)
PTT 網址

serding09/08 16:16不能亂動了

SangoGO09/08 16:16至少他還有用Switch而不是if else

HJC666609/08 16:16switch也沒很亂吧 總比把東西亂放好

yezero09/08 16:16可以想像只是有點失望

kirimaru7309/08 16:17很合理啊 都是用球去撞

kirimaru7309/08 16:17switch成五十塊反而可以讓每塊的深度不要太深

xga00mex09/08 16:17然後發現第一個case永遠為true

StarTouching09/08 16:18巨型狀態機 這不是很棒嗎?

h010366109/08 16:181993年欸,那個時候上課都在用組語

HJC666609/08 16:18永遠true更爽了 剩下49條砍掉都不怕出事= =

h010366109/08 16:19用switch已經是高階語言了

tnlinna09/08 16:19好奇那個年代可以呈現出那樣的彈珠彈跳感算是很厲

tnlinna09/08 16:19害嗎?那時有物理引擎之類的東西了?

gino071709/08 16:19那個誰跟你說你應該總是使用if else還出了本書

piyan556609/08 16:19至少不是寫成巢狀if else

kirimaru7309/08 16:20二維運動反彈加個重力 不算太複雜

twosheep060309/08 16:20狀態機 沒有問題

HolyBugTw09/08 16:20還有什麼更好的寫法嗎?願聞其詳

speedingriot09/08 16:22以彈珠台這例子來說,用switch沒有什麼不好吧?

oyaji556609/08 16:22if else if else if else if else if else if else

Gwaewluin09/08 16:27至少比全都if好很多了

kirimaru7309/08 16:27這個案例寫50個case或50個if else都算是合理用法

StarTouching09/08 16:27任天堂又贏

kirimaru7309/08 16:27switch有一些比較奇怪的規則要注意 你想要穩一點就寫

kirimaru7309/08 16:2850個if else然後都用{}框好 有人要叫就隨便他叫

xxxzxcvb09/08 16:28不然要一堆if else 喔 最後的判斷要把前面全都跑過

xga00mex09/08 16:29寫到50我猜是用來判斷撞到什麼 現代可能寫成物件吧

kirimaru7309/08 16:29if else要判斷的只有if裡面的東西啊 switch一樣要比較

kirimaru7309/08 16:30如果那50個東西被彈珠撞的反應有明顯的樹狀結構

xga00mex09/08 16:30不過邏輯如果不複雜用switch也沒差

kirimaru7309/08 16:30那就會寫成樹狀if else了 不過我也不是做這遊戲的

yezero09/08 16:31只是在這裡聽到switch這種程設課前幾堂就學到的東西覺得

yezero09/08 16:31有點奇怪而已。身為微軟的程式猿沒有更神奇的寫法嗎…

kirimaru7309/08 16:31如果處理50種碰撞都是相異的小事 那並列沒什麼問題

xga00mex09/08 16:31能寫的簡單幹嘛複雜化

kirimaru7309/08 16:32彈珠檯本身就是個貼圖碰撞遊戲 不管你是要顯示外觀

kirimaru7309/08 16:33還是要處理彈珠碰撞 switch和if else都是最直接的選擇

kirimaru7309/08 16:33我個人是比較偏好if else啦 switch你還要想一下冒號

kirimaru7309/08 16:34換行 以及裡面如果要宣告變數可能會有什麼麻煩

lsd2596809/08 16:34這邊switch case很合理吧 每個事件都是平等的話 如果一

kirimaru7309/08 16:34當然你內容夠簡單的話用哪個都沒差

lsd2596809/08 16:34長串if那維護才會看到吐血==

llabc100009/08 16:35只要她會動,那就沒問題。

kirimaru7309/08 16:3550個case和50個else if其實看起來也差不多

kirimaru7309/08 16:35case裡面宣告變數反而還稍微有點問題

shallreturn09/08 16:35菜雞覺得用switch 很美(X

npc77609/08 16:35牛用奶頭走路.gif

kirimaru7309/08 16:35switch它其實是個......用goto原理都出來的東西

kirimaru7309/08 16:36我給它比較多尊重 夠單純的任務才會叫它上工

vios1000909/08 16:37至少不是用if else 外加 goto

clh96052409/08 16:38我倒是覺得是用 X-macro 加上 array,之後套 switch-c

clh96052409/08 16:38ase

clh96052409/08 16:38這樣只要維護 X-macro 就好

kirimaru7309/08 16:41以這張圖來說 只知道是跟這50個彈珠檯零件有關的判斷

FertilizerN09/08 16:41If it works, it works

kirimaru7309/08 16:41如果是簡單的事情 那用簡單的語法處理很合理

kirimaru7309/08 16:42如果是很複雜的行為 那開發過程中就會自己分類包裝了

kirimaru7309/08 16:43一個if或switch加起來幾千行確實是不應該

kirimaru7309/08 16:43不過發文者也沒說那個switch裡面有多大

ltytw09/08 16:47用switch會好讀嗎

NightDream0809/08 16:50這個的關鍵不是在switch,而是"巨型"。無論什麼程式

NightDream0809/08 16:50碼你只要聽到某個"巨型"的東西(不管那東西是條件判

NightDream0809/08 16:50斷還是函式還是其他的什麼),那通常都會讓人類一個

NightDream0809/08 16:50頭兩個大,就這樣。

ULTIMGBK09/08 16:51看起來就是球跟場地有互動就來跑這個switch 簡單粗

ULTIMGBK09/08 16:51暴 比什麼不小心搜尋到整個包包造成卡頓 還是什麼

ULTIMGBK09/08 16:51你看這顆石頭有幾百萬面但優化0分 拍賣太多人用會

ULTIMGBK09/08 16:51壞掉 好很多

YeaPa09/08 16:51我猜碰觸物件之後該物件會觸發一個共同event,而不是每個物

YeaPa09/08 16:51件有獨立的event,然後再從參數裡面帶物件的編號,所以後面

YeaPa09/08 16:51的handler用switch case去處理,如果是這樣的話那會比if el

YeaPa09/08 16:51se好很多,包括效能的部分

npc77609/08 16:52我有點忘記 場上是不是可以多一顆球 這樣運作沒問題嗎

ss21809/08 16:54那時代的程式語言就差不多那樣吧

ymsc3010209/08 16:54可以三顆噢

EXTECH09/08 16:54寫得蠻好的啊

Giornno09/08 16:57至少不是if

ilohoo09/08 16:58switch case比if else好讀 不過要是能物件化每個物件各自

ilohoo09/08 16:58處理碰撞事件會更好擴充

Giornno09/08 16:58或者是用jumpx跳來跳去的

inte629l09/08 16:58多球不知道如何設計 handler再傳入ball*之類的? 但又要

inte629l09/08 16:58忙多顆球的物理有點忙

inte629l09/08 16:59C++的話有種想套template method XD

EXTECH09/08 17:06如果是50物件都有獨自物理特性,沒毛病啊

whosu09/08 17:06看他這個圖片的案例 switch確實沒啥問題 就是很多而已

Pixis09/08 17:17童年

crazyanight09/08 17:28我比較喜歡看if else switch還要找break

crazyanight09/08 17:29不過如果內容簡單的話確實switch更合理

ao4041809/08 17:34switch控制狀態機不是基本到不行嗎

edgefish0209/08 17:51至少不是用goto 大家就要知足 XD

axis098509/08 18:03難不成想看到一堆goto嗎?

anondog09/08 18:27原始訪談 https://youtu.be/Lmi_TuIYXYw

anondog09/08 18:30拿到手的原始碼基本都是組合語言,核心的switch statemen

anondog09/08 18:30ts還有彩蛋藏在裡面,不過訪談沒說是什麼彩蛋

WiLLSTW09/08 18:30沒有問題吧 遊戲就是一個巨大的狀態機

anondog09/08 18:32Windows工作管理員也是他寫出來的

spfy09/08 18:48這東西開發的時候還 設計模式 物件導向還不是主流吧

e2ne009/09 07:29說switch沒很亂的是不懂策略模式嗎

HolyBugTw09/09 08:10到底留言的會是主攻軟工還是嵌入呢?前者台灣蠻罕見了

hylkevin09/09 08:11c的case只能是數值,若他是連續的或可以構造成連續的,

hylkevin09/09 08:11可以用函數指標陣列取代。像是把每個case放到一個個func

hylkevin09/09 08:11tion再把每個function pointer放到fptr_table,code若是

hylkevin09/09 08:11case的數值,則可以一行fptr_table[code]();呼叫。必須

hylkevin09/09 08:11確保code數值一定在0到fptr數量-1之間,現代設備上效能

hylkevin09/09 08:11差不多,但好維護很多。

HolyBugTw09/09 08:12策略模式喔,用C寫看看啊~