2011年01月12日 at 11:46 am
#1305
Keymaster
用Number作例子是不恰当的,如果这个Number是基本类型的话。相反,如果Number包含足够的业务逻辑,那么magic number的处理正应该是Number的职责。
一个通俗的tell, don’t ask的例子是:要一只狗跑,不是dog.getLegs().run(),而是dog.run(),即不是指挥狗的腿来跑,而是由狗自己负责调用腿来跑。事实上,指挥者根本不在乎狗有没有腿,只在乎它能不能跑。至于它用腿跑,还是聪明到能用嘴控制某个机动车来跑,则是狗的职责,不是指挥者的职责。因此“tell, don’t ask”是一种良好的职责分工原则,能使代码保持合理的抽象层次划分。
可以这么理解:tell代表一个抽象的命令,而ask代表(被命令对象的)具体执行方法或步骤。