[討論] 醫院的排隊叫號機怎麼設計比較好

看板Soft_Job (軟體人)作者 (empireisme)時間10月前 (2023/06/06 01:24), 10月前編輯推噓40(400177)
留言217則, 45人參與, 10月前最新討論串1/2 (看更多)
如題 這不是作業,也不是我公司的工作(小弟在數位廣告業當碼農,在台北扣完勞健保大概快四萬QQ) 是剛好有一次去醫院看病的時候想到,醫院的排隊叫號機 好像剛好可以是一個小system design的題目 ? (小弟非本科年資快兩年,但平常幾乎都在CRUD跟設計TABLE還有接第三方API,所以以下內容 沒意外應該會有很多不太對的地方,希望可以海涵QQ) 就我的理解,醫院的排隊叫號機有以下規則 1.首先是可以線上掛號(checkInOnline),這邊很簡單,反正就是先掛號的優先看病,我這邊為了簡化先不考慮 現場掛號這件事,也假設只有一間醫院,以及一個門診,門診也沒有其他 2.可以過號(skipNumber),也就是現場叫號(callNumber)的時候,如果病人不在,那麼就把他 跳掉,直到他又現場註冊(checkInAgain),重新插入健保卡的時候,排隊叫號機才會 每看三個線上掛號的病人就去看現場註冊的病人,當然當現場線上掛號的病人時,排隊叫號機 就會一直去叫被過號的病人 上面就是我粗淺的規則 然後下面是我的思路: 我決定用物件來區分行為,因為事情好像沒有很複雜所以不引入Interface 我決定區分兩個class分別是 Patient 和 Hospital Patient有兩個函數分別是 1.checkInOnline 2.checkInAgain (要有基本的防呆,只有被過號了,才能現場註冊,另外看過醫生的話,也不能再次註冊) 這兩個函數都argument都是 Hospital物件 Hospital我一開始有想到優先佇列,只是後來覺得好像直接設成兩個Queue事情好像 比較簡單? 我決定Hosptital要有這幾個Member int skipNumber=3; int skipNumberNow=0; Queue<Patient> normalQueue= new LinkedList<>(); Queue<Patient> skipQueue= new LinkedList<>(); 並且要有下面兩個函數 1.callNumber() 2.skipNumber() 說了這麼多,這是我的github,我覺得我真的code寫得很亂很爛 https://reurl.cc/nDEYG8 懶得看github的人 我直接貼code https://imgur.com/jKRcBmK
https://imgur.com/UW2yp0z
我這邊為了各種防呆,宣告了一堆 flag 感覺程式碼沒有寫的很好 想請問各位先進,有沒有甚麼可以改善的方法,或是思路 謝謝各位年薪三百萬 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.227.13.10 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1685985884.A.451.html

06/06 01:47, 10月前 , 1F
不是你想怎麼寫就怎麼寫
06/06 01:47, 1F

06/06 01:47, 10月前 , 2F
是以醫院制度醫生跟護理師說的算
06/06 01:47, 2F

06/06 01:57, 10月前 , 3F
建議把你手上的專案優化比較實在...
06/06 01:57, 3F

06/06 02:31, 10月前 , 4F
現實當然很難,但想想也沒關係吧
06/06 02:31, 4F

06/06 02:34, 10月前 , 5F
這感覺比較像是OOP隨堂小練習XD
06/06 02:34, 5F

06/06 02:34, 10月前 , 6F
可以多想一下要變成一個可以用的系統,會有哪些service、
06/06 02:34, 6F

06/06 02:34, 10月前 , 7F
資料怎麼傳遞、db怎麼設計之類的
06/06 02:34, 7F

06/06 02:58, 10月前 , 8F
當下號碼為n,叫號未到的號碼x存set
06/06 02:58, 8F

06/06 02:58, 10月前 , 9F
過號者x重新註冊時去查set
06/06 02:58, 9F

06/06 02:59, 10月前 , 10F
x在set的話從set踢出 塞入 pq<K,V> = (n+3,x)
06/06 02:59, 10F

06/06 02:59, 10月前 , 11F
pq 依K排序
06/06 02:59, 11F

06/06 03:00, 10月前 , 12F
每次叫號 if(pq.peek().K <= n) 改叫過號者號碼
06/06 03:00, 12F

06/06 03:01, 10月前 , 13F
之後做pq.poll() 如果再度過號就重新塞進set
06/06 03:01, 13F

