【发布时间】:2008-10-04 00:48:40
【问题描述】:
Information-Expert、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);
支持告诉-不询问和信息专家但违反 SRP 的代码:
Customer bob = ...;
// Now Customer is doing more than just representing the domain concept of Customer,
// violates SRP
CustomerDTO dto = bob.toDTO();
请告诉我这些做法如何和平共存。
术语的定义,
信息专家:具有操作所需数据的对象应承载操作。
Tell Don't Ask:不要为了工作而向对象索取数据;告诉对象做这项工作。
单一职责原则:每个对象都应该有一个狭义的职责。
【问题讨论】:
-
对您正在使用的术语的简短介绍可能会有所帮助。
-
简短的回答是肯定的......长期的一个是有时人们(学者)忘记编程还不是一门完美的科学,..我们没有足够干净的语言来满足所有这些原则。打破最有意义的原则。
-
你的第二个例子确实违反了 SRP,但并不是一个告诉不要问的好例子。
标签: oop solid-principles single-responsibility-principle tell-dont-ask