我一直在阅读很多关于TDA以及getter和setter方法的优点和缺点,虽然我不一定同意我读过的所有内容,假设你应该总是告诉而不是问,而你应该尽可能避免使用存取方法,这是否意味着所有方法都应该返回无效以符合这些准则/理想?
我理解现实并非所有方法都应该返回void,但我只想完全理解这种看待OOP的方式。我似乎无法在其他任何地方找到解释。
答案 0 :(得分:7)
"告诉,不要问",所有这些都是一个愚蠢的过于概括的规则,而不是一个理想的规则。
理想是一个对象有一个作业,它执行整个作业,它的类是你放置代码的地方做那件事。
但是,许多开发人员认为这个问题会让他们妥协这个理想......
让我们假设您正在与很多其他人共享的大型代码库中工作,并且您得到了一个特殊要求:在您的特定用例中,您需要对象X来完成其工作不同。在某些方面,最安全的方法是将特殊情况的代码分开。这通常意味着您必须检测您的特殊情况,查询X的状态,以便您可以在特殊情况下决定您希望它做什么,然后告诉X执行此操作。
不幸的是,当你这样做时通常会发生的事情是,你让你的特殊案例代码成为X工作的一部分。它正在查看有关X的内部信息,它没有业务关注,并使用它来做出没有业务的决策。现在没有一个地方可以找到执行X工作的代码,即使你的小改变是安全的,但是每个人都很难弄清楚X&X的工作方式#39;工作完成了。
所以,不要这样做。不要问"不要问" "告诉,不要问"意味着停止询问您没有业务所见的内部信息,并做出真正X工作的决定。
另一种方法是告诉。向X添加一个方法或某些东西,让你说“我需要你现在有点不同的工作"。尽管如此,请努力尝试不以完全满足您的特殊要求。然后,当您的特殊情况出现时,您只需告诉X需要了解的内容,并将涉及X内部状态的决策留给X.