经常将信息专家,告诉不要询问和SRP称为最佳实践。但是我认为它们是矛盾的。这就是我在说的。

支持SRP但违反了Tell-Don't-Ask和Info-Expert的代码:

Customer bob = ...;
// TransferObjectFactory has to use Customer's accessors to do its work,
// violates Tell Don't Ask
CustomerDTO dto = TransferObjectFactory.createFrom(bob);

支持Tell-Don't-Ask和Info-Expert但违反SRP的代码:
Customer bob = ...;
// Now Customer is doing more than just representing the domain concept of Customer,
// violates SRP
CustomerDTO dto = bob.toDTO();

请向我介绍这些做法如何和平共处。

术语的定义
  • Information Expert:具有操作所需数据的对象应承载该操作。
  • 告诉不要问:不要为了工作而向对象索要数据;告诉对象去做这项工作。
  • 单一责任原则:每个对象都应具有狭义的责任。
  • 最佳答案

    我认为他们并没有强调太多会导致您痛苦的事情,他们并没有太大的分歧。一种是关于结构化代码以明确特定职责的位置并减少耦合,另一种是关于减少修改类的原因。

    我们每个人每天都必须做出关于如何构造代码以及我们愿意在设计中引入哪些依赖性的决策。

    我们建立了许多有用的准则,准则和模式,可以帮助我们做出决策。

    这些中的每一个对于检测我们设计中可能存在的不同类型的问题都是有用的。对于您可能要解决的任何特定问题,某个地方都会有一个最佳解决方案。

    不同的准则确实相互矛盾。仅应用您所听到或阅读的每条指南都不会使您的设计更好。

    对于今天要解决的特定问题,您需要确定可能导致您痛苦的最重要因素是什么。

    09-13 10:57