Size: a a a

2020 January 07

DI

Dmitrii Iudin in 🎄// CIPHERNET
ну, она там читает что то, агрегирует и параллелит
источник

ED

Eto Demerzel in 🎄// CIPHERNET
Dmitrii Iudin
а теперь вопрос на миллион - а что необходимо для задачи?
Зависит от задачи.
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
мне всю эту логику вы самому предлагаете написать - или только интерфейс разбить?
источник

G

Gymmasssorla in 🎄// CIPHERNET
Dmitrii Iudin
мне всю эту логику вы самому предлагаете написать - или только интерфейс разбить?
Нет, я предлагаю создать внутренний класс, который вызывает эту функцию, а пользователю предоставить интерфейс из множества классов, которые вместе комбинируются и внутри вызывают эту злосчастную функцию на 30 параметров
источник

G

Gymmasssorla in 🎄// CIPHERNET
Я думаю всегда можно просто разделить 30 параметров на 5 параметров-классов из 6 инкапсулированных объектов, самое тупое и простое решение
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
Gymmasssorla
Я думаю всегда можно просто разделить 30 параметров на 5 параметров-классов из 6 инкапсулированных объектов, самое тупое и простое решение
можно. А чем это поможет?
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
я не придираюсь, если чо, мне искренне любопытно как люди такие задачи решают...
источник

G

Gymmasssorla in 🎄// CIPHERNET
Dmitrii Iudin
можно. А чем это поможет?
Например, нужно эту функцию на протяжении исполнения программы вызывать много раз. Тогда можно 4 объекта создать и хранить где-то, а пятый всё время конструировать при каждом вызове с другими данными. Выходит много проще, чем вызов функции с 30 параметрами (в вызове которой ошибиться легко, допустим двадцатый и двадцать первый параметры оба int, можно их просто перепутать и компилятор ничего не скажет)
источник

G

Gymmasssorla in 🎄// CIPHERNET
А если пять параметров разных типов, то компилятор ошибку кинет, что типы не те
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
Gymmasssorla
Например, нужно эту функцию на протяжении исполнения программы вызывать много раз. Тогда можно 4 объекта создать и хранить где-то, а пятый всё время конструировать при каждом вызове с другими данными. Выходит много проще, чем вызов функции с 30 параметрами (в вызове которой ошибиться легко, допустим двадцатый и двадцать первый параметры оба int, можно их просто перепутать и компилятор ничего не скажет)
Not bad
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
ну у нас попроще конечно - параметры все именованные и порядок значения не имеет. Но идея с тем чтобы разделить интерфейс на статическую и динамическую часть мне нра
источник

G

Gymmasssorla in 🎄// CIPHERNET
Dmitrii Iudin
ну у нас попроще конечно - параметры все именованные и порядок значения не имеет. Но идея с тем чтобы разделить интерфейс на статическую и динамическую часть мне нра
Для этого есть ещё хороший паттерн - билдеры. Можно разделить 30 параметров на 5 классов и сделать что-то вроде MyBuilder, который можно так использовать:

MyBuilder::new().address(my_address).message(my_message).send();

А если нужно где-то потом вызвать его, то просто нужно поменять какой-нибудь аргумент и заново отправить:

builder.address(new_address).send();

А все другие аргументы останутся прежними.
источник

G

Gymmasssorla in 🎄// CIPHERNET
Можно ещё сделать несколько типов билдеров: готовый к вызову функции и неготовый. Тогда он вместо исключения будет кидать ошибку компиляции, что программист попытался вызвать функцию с не всеми аргументами. Архитектурная от это космонавтика, уже решать, исходя из задачи
источник

G

Gymmasssorla in 🎄// CIPHERNET
Вообще ИМХО, типы - самая мощная и самая простая концепция в программировании. Сегодня они даже используются для формальной верификации программ, например пишут сетевой стек на каком-нибудь продвинутом языке и весь стек формально доказан, что не содержит ошибок
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
Спасибо за совет. Я обмозгую. Вот эти вот многоступенчатые билдеры от меня до этого как то ускользали
источник

DI

Dmitrii Iudin in 🎄// CIPHERNET
Потому что основной аргумент против билдеров у меня всегда был - мы лишаемся статической проверки на то что мы все обязательные параметры предоставили. Вместо этого синтаксический сахар который может в жабе и нужен, потому что параметры передаются по очереди, но нам как то не с руки, потому что параметры и так именованеые
источник

G

Gymmasssorla in 🎄// CIPHERNET
Dmitrii Iudin
Потому что основной аргумент против билдеров у меня всегда был - мы лишаемся статической проверки на то что мы все обязательные параметры предоставили. Вместо этого синтаксический сахар который может в жабе и нужен, потому что параметры передаются по очереди, но нам как то не с руки, потому что параметры и так именованеые
Кстати, обязательные параметры можно передать в Builder::new(arg1, arg2, arg3), а для опциональных можно сделать методы.
источник

G

Gymmasssorla in 🎄// CIPHERNET
Тогда билдер всегда будет иметь все обязательные аргументы для вызова функции
источник

M

MrSmith in 🎄// CIPHERNET
Dmitrii Iudin
ну, она там читает что то, агрегирует и параллелит
А проблема в чем? sql тоже вендор лок и ничего есть вполне себе билдеры
источник

M

MrSmith in 🎄// CIPHERNET
calcImagProc().Some().Some1().exec()
источник