06/06 03:01, 10月前 , 14F
應該連OOP都用不太到 現成的資結就能實作了
06/06 03:01, 14F

06/06 03:05, 10月前 , 15F
你這是OOP跟系統設計沒什麼關聯 這就簡單的CRUD就能
06/06 03:05, 15F

06/06 03:05, 10月前 , 16F
解決了 頂多就是思考怎麼解決多人同時預約熱門醫生的
06/06 03:05, 16F

06/06 03:05, 10月前 , 17F
問題
06/06 03:05, 17F

06/06 08:03, 10月前 , 18F
實務上一定是crud吧,大概四個欄位就搞定了
06/06 08:03, 18F

06/06 08:09, 10月前 , 19F
好像需要五個,編號,id,是否掛號,是否看完,掛號時間
06/06 08:09, 19F

06/06 08:14, 10月前 , 20F
現在的醫院叫號機應該還有一些病人的優先順序,例如高齡
06/06 08:14, 20F

06/06 08:14, 10月前 , 21F
病患的順序比般人高之類的,然後再疊加上去是否已過號,
06/06 08:14, 21F

06/06 08:14, 10月前 , 22F
過號病患插卡後,會等兩位未過號的病患看診完就輪到他,
06/06 08:14, 22F

06/06 08:14, 10月前 , 23F
此時他的優先度又比其他人高,可以再多觀察看看叫號機的
06/06 08:14, 23F

06/06 08:14, 10月前 , 24F
實務狀況
06/06 08:14, 24F

06/06 08:27, 10月前 , 25F
開三條thread放東西就好
06/06 08:27, 25F

06/06 08:27, 10月前 , 26F
main
06/06 08:27, 26F

06/06 08:27, 10月前 , 27F
準備要進入main的(max3)
06/06 08:27, 27F

06/06 08:27, 10月前 , 28F
skip
06/06 08:27, 28F

06/06 08:29, 10月前 , 29F
變數只用一個 priority,剩下都是內部的商業邏輯處理
06/06 08:29, 29F
這樣會有share resource的問題嗎 還是我想太多了 你的pq 是怎麼決定順序的阿

06/06 08:41, 10月前 , 30F
我以為掛號機的目的是如何取最大的公平性,每家醫院診
06/06 08:41, 30F

06/06 08:42, 10月前 , 31F
所看來不太一下,自己看診掛號多注意一下就可以觀察到
06/06 08:42, 31F

06/06 09:08, 10月前 , 32F
廣告業碼農也太有上進心
06/06 09:08, 32F

06/06 09:39, 10月前 , 33F
剛好公司最近在做類似的東西,沒做這麼複雜因為實體的
06/06 09:39, 33F

06/06 09:39, 10月前 , 34F
叫號機可以自己按號碼,醫生想先看誰就看誰XD
06/06 09:39, 34F

06/06 09:40, 10月前 , 35F
這麼簡單的功能,先上線,使用者有問題再改就好了
06/06 09:40, 35F

06/06 09:48, 10月前 , 36F
前提就錯了吧,這不是system design
06/06 09:48, 36F

06/06 09:57, 10月前 , 37F
喔喔 我想說leetcode有一題是design twitter 所以這
06/06 09:57, 37F

06/06 09:57, 10月前 , 38F
種只是算是物件設計嗎?
06/06 09:57, 38F
還有 139 則推文
還有 2 段內文
06/07 23:42, 10月前 , 178F
system design了 這樣都差不多4萬可領真的是上天眷顧
06/07 23:42, 178F

06/08 01:19, 10月前 , 179F
好吧 那先不要說這是system design好了,其實我上過
06/08 01:19, 179F

06/08 01:19, 10月前 , 180F
交大資結跟oop,這邊建議語言要先補充什麼呢,因為我t
06/08 01:19, 180F

06/08 01:19, 10月前 , 181F
hread也看了,但是現職工作就是一直堆商業邏輯,才想
06/08 01:19, 181F

06/08 01:19, 10月前 , 182F
說可以寫一些東西來進步的稅
06/08 01:19, 182F

06/08 01:23, 10月前 , 183F
有沒有什麼具體的考核點呢?因為所謂的更熟Java不知道
06/08 01:23, 183F

06/08 01:23, 10月前 , 184F
指的是更熟內建的資結的api嗎?還是什麼,因為如果沒
06/08 01:23, 184F

