Mirage писал(а):Выучивание параметров всех функций во-первых не возможно, а во-вторых, неизбежно, при таком объеме информации, что-нибудь в голове перепутается, что и будет приводить к ошибкам.
не надо выучивать всё. Нужно выучить наиболее часто используемые... тот же Pos. Да и человеческое мышление заставляет такие вещи "кешировать", так что выучивание происходит бессознательно. (и
sign тому пример!)
Mirage писал(а): скалогрыз писал(а):Не зря. Я уже привёл технические проблемы.
...
1. инфраструктура удваивается (кроме самого класса - нужно написать ещё один класс - конструктор)
2. нет чёткого описания какие методы критичны при строительстве (ведь можно и забыть!). например:
3. создание класса очень дорогая операция получается! (на каждый параметр 1 вызов метода!!) - это дорого и жирно.
4. такая "фабрика" есть замаскированные глобальные переменные. Hinst - лично для тебя - подумай, сможешь ли ты использовать 1 фабрику, из двух
эти?
1 - да, билдер дублирует все поля, но не логику.
2 - говорилось уже, все критичные в конструкторе билдера. Остальные опциональные.
3 - вызов метода это не дорого совершенно. Такие методы вообще должны инлайниться.
4 - ничего глобального там и близко нет. Очевидно, что билдер должен использоваться только при конструировании.
да, они самые.
1. Ну и зачем программисту заниматься написанием дублежа? к тому же дублежа данных.
Ведь задача программиста писать алгоритмы - логику! Лучше больше времени на алгоритм потратить, чем выстраивать (и поддерживать) инфраструктуру.
2.
Mirage писал(а):говорилось уже, все критичные в конструкторе билдера. Остальные опциональные.
Еще раз: билдер нужен для решения проблемы конструирования immutable классов с необязательными полями.
Так в этом и вопрос: что если обязательных полей
много (понятие "много" - субъективное понятие, для кого-то 5 полей в конструкторе - много, для кого-то 100 много)
Означает ли это две вещи:
* нельзя использовать builder в данном случае ? (т.е. всё-равно все параметры пойдут в конструтор)
* нужно создавать дополнительные builder-ы для builder-ов?
Mirage писал(а):3 - вызов метода это не дорого совершенно. Такие методы вообще должны инлайниться.
Дорого! Особенно если вызвов метода занимает больше времени от процессора чем тело самой функции.
А для билдера это очень свойственно, потому что кроме сохранения данных, ему ещё нужно вернуть ссылку на себя. Т.е. это как минимум две операции, вместо одной, + расход на вызвов самого метода - заполнение регистров и стэка.
Инлайнить всё подряд просто нехорошо и пагубно сказывается на размерах кода.
Mirage писал(а):4 - ничего глобального там и близко нет. Очевидно, что билдер должен использоваться только при конструировании.
Вообще-то очень даже глобальны. Почему.
1) это объект, и создание объекта это операции с динамической паматью и для экономии времени, обычно принято объекты переиспользовать. Т.е. логично создать 1 билдер, а потом его использовать чтобы пораждать много реализаций.
А иначе получается двойной расход на создание объекта: * сначала создай билдер * потом создай объект * потом билдер освободи.???
2) раз объект создан один раз, то руки чешутся не создавать билдеры для каждого потока, а надо. (К тому же, если билдеры нужны для создания immutable объектов, которые как-раз хороши для много поточности?!)
скалогрыз писал(а):Где гарантия, что когда функция вернет ссылку на сконструированный класс, все поля будут проинициализированы?
Реализацией самой функции.
Т.е. на тех же самых гарантиях, что и вызов "build()" в builder-е гарантирует инициализацию всех полей.
Если функция решит, что переданные данные неправильные, или недостаточны, то она может либо вернуть nil, либо кинуть exception (по-вкусу).
Библиотечные (в том смысле, что библиотека будет предоставленна в виде .dll и использоваться не только в родной языковой среде) функции обычно возвращают объект как один из параметров, а результатом функции будет код ошибки. Дружественно для тех языков, где нет обработки исключений.
Билдеры вообще для
Библиотчностих малопригодны, и потребуют написание такой функции всё-равно.
Mirage писал(а):В многопоточном программировании они особенно полезны, т.к. не требуют синхронизации. Можно создавать в одном потоке, использовать в других, не грея голову. Можно даже изменять, но при этом создается новый экземпляр.
Очень бюось, что такие проблемы исключительно языковые.
Проблема синхронизации, решается алгоритмически - программист знает как будет использоваться тот или иной объект.
А вообще, глядя на
примеры использования, у меня складывается впечатление, что это не какой-то вид объектов, а некий приём или подход в программировании. Почему, потому что ни один язык не предоставляет возможности описания immutable объектов. Вместо этого программист обязан, написать необходимые защитные методы.... ну да, и как итог написать билдеры
Т.е. вместо того, чтобы чётко описать правила использования объекта, нужно создать для него кучу обёрток ( в виде immutable интерфейсов и их конструторов), с целью защититься от дурака. хм. Очень уж излишняя и дорогая защита, по-моему.
Mirage писал(а):В многопоточном программировании они особенно полезны, т.к. не требуют синхронизации.
Нужно заметить, что они не требуют синхронизации, потому что являются read-only.
Если два потока могут зависят от изменённых данных, immutable объекты внезапно приводят к ошибкам.
Т.к. либо не видят изменённых данных, либо каждый работает со своей копией данных.
Нужно заметить, что read-only подход можно использовать не вводя такого понятия как "immutable object" дабы себе мозг не загромождать
Mirage писал(а):Есть такие IDE, что иногда закрадывается подозрение, будто мысли они таки читают.
Код нужно писать так, чтобы его можно было понимать и изменять не имея под рукой удобной IDE.
P.S:
Интересный список!.Билдеры попадают под понятие "Полтергейст"
Добавлено спустя 14 минут 53 секунды:А в паскале невозможно сделать immutable объект в принципе - с точки зрения потоковой безопасности!
Очень просто, как минимум один момент всегда нужно будет синхронизировать - это момент уничтожения объекта.
В Java с этим проблем нет, ибо сборка мусора, а в паскале нужно следить, что потоки закончили своё чтение объекта, до того как от этого объекта избавится.
И объект тут не обязательно должеть class или object, это может быть и переменная в стеке. (уж с чем потоку нужно работать).