我已经阅读了很多有关TDA以及getter和setter方法的利弊的文章,尽管我不一定同意我所阅读的所有内容,但前提是您应该始终告诉而不是询问,并且应该避免使用accessor方法,这是否意味着所有方法都应返回void以遵守这些准则/理想?
我知道实际上并不是所有方法都应该返回void,但是我只是想完全理解看待OOP的整个方法。我似乎在其他任何地方都找不到解释。
“告诉,不要问”本身就是一个愚蠢的,过于笼统的规则,而不是理想。
在理想的是,一个对象有一个工作,它的整个工作,它的类是你把代码,做这项工作的地方。
但是,许多开发人员认为存在这个问题,这使他们无法实现这一理想。
假设您正在与其他许多人共享的大型代码库中工作,并且您有一个特殊要求:在您的特定用例中,您需要对象X来不同地完成其工作。在某些方面,最安全的方法是将特殊情况的代码分开。这通常意味着您必须检测到特殊情况,查询X的状态,以便可以决定要在特殊情况下执行的操作,然后告诉X进行处理。
不幸的是,执行此操作通常会导致使特殊情况代码成为X工作的一部分。它正在查看与X无关的内部信息,并使用它来做出与业务无关的决策。现在,没有地方可以找到执行X任务的代码,即使您的小改动是安全的,每个人都很难弄清楚X任务的完成方式。
所以,不要这样做。“告诉,不要问”的“不要问”部分意味着不要再询问您没有业务看到并做出确实是X的工作的内部信息。
替代方案是告诉。向X添加一个方法或其他内容,让您说“我现在需要您做一些不同的工作”。但是,尽最大努力不要完全满足您的特殊小要求。然后,当出现特殊情况时,您只需告诉X需要了解什么,然后将涉及X内部状态的决策留给X。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句