Разве Информационный Эксперт и Скажи, Не спрашивай в противоречии с принципом Единой Ответственности?
Информационно-Expert, Скажи-не-Ask, а такжеSRP часто упоминаются вместе как лучшие практики. Но я думаю, что они расходятся. Вот о чем я говорю.
Код, который поддерживает SRP, но нарушает принцип «говорите, не спрашивайте» и «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();
Пожалуйста, напишите мне, как эти практики могут мирно сосуществовать.
Определения терминов,
Информационный эксперт: объекты, которые имеют данные, необходимые для операции, должны содержать операцию.
Скажите не спрашивайте: не запрашивайте у данных данные для выполнения работы; сказать объектам, чтобы сделать работу.
Принцип единой ответственности: каждый объект должен иметь узко определенную ответственность.