信息专家,Tell-Don't-Ask和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();
请告诉我这些做法如何能够和平共处.
术语的定义,
信息专家:具有操作所需数据的对象应承载该操作.
告诉不要问:不要向对象询问数据以便工作; 告诉对象做这项工作.
单一责任原则:每个对象应具有狭义的责任.
Hamish Smith.. 8
我不认为他们是如此矛盾,因为他们正在强调会导致你痛苦的不同事物.一个是关于构造代码以明确特定职责的位置并减少耦合,另一个是关于减少修改类的原因.
我们每个人都必须每天做出关于如何构建代码以及我们愿意在设计中引入哪些依赖关系的决策.
我们已经建立了许多有用的指导方针,格言和模式,可以帮助我们做出决策.
这些中的每一个都有助于检测我们的设计中可能存在的各种问题.对于您可能正在查看的任何特定问题,某处会有一个甜蜜点.
不同的指导方针确实相互矛盾.只需应用您听过或读过的每一条指导都不会使您的设计更好.
对于您今天看到的具体问题,您需要确定可能导致您疼痛的最重要因素.
我不认为他们是如此矛盾,因为他们正在强调会导致你痛苦的不同事物.一个是关于构造代码以明确特定职责的位置并减少耦合,另一个是关于减少修改类的原因.
我们每个人都必须每天做出关于如何构建代码以及我们愿意在设计中引入哪些依赖关系的决策.
我们已经建立了许多有用的指导方针,格言和模式,可以帮助我们做出决策.
这些中的每一个都有助于检测我们的设计中可能存在的各种问题.对于您可能正在查看的任何特定问题,某处会有一个甜蜜点.
不同的指导方针确实相互矛盾.只需应用您听过或读过的每一条指导都不会使您的设计更好.
对于您今天看到的具体问题,您需要确定可能导致您疼痛的最重要因素.
You can talk about "Tell Don't Ask" when you ask for object's state in order to tell object to do something.
In your first example TransferObjectFactory.createFrom just a converter. It doesn't tell Customer object to do something after inspecting it's state.
I think first example is correct.