06/08 01:23, 10月前 , 185F
去看我現在不會的東西,好像就沒進步的感覺,還是說
06/08 01:23, 185F

06/08 01:23, 10月前 , 186F
我應該要去補充設計模式嗎?
06/08 01:23, 186F

06/08 01:24, 10月前 , 187F
那你就先寫個演唱會搶票系統 TDD跟DDD也瞭解一下
06/08 01:24, 187F

06/08 01:26, 10月前 , 188F
設計模式常用的幾招會就好 不一定要整本書都學完
06/08 01:26, 188F

06/08 01:27, 10月前 , 189F
很簡單 自己玩 現在都是用框架 外加有上頭 你很難玩
06/08 01:27, 189F

06/08 01:28, 10月前 , 190F
出什麼花樣 也很難領悟奧秘 但代價什麼自己想想 因為
06/08 01:28, 190F

06/08 01:29, 10月前 , 191F
有人會組擋你看穿本質
06/08 01:29, 191F

06/08 01:29, 10月前 , 192F
現在看起來是好開發了 但學得更多了
06/08 01:29, 192F

06/08 01:30, 10月前 , 193F
阻擋
06/08 01:30, 193F

06/08 01:33, 10月前 , 194F
演唱會搶票是指不要超賣嗎?那有需要記錄User是誰搶
06/08 01:33, 194F

06/08 01:33, 10月前 , 195F
到票這樣嗎?看過對岸的課程,但講的不深只有提到jvm
06/08 01:33, 195F

06/08 01:33, 10月前 , 196F
鎖或是分布式鎖
06/08 01:33, 196F

06/08 01:33, 10月前 , 197F
謝謝二位
06/08 01:33, 197F

06/08 01:34, 10月前 , 198F
別人是旁敲側擊學東西 你是旁敲側擊別人學東西
06/08 01:34, 198F

06/08 01:38, 10月前 , 199F
不要超賣只是整個系統中的一個小issue
06/08 01:38, 199F

06/08 01:40, 10月前 , 200F
你要想burwei大提出的那些問題
06/08 01:40, 200F

06/08 01:45, 10月前 , 201F
這根本沒意義 推文所考慮的點都是值得考量的
06/08 01:45, 201F

06/08 01:45, 10月前 , 202F
喔喔,了解了,謝謝哈哈
06/08 01:45, 202F

06/08 01:49, 10月前 , 203F
如果你想做正經的東西出來 但你這篇很糟糕
06/08 01:49, 203F

06/08 02:02, 10月前 , 204F
電商 影音串流 社群 instant messaging 都去github找看
06/08 02:02, 204F

06/08 02:02, 10月前 , 205F
看別人怎麼做 多注意介面怎麼設計 盡量畫圖幫助理解
06/08 02:02, 205F

06/08 09:06, 10月前 , 206F
好的謝謝
06/08 09:06, 206F

06/08 23:25, 10月前 , 207F
先把題目明確再來想怎麼做吧
06/08 23:25, 207F

06/08 23:25, 10月前 , 208F
一直出想法小專案都被擴成大問題了
06/08 23:25, 208F

06/08 23:25, 10月前 , 209F
門診掛號一路加到住院回診緊急開刀
06/08 23:25, 209F

06/08 23:25, 10月前 , 210F
要不要連哪個民代插隊比較有利也一起放進來?
06/08 23:25, 210F

06/09 16:08, 10月前 , 211F
公立醫院: 80歲敬老優先
06/09 16:08, 211F

06/10 00:55, 10月前 , 212F
有人做.google 一下
06/10 00:55, 212F

06/10 15:23, 10月前 , 213F
實務上一定是crud啦 不過之前去長庚看診在掛門號上好像沒
06/10 15:23, 213F

06/10 15:23, 10月前 , 214F
遇到什麼不便
06/10 15:23, 214F

06/11 23:18, 10月前 , 215F
你應該參考狀態設計模式 而不是建一堆flag
06/11 23:18, 215F

06/12 10:03, 10月前 , 216F
你用內存去搞?服務重啟怎麼辦
06/12 10:03, 216F

06/12 10:06, 10月前 , 217F
這個用資料庫讀寫鎖就完成 用 redis queue做序列
06/12 10:06, 217F
文章代碼(AID): #1aVXfSHH (Soft_Job)
文章代碼(AID): #1aVXfSHH (Soft_Job)