Являются ли свободные интерфейсы нарушением принципа разделения командных запросов? - PullRequest
6 голосов
/ 16 марта 2012

Я начал писать беглый интерфейс и взглянул на более раннюю статью, написанную Мартином Фаулером о беглых интерфейсах (которую я не понимал, когда он и Эрик Эванс придумали этот термин).В этой статье Мартин упоминает, что сеттеры обычно возвращают экземпляр объекта, который настраивается или обрабатывается, что, по его словам, является нарушением CQS.методы являются недействительными, что мне нравится, потому что оно следует принципу CommandQuerySeparation.Это соглашение мешает плавному интерфейсу, поэтому я склонен приостановить действие соглашения для этого случая.

Так что, если мой свободный интерфейс делает что-то вроде:

myObject
  .useRepository("Stuff")
  .withTransactionSupport()
    .retries(3)
  .logWarnings()
  .logErrors();

Является ли это действительно нарушением CQS?

ОБНОВЛЕНИЕ Я выделил свой образец, чтобы отобразить предупреждения и ошибки регистрации в виде отдельных действий.

Ответы [ 3 ]

9 голосов
/ 16 марта 2012

Да, это так.Все эти методы, очевидно, возвращают что-то, и в равной степени очевидно, что они имеют побочные эффекты (судя по тому факту, что вы ничего не делаете с возвращаемым значением, но все же удосужились вызвать их).Поскольку определение CQS гласит, что мутаторы не должны возвращать значение, у нас есть явное нарушение.

Но имеет ли значение для вас, что CQS нарушается?Если свободный интерфейс делает вас более продуктивным во всех отношениях, и если вы считаете его хорошо известным шаблоном с одинаково известными преимуществами и недостатками, почему должно иметь значение, если оно нарушает принцип X на бумаге?1005 *

3 голосов
/ 16 марта 2012

Он нарушает этот принцип, когда изменяет объекты, но не когда возвращает только новый объект.

var newObject = myObject
    .useRepository("Stuff")
    .withTransactionSupport()
    .retries(3)
    .logWarningsAndErrors(); 

Если myObject не меняется после этого оператора, все в порядке.Говоря в общем, свободный интерфейс нарушает принцип CQS, если и только если он имеет побочные эффекты.

Однако вопрос в том, представляет ли ваш пример запрос вообще.«Свободно» означает обязательно «запрос»?Вероятно, это можно было бы просто воспринимать как интерфейс action-fluent, где один и тот же объект передается от одного действия к другому.

0 голосов
/ 16 марта 2012

Нет. Шаблон здесь «Конфигурация». Такие команды конфигурации возвращают сам объект конфигурации как противоположность чему-то, не связанному с командой. Нарушение разделения команд / запросов произойдет, если команды, которые служат цели конфигурации, вернут некоторые несвязанные данные, например:

if (myObject.UseRepository("Stuff") > 1 && myObject.UseRepository("Bla") < 5) {
    // oh, good, some invisible stuff internal to myObject is in right interval...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...