時間:1月13日地點:大B房間人物:大B,校
大B:“假如你有10個全能工人,10樣相同工作。工作都要做完,而且大喊一聲所有人去工作?!?
小A:“嗯?”
大B:“當條件變了,工人不是全能,但是工作相同?!?
小A:“OK,問題不大?!?
大B:“條件再變,工作不是相同,但工人是全能。”
小A:“OK,問題不大?!?
大B:“以上三種情況在現實生活中是很少發生的,最多的情況是這樣:10個工人,每人會做一種工作,10樣工作。你用一份名單寫著誰做什麼。但你不認識任何人。這個時候你怎麼指揮呢?”
小A:“可以一個個的叫工人,然後問他們名字,認識他們,查名單,告訴他們做什麼工作。”
大B:“這是個辦法。還可以怎麼指揮呢?”
小A:“你可以直接叫出他們名字,告訴他們幹什麼,不需要知到他是誰?!?
大B:“看起來很簡單。但如果你要指揮10萬人呢?而且人員是流動的,每天的人不同,你每天拿到一張文檔。”
小A:“這樣的話就比較麻煩了。”
大B:“其實很簡單,最常用的做法是,你把這份名單貼在牆上,然後大喊一聲,所有人按照去看,按照自己的分配情況去做?!?
小A:“嘿嘿!這個方法不錯喔!”
大B:“這裡利用的關鍵點是‘所有工人自己認識自己’,你不能苛求每個工人會做所有工作,不能苛求所有工作相同,但你能要求所有工人都認識自己。”
小A:“嗯。”
大B:“再想想我們開始的程序,每個工人對應著PA,PB,PC,PD,PE……所有的工人都使工人P,每個工人會做的東西不一樣runPA,runPB,runPC,你有一份名單Visitor(重載)記錄著誰做什麼工作?!?
小A:“爲什麼不把這些方法的方法名做成一樣的,那就可以解決了。例如,我們每個PA,PB,PC都加入一個run方法,然後run內部再調用自己對應的runPx()方法?!?
大B:“有些時候從不同的角度考慮,或者因爲實現的複雜度早成很難統一方法名。例如上邊指揮人工作的例子的例子,其實run方法就是大叫一聲去工作,因爲每個工人只會做一種工作,所以能行,但我們不能要求所有人只能會做一種事情,這個要求很愚蠢。所以如果每個工人會幹兩種或者多種工作呢,也就是我PA有runPA()walkPA()等等方法,PB有runPB()climbPB()等等。這個時候按照名單做事纔是最好的辦法?!?