Я часто использую шаблон, в котором я использую цепочку методов для настройки объекта, аналогичного шаблону Builder
или Prototype
, но не создаю новые объекты при каждом вызове метода, вместо этого изменяя исходный объект.
Пример:
new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");
Просто интересно, есть ли название для этого шаблона и считается ли он анти-шаблоном, потому что, хотя он может читать более свободно, он может привести к длинным цепочкам методов.
menu.withStyle("")
без контекста. Вам нужно два API в таком случае.Ответы:
Свободный интерфейс
Я всегда слышал о том, чтобы этот метод назывался « беглым интерфейсом », как его придумали Эрик Эванс (из известной доменно-управляемой разработки ) и Мартин Фаулер (из известной гибкой манифесты ).
Основными недостатками являются удобочитаемость (которую некоторые люди любят, а некоторые ненавидят), а также тот факт, что в некоторых случаях отладку может быть сложнее, потому что вся цепочка действий может рассматриваться как одно утверждение при ее прохождении.
Я, конечно, не считаю это анти-паттерном, хотя сам использовал эту технику всего несколько раз.
источник
Подобный метод цепочки обычно называется плавным интерфейсом, когда в цепочке есть какой-то поток или обнаруживаемость. В качестве альтернативы, вы можете думать о API, подобном jQuery, который в значительной степени опирается на цепочку методов, как о «не беглом», потому что акцент не делается на обнаружении - он больше для удобства.
Для вашего примера (с использованием withx, withy) вы можете рассматривать это как вариант шаблона Builder, потому что у вас есть специализированный класс, который, учитывая некоторое состояние (вызовы методов), знает, как вернуть правильно сконфигурированный объект.
Это не анти-паттерн, если используется правильно.
источник
определенно не анти-шаблон. JQuery, вероятно, наиболее хорошо используемая реализация этого.
Да, может, но какова альтернатива? Вы можете закончить почти простым английским предложением, с api, направляющим вас к тому, что доступно и уместно.
источник
Это называется «крушение поезда».
(Это анти-шаблон и против чистого кода)
Паттерн «крушение поезда» нарушает закон Деметры .
источник
a.getB().getC().doSomething()
. Этот пример плох, потому что «Ваш метод может вызывать методы непосредственно в своих собственных полях (но не в полях полей)». Здесь есть только 1 объект, который создается, и «вы можете играть с игрушками, которые вы сделали сами».