Как вы реализуете проверку на то, что ваш триггер не запустится больше 1 раза?
А если вам в тесте нужно сделать несколько DML операций и на каждое действие должен сработать триггер?
1. Есть флаг в триггер диспатчере. Который предотвращает повторное срабатывание. но его можно сбросить.
2. Собственно все тоже самое и в тестах.
Отдельный флаг на каждый тип?
Т.е. если тебе нужно обновить 100 записей, ты будешь его сбрасывать 100 раз?
+1
Хотел тоже самое написать.
Только словами попроще ![]()
Да флаг на каждое действие (триггер, кусок триггера)
100 записей апдейтятся пачкой или в цикле?
Пусть последовательно.
И зачем вам столько флагов, если можно, например, сработавшие действяи хранить?
тогда да, перед каждой DML операцией сбрасывать флаг - а что тут сложного добавить одну строчку для изменения статической переменной?
Что-то я не улавливаю твоей задумки.
Пример на пальцах можешь привести?
Тогда, мне кажется, теряеся весь смысл, ведь может сработать какой-нить WF with field update, который запустит триггер еще раз.
Именно так и работает. Но при этом для автоматической проверки есть стандартный метод. А флаг лишь один и он говорит что в конкретном месте не делать эту автоматическую провеку и все.
У тебя есть 7 и более Boolean переменных, так?
Я предлагаю использовать Set.
В принципе можно и так. Это всего лишь вариант хранения.
Смысл же проверки и установки/сброса значений в триггере я думаю это не меняет.
Но за идею кстати спасибо. Отложу в памяти ![]()
Т.е. если в одном контексте надо сделать несколько операции, вы так руками везде и выставляете ваш флаг?
Вообще да, но если честно за всю карьеру мне с таким приходилось сталкиваться всего один раз в бизнес логике и в том случае это был костыль чтобы избавиться от нежелательного эффекта множественного срабатывания триггера.
А так, мне толковых юз кейсов не попадалось с такой логикой.
Допустим делаешь ты пакет, а у клиента куча WF, которые ломают тебе логику.
ВОТ! ты прямо в точку - именно с такой хренью я и боролся однажды.
Но вообще я уже даааавно не делаю пакеты. Говорю же что работаю напрямую с заказчиками или с небольшими стартапами которые еще до пакета не доросли.
Да. Потому что он автоматически сбрасывается после проверки. М пока с таким поведением не было проблем.
И кстати если происходит множественная сработка триггера на одном объекте и на одной и той же операции, то скорее всего косяк в логике.
Меня все подмывало сказать это
, но тут собрались уважаемые люди ![]()
DML Manager не пробовал использовать. Это спасает от множества проблем.
Логика вполне может быть клиентская и он не хочет ничего менять. И от программиста уже ничего не зависит.
Gres, а расскажи какой пакет ты сейчас пилишь, если это не коммерческая тайна.
Я же писал выше, что пишу тесты, и чтобы проверить одну из ситуаций, мне надо создать и обновить несколько объектов. Думал, вы может что-то подскажете, а сброс флага у меня и так был.
Это пакет для одного клиента.
У меня написана похожая обертка над DML операциями, если ты про https://github.com/patronmanager/apex-dml-manager
Да. Примерно такая обертка. только у нас исползуется еще один метод для накопления объектов а потом их разовая вставка в базу.
Да, у меня тоже есть Unit Of Work
О! помню такую штуку на одном проекте.
Только гемора кучу добавляло - профита 0!
Проще было сложить объекты в list и передать лист в dml чем вспомнить как эту хрень инициализировать и заставить работать. Кстати на том проекте была еще и <Object>Selector (вроде того же автора) - тоже блин сука головная боль. Короче любите вы себе и другим жизнь усложнять своими абстракциями. Все равно рано или поздно на проект придут такие парни как Я и сломают вашу красоту ![]()
Вроде отсюда это пришло
https://github.com/financialforcedev/fflib-apex-common
Вечный холивар.
Не, я дак пишу свои обертки.
Или к тебе на проект придут крутые парни и сломают тебе кайф.
Я уже кучу людей переучил, мне не привыкать.
А те кто не хочет переучиваться - давай досвиданья :)
Вот интересно, почему когда я приду на ваш проект, то я должен переучиваться,
а когда "крутые парни" придут на мой проект, то мне все сломают?
Как-то двухсмысленно звучит.
Еще раз расскажу из своего много летнего опыта.
Видел кучу проектов и НИ РАЗУ НЕ ВИДЕЛ нормальной реализации хоть какой-либо абстракции. Да были проекты на которых пытались внедрить какие-то паттерны, врапперы, или другую лабуду из мира книжных теоретиков. Но занимался этим один человек, которые просто не был в состоянии переучить всю комманду и следить за заждым изменением. В итоге внедряли, а потом дружно забивали. Где-то использовали, где-то нет, много где использовали просто неправильно. Код становилось писать и читать сложно (я на одном таком проекте код НЕ ПИСАЛ, я тупо лазил по проекту и копипастил, потому что по другому не получалось).
Так что если вы пилите свой мега проект в вакууме, то вам круто повезло.
Если хотите сделать мир лучше, научите всех. Я только за! Давайте сделаем серию статей про то как надо писать код, какие паттерны и врапперы использовать. А то пока кроме разговоров что все вокруг лохи ничего нет.ъ
Я кстати думаю что если вы Gres и Wilder столкнетесь на одном проекте, этому проекту придет звиздец!
Ну я вполне себе flexible man. До тех пор пока я не начинаю принимать решения
По поводу абстракций. В оргах уровня Enterprise без этого никак, иначе просто куча кода и никто не знает почему его так много.
По поводу проверки синтаксиса. Как раз сегодня закончил автоматическую проверку при коммите. Теперь остальных можно дрючить в автоматическом режиме, правда это не отменяет code review, но по крайней мере hardcoded id ловятся сраазу.
З.Ы. Дима не кипятись. Всех научить/переучить не возможно. да и не зачем это. Разный масштаб проектов, разные подходы.
Ну да, точно)
Тут дело в том, каждый пишет код, так как ему нравится. А если ты работаешь в команде, то ты попадаешь под стиль этой команды, если ты хочешь работать вместе с командой, то тебе придется писать код также.
А ты пытаешься доказать, что паттерны это плохо, да у тебя есть негативный опыт, но я также могу сказать, что с говнокодом тоже куча проблем из личного опыта.
Почему же, я всегда готов к диалогу, постоянно работаю с разными командами и проблем никогда не было.
сорри, опять холивар развел.
Вот это правильно! Вот это хорошо
Я тоже спокойно в проекты вхожу и очень даже спокойно работаю под началом бывших junior которые по воле судьбы становятся лидами на проекте и занимаются архитектурой ![]()
Не совсем понятно что надо предотвратить: если в очередной раз произошло изменение объекта, то почему не надо выполнять какую-то бизнес логику?
А так: отслеживаю нужные изменения в объекте, если они были - дёргаю логику; если логика должна дёргаться как-то единожды - складываю в set обработанных записей.
А как вам такая задача: в результате каких-то манипуляций объект на котором висит бизнес-логика может изменяться n-раз, задача - сделать так чтобы логика выполнилась только один раз после самого последнего изменения. Пока что её решение видится только через асинхрон.
Trigger -> WF -> Trigger
Контекст то не меняется следовательно, нужные изменения будут 2 раза.
n известно? А так, да, только отложенное изменения и блокировка.
Ну почему же, второй раз триггер сработает только если в результате WF были внесены изменения в запись и не факт что изменения были внесены по тем полям которые мониторятся для бизнес-логики.
Ага, хитрый
Нет, конечно же, n заранее не известно, может один раз зайти, а может и больше.
О чем и речь