![]() |
#18 |
Участник
|
В сто пятидесятый раз попал в туже ситуацию и решил разобраться в вопросе.
Итак, изначальная постановка Wamr была: как правильно реализовать серверный обработчик (плюс который нормально будет работать в пакете) с параметрами, изменяемыми в диалоге. Само собой этот параметр будет в списке тех, которые сохраняются в pack() и поэтому если мы этот параметр parm-методом зададим он перетрётся старым значением. Есть предложение db писать в таких случаях в main(): .getLast() .parmXXX(...) .saveLast() Я так тоже делал, но такой метод мне не нравится, так как во-первых, сохраняет уже сразу после вызова, даже если мы отменим выполнение в диалоге и во-вторых, если класс сделан с запросом на QueryRun (который сохраняется в pack()), то нужно уже на этом этапе как-то его инициализировать. sukhanchik предложил просто такие параметры не "распаковывать" если они не пусты, признав далее извращенность такого решения. И далее дискуссия ушла в обсуждение Enum-ов, чего касаться я вообще не хочу. Собственно я предлагаю такой вариант: 1. В classDeclaration добавить макрос со списком параметров, которые будут меняться в диалоге, например: X++: #localmacro.ParamsList param1, param2 #endmacro X++: public boolean unpack(container packedClass) { Version version = runbase::getVersion(packedClass); container params = [#ParamsList]; switch (version) { case #CurrentVersion: [version,#CurrentList] = packedClass; if (this.inGetSaveLast()) [#ParamsList] = params; break; default: return false; } return true; } Единственное надо проверить, чтобы на всех версиях аксапты параметр inGetSaveLast вёл себя одинаково. Ну и в минусы можно записать то, что этот список нужно не забывать пополнять по мере доработки класса (версионность тут вроде не нужна). Подводных камней вроде не вижу. Что скажете? |
|