powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не понимаю PublicList
11 сообщений из 11, страница 1 из 1
Не понимаю PublicList
    #39098089
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу.

Пошел по пути того , что бы в вызываемых подметодах были видны переменные начального. Думал что мне поможет PublicList

http://docs.intersystems.com/cache20152/csp/docbook/DocBook.UI.Page.cls?KEY=ROBJ_method_publiclist

Пробую концептMethod ParentMethod() [ PublicList = (a,b,c) ]
{
 new a,b,c
 set a="is public var"
 do ..ChildMethod()
}
Method ChildMethod()
{
 w
 w !,a
}И тут выясняется что Child метод видит переменную a, но использовать её не может, выдает <UNDEFINED> *a

Методом тыка выясняется что работает только если у Child метод так же указать PublicListMethod ChildMethod() [ PublicList = a ]
{
 w
 w !,a
}Как до этого дойти читая документацию я не очень понимаю, в документации написано
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 но где взять уверенность что он не сможет с ними ничего сделать ?
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098131
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnПытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу.Приватные глобалы? ProcedureBlock ( 10036440 )?
PtnНо хотелось бы определенности закрепленных в документации а не догадок.Скомпилируйте класс с флагом "k" и посмотрите полученный INT-код, возможно тогда Вам станет всё намного понятней.
PtnКак до этого дойти читая документацию я не очень понимаю, в документации написано
Public variables are visible to any methods invoked from the method defining the public list. Также там написано: This keyword is used only if method is written in Caché ObjectScript and is a procedure block .

Method ParentMethod() [ ProcedureBlock = 0, PublicList = (a, b, c) ]

и

Method ParentMethod() [ PublicList = (a, b, c) ]

- две большие разницы.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098194
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitдве большие разницы.

Это понятно, в той же документации же сказано что PublicList применяется только с включенным ProcedureBlock

С ProcedureBlock = 0, публик лист вообще не нужен для моей задачи, но тогда отслеживание _всех_ переменных ложится на мои плечи, и никакой выгоды я особо не получу.

servitСкомпилируйте класс с флагом "k" и посмотрите полученный INT-код, возможно тогда Вам станет всё намного понятней.

Сейчас я хотел бы понять что видимые переменные стопроцентно нельзя использовать или испортить пока их не укажут в PublicList, в методах с ProcedureBlock = 1
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098228
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098289
eduard93
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ptn, объявляйте PublicList в Child методе:Method ParentMethod()
{
 //new a,b,c
 set a="is public var"
 do ..ChildMethod()
}

Method ChildMethod() [ PublicList = (a, b, c) ]
{
 w
 w !,a
}

А в parent можно и не указывать.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098309
Timur Safin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098447
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitProcedure Variables

Вот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б


eduard93,А в parent можно и не указывать.

Нельзя не указывать, они в parent тогда окажутся в списке приватных, и вы их не увидите, у меня по крайней мере не получалось

Timur SafinЕсть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса.

Там переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта.

Падение производительности на конструкции
Код: c#
1.
2.
3.
 merge ..Service("info") = loadedinfo
 vs
 merge localservice("info") = loadedinfo


чуть ли не два порядка.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098550
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnВот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б 18260269
PtnТам переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта.К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы?
PtnПадение производительности на конструкции
Код: c#
1.
2.
3.
 merge ..Service("info") = loadedinfo
 vs
 merge localservice("info") = loadedinfo



чуть ли не два порядка.Зачем здесь merge? Передавайте некий объект по ссылке, в котором будут все Ваши переменные, включая и многомерные.

PS: маленький готовый пример не помешал бы.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098628
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtnПытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу.Как вариант:Class demo.Ptn [Abstract]
{

ClassMethod ДлинныйМетод()
{
  set a="is public var"
  d кусок1
  w a,!
  
кусок1()
  w "(кусок1) a=",a,!
  d кусок2()
кусок2()
  w "(кусок2) a=",a,!
  ;d кусокN()
кусокN()
  w "(кусокN) a=",a,!
}

}
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39098677
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitКак вариант:...Не лучший, замечу, вариант: даже в Студии 2015.1 не работает автодополнение имён внутренних подпрограмм (а уже привыкли!), нет аналога Ctrl-G. Может в новой Cтудии что-то появится? вряд ли, едва ли такое в струе новых веяний...

По сути, если в программном комплексе большая (многомерная) локальная среда, альтернативы использованию методов c [ProcedureBlock=0] нет. Почему тогда не писать на классическом M? Вопрос философский, и каждый разработчик отвечает на него по-своему. Можно ответить так: классы делают более наглядной структуру кода, позволяя использовать некое подмножество ОО-подхода, потенциально поддерживаемого в Cache'.
...
Рейтинг: 0 / 0
Не понимаю PublicList
    #39099140
Ptn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы?

Давно отказались от программ, по самым разным причинам. Никакого особого профита программы не дают. Ни с точки зрения ООП, ни с точки зрения поддержки, ни с точки зрения развертывания и обновления инсталяций

servitЗачем здесь merge? Передавайте некий объект по ссылке, в котором будут все Ваши переменные, включая и многомерные.

Немного странный вопрос, merge здесь за тем что я его использую в разных ситуациях, привел его в качестве примера потому что именно на нем большая разница в производительности. Объект передавать можно, я так и делаю на несколько уровней абстракции выше, но в нем тоже нужно многомерные переменные как то заполнять, и они медленее обычных локальных.
Там где овчинка выделки стоит я использую свойства, но там где важна скорость приходится работать с локальными переменными

автормаленький готовый пример не помешал бы.

А смысл ? Большой метод под две тысячи строк вида что то вроде: если метод=1, иначе если метод=2 иначе если метод=3 и так далее

servitКак вариант:

Нет, такой вариант не устраивает, поддерживать и рефакторить такой код лично мне сложнее, при этом он не дает никакого особого преимущества над там что у меня сейчас
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Не понимаю PublicList
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]