时间: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()等等。这个时候按照名单做事才是最好的办法。”