LINUX.ORG.RU

Builder паттерн делаете вручную или утилитой?

 ,


0

1

Тут потребовалось хранить в памяти кучу immutable, но прежде их нужно создавать сложным алгоритмом. Как итог подумываю воспользоваться Builder паттерном, но вот вручную это всё лень кодить. Может какие полезные плагины для IDE, библиотеки или еще чего есть?

★★★★★

Idea сама умеет, емнип пкм по конструктору класса - convert to builder.

Jefail ★★★★
()

А тесты, покрывающие собой нужную функциональность, есть? Если нет, советую начинать с них. Потом удалить хлам, дублирование, «хитрую логику». Потом спрятать код, работа которого завысит от фаз Луны (функции с временем, файлами и third party кодом) под простенькие классы и покрыть их интеграционными тестами. А потом, наверняка, будет не лень и руками доделать.

Если коротко - руками, с тестами. Утилитам для автоматического рэфакторинга таких сложных задач не даю.

anonymous
()
Ответ на: комментарий от I60R

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

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 1)

немного не по теме. Чот я не догнал. Чем этот паттерн от фабрики отличается?

anonymous
()
Ответ на: комментарий от FeyFre

Проблема всех этих билдеров в невозможности добавить логику на сеттеры. Например, мне при добавлении элемента в список (#addFoo метод на билдере) нужно проверить элемент на условие и инкрементить другое поле этого же объекта. Понятно, что можно было бы на #build прогнать этот список в цикле, но как-то это криво - лишние операции...

foror ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Фабрики бывают разные, есть factory method, есть abstract factory, из jdk ничего в голову не пришло, зато вспомнил пример из hibernate где сразу оба паттерна используются:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1") // Factory Method в сущности замена конструктора
EntityManager em = emf.createEntityManager(); // Абстрактная фабрика
...
em.close();
emf.close();
Если читать книжки по паттернам то в банде четырех есть про Фабрики, а то Builder не описан, я его видел в Effective Java Блоха, пример - StringBuilder. Builder позволяет создать сложные объекты где есть обязательные и не обязательные параметры инициализации.
RemoteService service = new RemoteService.Build(username, password) // обязательные параметры
  .keepAlive(true) // опциональный
  .timeoutSec(100) // опциональный
  .build();
Как видно builder просто повышает читаемость, когда как фабрика служит задачи повторного использования кода.

Aber ★★★★★
()
Ответ на: комментарий от Aber

Решил себя проверить, таки я перепутал Factory Method со static factory method описанный у Блоха. По этому поправка, это не пример Factory Method паттерна:

Persistence.createEntityManagerFactory(«manager1»)

Aber ★★★★★
()
Ответ на: комментарий от foror

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

Deleted
()
Ответ на: комментарий от Deleted

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

Думал может я что пропустил, пока кидают не то что нужно.

foror ★★★★★
() автор топика
Ответ на: комментарий от foror

ЯП всё тот же, только удобней.
Среда — всё та же (если IDEA, а если нет то передайте мне там в 2010-м чтоб с IT не связывался...)
Наработки всё те же, просто пишем на Kotlin рядом с ними.
А о Вашем подходе мне тоже есть что сказать...

I60R ★★
()
Ответ на: комментарий от I60R

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

в нормальных языках есть подмешивание (микшены) для хипсетров не умеющих нормально проектировать иерархию наследования

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от anonymous

Чем этот паттерн от фабрики отличается?

Фабрика - для создания объекта. Билдер - для последующей инициализации/настройки. Т.е. задачи абсолютно разные.

no-such-file ★★★★★
()
Ответ на: комментарий от Aber

По этому поправка, это не пример Factory Method паттерна

Это пример абстрактной фабрики. А следующая строчка как раз фабричный метод.

no-such-file ★★★★★
()
Ответ на: комментарий от Deleted

множество объектов с пересекающимся набором свойств

Общий интерфейс —> делегация

interface Common { 
    val a: Int 
    val b: Int 
}
data class Example(
        override val a: Int, 
        override val b: Int
) : Common
data class ExampleExtended(
        val common: Common, 
        val c: Int
) : Common by common

инструмент не подходит

:(

нормально проектировать иерархию наследования

А расширять?

I60R ★★
()
Ответ на: комментарий от I60R

Наследование в data классах — плохая практика

И чем это плохо, кто тебя завербовал? И чем это отличается от композиции? Как по мне одно и тоже только способ записи иерархии разный.

foror ★★★★★
() автор топика
Ответ на: комментарий от I60R

ЯП всё тот же

Нет

если IDEA, а если нет то передайте мне там в 2010-м чтоб с IT не связывался...

С лёгкой руки послал огромную аудиторию еклипс.

просто пишем на Kotlin рядом с ними

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

foror ★★★★★
() автор топика
Ответ на: комментарий от I60R

Общий интерфейс —> делегация

Ну вот, тоже самое наследование записанное по другому (при этом замудренное). А выше говорил, что наследование это плохо.

foror ★★★★★
() автор топика
Последнее исправление: foror (всего исправлений: 1)
Ответ на: комментарий от I60R

Общий интерфейс —> делегация

только вот датаклассы у тебя все равно закрыты для расширения, ты не заметил?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.