看板 Soft_Job
作者 empireisme (empireisme)
標題 [討論] 醫院的排隊叫號機怎麼設計比較好
時間 Tue Jun  6 01:24:40 2023


如題

這不是作業,也不是我公司的工作(小弟在數位廣告業當碼農,在台北扣完勞健保大概快四萬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
SeeDoctor/src at master ·  empireisme/SeeDoctor ·  GitHub
[圖]
Contribute to empireisme/SeeDoctor development by creating an account on GitHub. ...

 

懶得看github的人

我直接貼code

https://imgur.com/jKRcBmK
[圖]

https://imgur.com/UW2yp0z
[圖]

我這邊為了各種防呆,宣告了一堆 flag

感覺程式碼沒有寫的很好

想請問各位先進,有沒有甚麼可以改善的方法,或是思路

謝謝各位年薪三百萬


--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.227.13.10 (臺灣)
※ 作者: empireisme 2023-06-06 01:24:40
※ 文章代碼(AID): #1aVXfSHH (Soft_Job)
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1685985884.A.451.html
kissmickey: 不是你想怎麼寫就怎麼寫
是以醫院制度醫生跟護理師說的算1F 06/06 01:47
abccbaandy: 建議把你手上的專案優化比較實在...3F 06/06 01:57
jyunwei: 現實當然很難,但想想也沒關係吧4F 06/06 02:31
Burwei: 這感覺比較像是OOP隨堂小練習XD
可以多想一下要變成一個可以用的系統,會有哪些service、資料怎麼傳遞、db怎麼設計之類的5F 06/06 02:34
WTS2accuracy: 當下號碼為n,叫號未到的號碼x存set
過號者x重新註冊時去查set
x在set的話從set踢出 塞入 pq<K,V> = (n+3,x)
pq 依K排序
每次叫號 if(pq.peek().K <= n) 改叫過號者號碼
之後做pq.poll() 如果再度過號就重新塞進set
應該連OOP都用不太到 現成的資結就能實作了8F 06/06 02:58
BigCockman: 你這是OOP跟系統設計沒什麼關聯 這就簡單的CRUD就能解決了 頂多就是思考怎麼解決多人同時預約熱門醫生的問題15F 06/06 03:05
lazarus1121: 實務上一定是crud吧,大概四個欄位就搞定了
好像需要五個,編號,id,是否掛號,是否看完,掛號時間18F 06/06 08:03
codepo: 現在的醫院叫號機應該還有一些病人的優先順序,例如高齡病患的順序比般人高之類的,然後再疊加上去是否已過號,過號病患插卡後,會等兩位未過號的病患看診完就輪到他,此時他的優先度又比其他人高,可以再多觀察看看叫號機的實務狀況20F 06/06 08:14
yamagishi: 開三條thread放東西就好
main
準備要進入main的(max3)
skip
變數只用一個 priority,剩下都是內部的商業邏輯處理25F 06/06 08:27

這樣會有share resource的問題嗎
還是我想太多了
你的pq 是怎麼決定順序的阿
OriginStar: 我以為掛號機的目的是如何取最大的公平性,每家醫院診所看來不太一下,自己看診掛號多注意一下就可以觀察到30F 06/06 08:41
tmdla: 廣告業碼農也太有上進心32F 06/06 09:08
devilkool: 剛好公司最近在做類似的東西,沒做這麼複雜因為實體的叫號機可以自己按號碼,醫生想先看誰就看誰XD33F 06/06 09:39
stupid0319: 這麼簡單的功能,先上線,使用者有問題再改就好了35F 06/06 09:40
ashlikewing: 前提就錯了吧,這不是system design36F 06/06 09:48
empireisme: 喔喔 我想說leetcode有一題是design twitter 所以這種只是算是物件設計嗎?37F 06/06 09:57
quickbym1: 已經從 OOP 下手了,可以從 OOA 的角度先找關聯性39F 06/06 09:59
Sunal: 只有表面看起來公平,裡面醫生要先看幾號就按幾號40F 06/06 10:14
brucetu: 在現場都沒有發現自己被醫生跳號過 XD41F 06/06 10:29
empireisme: 其實我有發現,但能怎樣,還是要加入一個強制跳號功42F 06/06 10:31
brucetu: 討論題目是不需要跟真實世界情況一致的
只要專注在想要討論的點就可以了44F 06/06 10:36
Sunal: 這功能不能太常用啊 不然整天逛醫院的老人家會抗議46F 06/06 10:37
gmoz: 這題目難的是需求分析跟訪談 寫code不算問題47F 06/06 11:34
qss05: 可是我看大部分的,過號他就直接停在那裡,然後人工出來叫,等到知會過的都看完了,號碼就繼續往下按,會來回顯示的反而很少48F 06/06 11:37
gmoz: 而且還要分掛號順序跟 報到順序(含過號報到)
最重要的設計其實在人工介入的部分XD51F 06/06 11:37
TConvertible: 簡單的事情不用寫得很複雜,放在 list 裡面就好吧53F 06/06 11:39
SHANGOYANYI: 醫院取號這東西 考慮線上取號的話 最極端情況應該就等於售票系統 瞬間一堆連線進來時系統要撐得住 然後要有一套算法去決定誰搶到幾號這樣54F 06/06 12:59
maybeilikeu: 叫號機沒用,還是會有人一直問護理師可不可以先看57F 06/06 14:08
Kendai: 這個東西需要整合到HIS裡面,而且是寡占,可以研究但沒市場58F 06/06 15:13
oyaji5566: 發給護士一個擴音喇叭,她說幾號就是幾號
更正 是護理師59F 06/06 16:17
xam: 這個題目還有個重點是要設計一個可抽換的策略模組啊..
因為規則每家可能要的都不一樣,而且還會變...61F 06/06 16:35
luke72: 一個list就解決了,不用複雜化吧…63F 06/06 16:56
B0988698088: 你忘了設計有民代關說喬床位時有user會無視queue直接排到最前面的問題64F 06/06 17:17
ManInBlack: 蠻有趣的啊,有點類似設計電梯的題目66F 06/06 17:25
vi000246: 現在結合線上掛號 還會有報到功能 到現場插健保卡報到67F 06/06 18:01
Sunal: 有沒有看過醫生一開診直接把所有號碼按完,所有人都變過號之後就看誰先報到先看了68F 06/06 18:09
superpandal: 這個很簡單 你需要的是讀寫鎖 外加一個list 你用的70F 06/06 19:11
brucetu: 說一個list解決的去看一下system design在玩什麼吧 又不是學校寫作業71F 06/06 19:11
superpandal: linkedlist就很不錯 病人申請是寫 醫生更改順序也是寫 只是你需要儲存當前的順序 建議儲存在硬碟 整個物73F 06/06 19:12
brucetu: 既然是當作SD題目討論 那就不是要問你怎麼樣最簡單寫code實現功能 也不是要你自己想像題目沒提到的use case讓討論越來越發散75F 06/06 19:15
請問B大 如果不討論use case 也不是討論實現功能,是要討論每個函數的職責嗎
還是每個class的用途 謝謝
superpandal: 件儲存在硬碟一個檔案 每個醫生一個檔
當然資料庫也可以 但有點太肥
務實操作 不打高空78F 06/06 19:16
layer0930: 實際上user 只有登入醫院的系統以及醫院的實體機器。這應該流量不會很大吧
看起來就算不存db,只用 一個list也搞定81F 06/06 19:35
hobnob: 精神可嘉84F 06/06 20:10
HeIIoWorId: 這題目覺得有趣,之前看到的情境是病患看診後,醫師決定要排當日檢查,檢查完畢後還要回來診間報到,此外他還有可能是年長者,必須優先進入,光是這些情境就有不少要判斷的事情了85F 06/06 20:17
freeunixer: 有些醫院會故意把網路掛號的排在很後面,現掛的較優先當天檢完馬上要回來的,醫生會要他回來後直接敲門告知至於喬床位不需要考慮,因為需要喬床位表示已經沒床位,沒床位那就根本沒法先預約病床了,就無關系統預約了.89F 06/06 20:43
superpandal: 都還好 不就是list內結構需要有什麼field 目前能想到最麻煩就是不只一個人可以改順序的問題 但這情況讓它存在就很奇妙 有的話必須引入diff機制93F 06/06 20:57
Sunal: 就算討論發散也是很正常的
網路上也不是所有人都會跟你認真的討論。回過頭來說,真實世界就是會有那麼多奇奇怪怪規則96F 06/06 21:29
※ 編輯: empireisme (36.227.13.10 臺灣), 06/06/2023 21:52:02
luke72: SD在玩什麼?你是問實務還是考試還是粉絲向?
這種人為遠大於系統的,實務上就是list+插隊搞定
不然你提個系統能符合所有醫生的規矩啊,沒接過業務喔
不然為什麼考試都問搶票系統,選課系統,從未考過醫院99F 06/06 21:49
WWIII: 快四萬先辭職吧 怎麼生活啊103F 06/07 01:32
empireisme: 靠年終生活,而且我還四大碩qq 但當然不是電資
考試好像很喜歡考短網址哈哈104F 06/07 08:48
brucetu: 因為短網址很多知識點可以討論 算是背答案的題
你這題因為你已經把scale限縮 硬要討論效能瓶頸有點怪
你如果改成提供全國醫院統一使用的線上預約系統
就變成類似搶票系統的標準題
然後答題方式你google一下就很多了
只有一間醫院 一個診間 就沒有concurrency以及資料量的問題,SD題目也不是要面試者天馬行空自己引入其他需求106F 06/07 08:55
empireisme: 喔喔 因為我原本想說想要實作具有擴充性的程式碼,萬一如果抽換看病的規則的話
之前看到有人討論過電商的折價券,雖然沒牽涉到併發,但我覺得已經夠複雜了Qq113F 06/07 09:04
brucetu: 其實SD不考寫code 但我還是離題順便說一下那個code,建議不要讓Patient直接存取queue,他可以向診間預約報名,queue應該是診間的private member,封裝在診間內,排隊邏輯怎麼實作外面不用知道。如果你有一天要換成用magic queue來實作,外面不用知道magic queue的存在,也不用參考,病患只要知道他可以向診間線上報名就好了。
你想做可抽換排隊邏輯是對的,更好的做法是有一個interface定義排隊機,讓診間選擇使用哪一個
這樣診間也不用看到data structure117F 06/07 09:10
empireisme: 所以病人掛號的那個Function input是排隊機嗎?那醫院是還要被排隊機依賴注入嗎?126F 06/07 09:27
brucetu: 可以用工廠模式讓診間取得他要使用的排隊機
用 clinic.register(catient);  註冊病患
*patient
https://ppt.cc/fst4sx
這只是OOP的部分 系統設計可以看資料要怎麼存取128F 06/07 12:25
C# API 預約診所 (C# API appointment)
A conversational AI system that listens, learns, and challenges ...

 

--
--
(empireisme.): [討論] 醫院的排隊叫號機怎麼設計比較好 - Soft_Job板