Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M |
![]() ![]() |
Ptn
Guest |
Пытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу. Пошел по пути того , что бы в вызываемых подметодах были видны переменные начального. Думал что мне поможет PublicList http://docs.intersystems.com/cache20152/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_method_publiclist Пробую концепт
Методом тыка выясняется что работает только если у Child метод так же указать PublicList
Public variables are visible to any methods invoked from the method defining the public list. А дальше начинаются дагадки, насколько я понимаю когда я Child методе хочу использовать переменную то она по умолчанию считается приватной, и только если она определена в PublicList то он начинает смотреть её в публичных, и именно поэтому в ParentMethod приходится делать new на PublicList Но хотелось бы определенности закрепленных в документации а не догадок. На текущий момент мне абсолютно не нравится что если я из ChildMethod вызову еще какой либо ChildMethod2 то он так же в списке публичных увидит a,b,c но где взять уверенность что он не сможет с ними ничего сделать ? |
||||
9 ноя 15, 11:06 [18387834] Ответить | Цитировать Сообщить модератору |
servit Member Откуда: г. Кишинёв, Республика Молдова Сообщений: 3117 Блог |
Method ParentMethod() [ ProcedureBlock = 0, PublicList = (a, b, c) ] и Method ParentMethod() [ PublicList = (a, b, c) ] - две большие разницы. |
||||||
9 ноя 15, 11:34 [18388030] Ответить | Цитировать Сообщить модератору |
Ptn
Guest |
Это понятно, в той же документации же сказано что PublicList применяется только с включенным ProcedureBlock С ProcedureBlock = 0, публик лист вообще не нужен для моей задачи, но тогда отслеживание _всех_ переменных ложится на мои плечи, и никакой выгоды я особо не получу.
Сейчас я хотел бы понять что видимые переменные стопроцентно нельзя использовать или испортить пока их не укажут в PublicList, в методах с ProcedureBlock = 1 |
||||
9 ноя 15, 12:14 [18388374] Ответить | Цитировать Сообщить модератору |
servit Member Откуда: г. Кишинёв, Республика Молдова Сообщений: 3117 Блог |
Ptn, Procedure Variables |
9 ноя 15, 12:32 [18388502] Ответить | Цитировать Сообщить модератору |
eduard93 Member Откуда: Сообщений: 167 |
Ptn, объявляйте PublicList в Child методе:
А в parent можно и не указывать. |
||
9 ноя 15, 13:16 [18388785] Ответить | Цитировать Сообщить модератору |
Timur Safin Member Откуда: Сообщений: 54 |
Есть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса. |
9 ноя 15, 13:30 [18388903] Ответить | Цитировать Сообщить модератору |
Ptn
Guest |
Вот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б
Нельзя не указывать, они в parent тогда окажутся в списке приватных, и вы их не увидите, у меня по крайней мере не получалось
Там переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта. Падение производительности на конструкции merge ..Service("info") = loadedinfo vs merge localservice("info") = loadedinfo чуть ли не два порядка. |
||||||
9 ноя 15, 14:44 [18389600] Ответить | Цитировать Сообщить модератору |
servit Member Откуда: г. Кишинёв, Республика Молдова Сообщений: 3117 Блог |
PS: маленький готовый пример не помешал бы. |
||||||
9 ноя 15, 15:34 [18390032] Ответить | Цитировать Сообщить модератору |
servit Member Откуда: г. Кишинёв, Республика Молдова Сообщений: 3117 Блог |
|
||||
9 ноя 15, 16:30 [18390408] Ответить | Цитировать Сообщить модератору |
Alexey Maslov Member Откуда: СПб Сообщений: 1547 |
По сути, если в программном комплексе большая (многомерная) локальная среда, альтернативы использованию методов c [ProcedureBlock=0] нет. Почему тогда не писать на классическом M? Вопрос философский, и каждый разработчик отвечает на него по-своему. Можно ответить так: классы делают более наглядной структуру кода, позволяя использовать некое подмножество ОО-подхода, потенциально поддерживаемого в Cache'. |
||
9 ноя 15, 17:19 [18390799] Ответить | Цитировать Сообщить модератору |
Ptn
Guest |
Давно отказались от программ, по самым разным причинам. Никакого особого профита программы не дают. Ни с точки зрения ООП, ни с точки зрения поддержки, ни с точки зрения развертывания и обновления инсталяций
Немного странный вопрос, merge здесь за тем что я его использую в разных ситуациях, привел его в качестве примера потому что именно на нем большая разница в производительности. Объект передавать можно, я так и делаю на несколько уровней абстракции выше, но в нем тоже нужно многомерные переменные как то заполнять, и они медленее обычных локальных. Там где овчинка выделки стоит я использую свойства, но там где важна скорость приходится работать с локальными переменными
А смысл ? Большой метод под две тысячи строк вида что то вроде: если метод=1, иначе если метод=2 иначе если метод=3 и так далее
Нет, такой вариант не устраивает, поддерживать и рефакторить такой код лично мне сложнее, при этом он не дает никакого особого преимущества над там что у меня сейчас |
||||||||
10 ноя 15, 08:31 [18393027] Ответить | Цитировать Сообщить модератору |
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M | ![]() |