Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Oop 如何对返回';告诉别人不要问';物体?_Oop_Unit Testing_Tell Dont Ask - Fatal编程技术网

Oop 如何对返回';告诉别人不要问';物体?

Oop 如何对返回';告诉别人不要问';物体?,oop,unit-testing,tell-dont-ask,Oop,Unit Testing,Tell Dont Ask,我有两个类,Parser和Item。如果调用类似于Parser::GetItem(int some_id)的东西,Parser类解析一些结构化文档并返回Item-对象。 Item类是根据“告诉-不要问”原则编写的。我的意思是,它没有几个内部变量的getter方法,这些内部变量是由解析器在构造时填充的 现在的问题是:如何对解析器类进行单元测试?如何检查内部项变量是否正确解析? 我必须重新安排我的课程吗? 解析器接口返回完全构造的项对象可能是糟糕的设计吗?您的设计可能不理想,但不查看代码就很难知道

我有两个类,
Parser
Item
。如果调用类似于
Parser::GetItem(int some_id)
的东西,Parser类解析一些结构化文档并返回
Item
-对象。 Item类是根据“告诉-不要问”原则编写的。我的意思是,它没有几个内部变量的getter方法,这些内部变量是由
解析器在构造时填充的

现在的问题是:如何对
解析器
类进行单元测试?如何检查内部
变量是否正确解析?
我必须重新安排我的课程吗?
解析器接口返回完全构造的
对象可能是糟糕的设计吗?

您的设计可能不理想,但不查看代码就很难知道

需要问问自己的是,解析器隐藏了太多的信息,因此做了太多的工作


我强烈建议您观看Michael Feather的演示,其中(有趣的是)他讨论了如何使用测试改进解析器的设计,看起来他解决的问题与您试图解决的问题类似

现在我已经将解析器分为两个类。实际的解析器,它只在结构和项生成器类中存储字符串。后者从解析器获取所需的结构,并执行所有转换和检查工作,如将字符串转换为数字。。现在我至少可以检查解析器是否从文档中提取了正确的信息。但问题仍然存在,因为我无法检查item builder中的所有转换是否正常工作。我认为我应该尽量减少项目生成器的功能,并尽可能多地替换为可测试的帮助器类。谢谢你的回答!我想你抓住了关键点,我的解析器太大了。也谢谢你的链接。我待会再看。