这些年来,我总是忽略了“告诉,不要问”OOP原则,因为我几天前第一次了解到它。“告诉,不问”适用于用户输入验证吗?
但是上下文是关于验证代码的讨论,这些验证代码已经从ASP.NET Web窗体页面移出到数据/业务对象中,并且没有“Validate()”方法,只是一种保存方法本身做了验证和(据说)提出了一个例外。我问这是为什么这样设计的,我被引导到OOP的“告诉,不要问”的原理,这是我从来没有听说过的,所以我们一起看了谷歌,我立即受到了教育。 ;)
尽管如此,某些东西并没有正确的味道,但不应该在数据从用户手中转移出去并进入处理和/或收集的业务层之前进行清理,而不是反过来?我很困惑这是如何为优秀的设计做出的。
似乎“告诉,不要问”的规则属于这样的想法,即您不应该向目标对象询问目标对象的状态,并且该原则从未真正意图应用于数据正在通过到的目标对象。
例外情况可用于处理意外情况(内存不足/磁盘已满/连接已关闭/分布式事务失败) - 验证用户提交的数据并非意外。使用“处理程序”方法 - 只需调用validate_number(invalid_handler_callback) – 2011-04-03 23:08:33