Использовать шаблон построителя для методов со многими параметрами?

Я прочитал рекомендацию в «Эффективной Java» использовать шаблон Builder, когда сталкиваюсь с конструкторами, использующими множество параметров.

Применяется ли тот же шаблон к методам с большим количеством параметров?


person blue-sky    schedule 05.11.2013    source источник
comment
Я не вижу, как реализовать шаблон Builder в методе так, как реализован Builder, я просто рассмотрю возможность использования Composite и передачи нулевых параметров необязательным.   -  person RamonBoza    schedule 05.11.2013
comment
Рассматривали ли вы возможность использования varargs?   -  person Zong    schedule 05.11.2013
comment
Считаю вопрос неактуальным. Шаблон Builder — это шаблон созидательного проектирования, и вы говорите о методах, которые в основном имеют дело с поведенческими шаблонами проектирования.   -  person Abhijith Nagarajan    schedule 05.11.2013
comment
Вы должны предоставить конкретный пример/сценарий использования.   -  person tucuxi    schedule 05.11.2013
comment
Ну, когда вы создаете объект, содержащий значения параметров, чтобы сократить список параметров, применимость шаблона построителя к этому объекту параметров является естественным следствием.   -  person Holger    schedule 05.11.2013


Ответы (3)


Да вроде. По сути, вы создаете новый тип для инкапсуляции всех параметров или, может быть, только некоторых из них.

Теперь вы можете создать построитель, а затем неизменяемую версию типа — или вы можете просто разрешить изменять тип «убер-параметра» и передать его напрямую. В последнем случае вы не У шаблона построителя как такового нет, но вы можете своего рода рассматривать его как построение самого вызова метода, поскольку вы можете указать каждый аспект вызова метода отдельно. Вы можете возразить, что шаблон построителя на самом деле является частным случаем этого шаблона, в некотором роде - так уж получилось, что метод build() обычно находится в построителе, а не имеет построителя в качестве параметра метода в другом месте, но существует определенная корреляция между как они работают.

Примером этого в среде .NET является XmlWriterSettings, который передается в набор методов или конструкторов. (Он как бы используется в качестве построителя, обычно он используется при построении XmlWriter.) Я не могу сейчас придумать какие-либо примеры в стандартной библиотеке Java, но они могут где-то существовать...

Однако, если вы обнаружите, что у вас много параметров, стоит еще раз взглянуть на дизайн, чтобы проверить, не следует ли вам в любом случае сгруппировать некоторые из них вместе, как часть обычного дизайна.

person Jon Skeet    schedule 05.11.2013
comment
Кроме того, посмотрите, можете ли вы использовать интерфейс для предоставления аргументов метода, а не конкретный тип — это поможет заставить то, что вам действительно нужно в методе, выйти на передний план (объекты, которые содержат эту информацию, часто будут иметь другие свойства и методы, которые вы можете использовать). не нужны, например сеттеры, когда вам нужны только геттеры и т. д.). - person MetroidFan2002; 05.11.2013
comment
@MetroidFan2002: Хм... если бы я разрабатывал тип специально для вызова метода, я бы все равно не хотел повторно использовать существующие классы, я подозреваю. В некоторых случаях это может быть уместно, но я не думаю, что сам использовал этот шаблон. - person Jon Skeet; 05.11.2013
comment
@Jon_Skeet Иногда при реализации довольно легко создать объект, который украшает связанные объекты соответствующей информацией после того, как вы конкретизировали свой интерфейс - все, конечно, зависит от вашей модели. - person MetroidFan2002; 06.11.2013

Не совсем так, потому что Builder создает объект.

Так какой смысл менять какой-то метод, который черт знает что делает, на Builder?

Что вы должны делать с методами, содержащими слишком много аргументов, например:

  • разбить его на более мелкие методы,
  • использовать varargs
  • используйте некоторые Collection для ввода аргументов того же типа
person Eel Lee    schedule 05.11.2013

Превращение метода в строитель возможно, но нетипично. Apache HashCodeBuilder — один из примеров, используемый как int hash = new HashCodeBuilder().append(a).append(b).build();, хотя в этом конкретном случае вы можете предпочесть просто использовать метод с переменными аргументами, например Objects.hashCode, используется как int hash = Objects.hashCode(a, b);.

Метод, который принимает большое количество аргументов разных типов, плохо подходит для varargs, поэтому вы можете найти подходящий конструктор или рассмотреть возможность уменьшения объема работы, выполняемой в этот метод или инкапсуляция аргументов в какой-либо другой составной тип.

person MikeFHay    schedule 05.11.2013