Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Не понимаю PublicList  [new]
Ptn
Guest
Пытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу.

Пошел по пути того , что бы в вызываемых подметодах были видны переменные начального. Думал что мне поможет 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 метод так же указать PublicList
Method 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 но где взять уверенность что он не сможет с ними ничего сделать ?
9 ноя 15, 11:06    [18387834]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
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) ]

- две большие разницы.
9 ноя 15, 11:34    [18388030]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
Ptn
Guest
servit
две большие разницы.


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

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

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


Сейчас я хотел бы понять что видимые переменные стопроцентно нельзя использовать или испортить пока их не укажут в PublicList, в методах с ProcedureBlock = 1
9 ноя 15, 12:14    [18388374]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Ptn,

Procedure Variables
9 ноя 15, 12:32    [18388502]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
eduard93
Member

Откуда:
Сообщений: 167
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 можно и не указывать.
9 ноя 15, 13:16    [18388785]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
Timur Safin
Member

Откуда:
Сообщений: 54
Есть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса.
9 ноя 15, 13:30    [18388903]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
Ptn
Guest
servit
Procedure Variables


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


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


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

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


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

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

чуть ли не два порядка.
9 ноя 15, 14:44    [18389600]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Ptn
Вот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б
18260269
Ptn
Там переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта.
К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы?
Ptn
Падение производительности на конструкции
 merge ..Service("info") = loadedinfo
 vs
 merge localservice("info") = loadedinfo


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

PS: маленький готовый пример не помешал бы.
9 ноя 15, 15:34    [18390032]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3117
Блог
Ptn
Пытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу.
Как вариант:
Class demo.Ptn [Abstract]
{

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

}
9 ноя 15, 16:30    [18390408]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
Alexey Maslov
Member

Откуда: СПб
Сообщений: 1547
servit
Как вариант:...
Не лучший, замечу, вариант: даже в Студии 2015.1 не работает автодополнение имён внутренних подпрограмм (а уже привыкли!), нет аналога Ctrl-G. Может в новой Cтудии что-то появится? вряд ли, едва ли такое в струе новых веяний...

По сути, если в программном комплексе большая (многомерная) локальная среда, альтернативы использованию методов c [ProcedureBlock=0] нет. Почему тогда не писать на классическом M? Вопрос философский, и каждый разработчик отвечает на него по-своему. Можно ответить так: классы делают более наглядной структуру кода, позволяя использовать некое подмножество ОО-подхода, потенциально поддерживаемого в Cache'.
9 ноя 15, 17:19    [18390799]     Ответить | Цитировать Сообщить модератору
 Re: Не понимаю PublicList  [new]
Ptn
Guest
servit,
К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы?


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

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


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

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


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

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


Нет, такой вариант не устраивает, поддерживать и рефакторить такой код лично мне сложнее, при этом он не дает никакого особого преимущества над там что у меня сейчас
10 ноя 15, 08:31    [18393027]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить