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
Language agnostic 面向对象设计问题-链接到前体_Language Agnostic_Oop - Fatal编程技术网

Language agnostic 面向对象设计问题-链接到前体

Language agnostic 面向对象设计问题-链接到前体,language-agnostic,oop,Language Agnostic,Oop,我正在编写一个程序来进行搜索并导出输出。 我有三个主要目标: 请求 搜索结果 输出量 这些物体中的每一个都与它的前身有关 Ie:导出输出->搜索结果->请求 这样行吗?它们是否应该更松散地耦合 澄清: 以后的进程确实会在前体对象上使用属性和方法 即: SendEmail(output.SearchResults.Request.UserEmail, BODY, SUBJECT); 这甚至对我来说都有味道。我能想到的唯一解决办法是在每个层中都有隐藏属性,这样我只能访问一个层 MailAddr

我正在编写一个程序来进行搜索并导出输出。
我有三个主要目标:

  • 请求
  • 搜索结果
  • 输出量
这些物体中的每一个都与它的前身有关

Ie:导出输出->搜索结果->请求

这样行吗?它们是否应该更松散地耦合

澄清:

以后的进程确实会在前体对象上使用属性和方法

即:

SendEmail(output.SearchResults.Request.UserEmail, BODY, SUBJECT);
这甚至对我来说都有味道。我能想到的唯一解决办法是在每个层中都有隐藏属性,这样我只能访问一个层

MailAddress UserEmail
{
  get { return SearchResults.UserEmail; }
}
哪一个是可以的

SendEmail(output.UserEmail, BODY, SUBJECT);
但同样,这只是隐藏了问题。 我可以将前体对象中的所有内容复制到它们的后续对象中,但这会使输出变得非常丑陋。它们是考虑这些对象的更好方法


注意:SearchResults实现IDisposable,因为它链接到非托管资源(临时文件),所以我真的不想在ExportOutput中复制它。

如果A直接使用B,您不能:

  • 重用A而不重用B
  • 测试A与B隔离
  • 在不破坏A的情况下改变B
如果您设计/编程为接口,您可以:

  • 重用A而不重用B—您只需要提供实现与B相同接口的东西
  • 单独测试A和B-您只需要替换一个模拟对象
  • 在不破坏A的情况下更改B-因为A依赖于接口-而不是B

因此,我建议至少提取接口。另外,这对您来说可能是一个很好的读物(PDF文件)。

在不了解您的具体情况的情况下,我认为任何形式的结果都可以从请求的方法返回(可能是来自配置请求的多个这样的方法,如find_first_instance vs.find_all_instance)。然后,导出器的输出方法将结果作为输入。因此,我根本不认为需要链接对象。

“在与B隔离的情况下测试A”-这不是真的,您只需要使用一个模拟框架来模拟任何类型的类。事实上,许多人不能做到这一点,这是他们的不足之处。OO设计不应该仅仅因为测试框架的限制而受到约束或弯曲——只要找到一个更好的框架就行了!此外,“更改B而不破坏A”在提取接口和不提取接口的情况下都是一样的-添加新成员对于直接类访问来说不是破坏性的更改,而删除则是破坏性的更改,即使有接口。@Pavel:关于“更改B而不破坏A”,如果A与B密切相关,如果您对B进行了一个实现更改,则可能会将错误引入a(从a用户的角度来看)。