Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;告诉唐';“不要问,”他说;不应该';不是所有的方法都是无效的吗?_Java_Oop - Fatal编程技术网

Java &引用;告诉唐';“不要问,”他说;不应该';不是所有的方法都是无效的吗?

Java &引用;告诉唐';“不要问,”他说;不应该';不是所有的方法都是无效的吗?,java,oop,Java,Oop,我已经读了很多关于TDA以及getter和setter方法的优缺点的书,虽然我不一定同意我读到的所有内容,但假设你应该总是告诉而不是问,并且你应该尽可能避免使用accessor方法,这难道不意味着所有方法都应该返回void以符合这些准则/理想吗 我明白,实际上并不是所有方法都应该返回void,但我只是想完全理解看待OOP的整个方式。我似乎在其他任何地方都找不到解释。“说,不要问”,这本身就是一个愚蠢的过度概括的规则,而不是一个理想 理想情况是一个对象有一个任务,它完成整个任务,它的类是您放置执行

我已经读了很多关于TDA以及getter和setter方法的优缺点的书,虽然我不一定同意我读到的所有内容,但假设你应该总是告诉而不是问,并且你应该尽可能避免使用accessor方法,这难道不意味着所有方法都应该返回void以符合这些准则/理想吗

我明白,实际上并不是所有方法都应该返回void,但我只是想完全理解看待OOP的整个方式。我似乎在其他任何地方都找不到解释。

“说,不要问”,这本身就是一个愚蠢的过度概括的规则,而不是一个理想

理想情况是一个对象有一个任务,它完成整个任务,它的类是您放置执行该任务的代码的位置

但是,在许多开发人员的头脑中,有一个问题使得他们妥协了这个理想

假设您在一个与许多其他人共享的大型代码库中工作,您得到了一个特殊的要求:在您的特定用例中,您需要ObjectX以不同的方式完成其工作。在某些方面,最安全的方法是将特殊情况的代码分开。这通常意味着您必须检测您的特殊情况,查询X的状态,以便您可以决定在您的特殊情况下希望它做什么,然后告诉X去做

不幸的是,当您这样做时,通常会发生的情况是,您使您的特例代码成为X工作的一部分。它查看的是关于X的内部信息,它没有必要查看这些信息,并使用这些信息来做出它没有必要做出的决策。现在,没有一个地方可以找到执行X工作的代码,即使您的小更改是安全的,但对于每个人来说,要想知道X的工作是如何完成的,要困难得多

所以,不要这样做。“告诉,不要问”的“不要问”部分意味着不要再问这些内部信息,你没有必要看到这些信息,也不要做真正是X的工作的决定

另一种选择是告诉别人。给X添加一个方法或东西,让你说“我需要你现在做一些不同的工作”。尽管如此,你还是要努力做到不满足你的特殊要求。然后,当你的特例出现时,你只需告诉X它需要知道的东西,然后把涉及X内部状态的决定留给X