|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
Пытаюсь разбить на куски достаточно длинный расчетный метод, а передавать через параметры в каждый кусок переменные не прельщает ни разу. Пошел по пути того , что бы в вызываемых подметодах были видны переменные начального. Думал что мне поможет 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 но где взять уверенность что он не сможет с ними ничего сделать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 11:06 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
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) ] - две большие разницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 11:34 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
servitдве большие разницы. Это понятно, в той же документации же сказано что PublicList применяется только с включенным ProcedureBlock С ProcedureBlock = 0, публик лист вообще не нужен для моей задачи, но тогда отслеживание _всех_ переменных ложится на мои плечи, и никакой выгоды я особо не получу. servitСкомпилируйте класс с флагом "k" и посмотрите полученный INT-код, возможно тогда Вам станет всё намного понятней. Сейчас я хотел бы понять что видимые переменные стопроцентно нельзя использовать или испортить пока их не укажут в PublicList, в методах с ProcedureBlock = 1 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 12:14 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
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 можно и не указывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 13:16 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
Есть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 13:30 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
servitProcedure Variables Вот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б eduard93,А в parent можно и не указывать. Нельзя не указывать, они в parent тогда окажутся в списке приватных, и вы их не увидите, у меня по крайней мере не получалось Timur SafinЕсть ощущение, что Вам не надо тащить список переменных их одного метода класса в другой, а надо перенести эти переменные в состояние объекта этого класса. Там переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта. Падение производительности на конструкции Код: c# 1. 2. 3.
чуть ли не два порядка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 14:44 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
PtnВот по ходу то что нужно, еще бы в документации по PublicList сразу сделали бы See Also Procedure Variables и ляпота была б 18260269 PtnТам переменных много и многие из них многомерные, и так как метод расчетный крайне критично время его выполнения, по этой причине не подходят ни приватные глобалы ни свойства объекта.К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы? PtnПадение производительности на конструкции Код: c# 1. 2. 3.
чуть ли не два порядка.Зачем здесь merge? Передавайте некий объект по ссылке, в котором будут все Ваши переменные, включая и многомерные. PS: маленький готовый пример не помешал бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 15:34 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
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,! } } ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 16:30 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
servitКак вариант:...Не лучший, замечу, вариант: даже в Студии 2015.1 не работает автодополнение имён внутренних подпрограмм (а уже привыкли!), нет аналога Ctrl-G. Может в новой Cтудии что-то появится? вряд ли, едва ли такое в струе новых веяний... По сути, если в программном комплексе большая (многомерная) локальная среда, альтернативы использованию методов c [ProcedureBlock=0] нет. Почему тогда не писать на классическом M? Вопрос философский, и каждый разработчик отвечает на него по-своему. Можно ответить так: классы делают более наглядной структуру кода, позволяя использовать некое подмножество ОО-подхода, потенциально поддерживаемого в Cache'. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.11.2015, 17:19 |
|
Не понимаю PublicList
|
|||
---|---|---|---|
#18+
servit,К чему тогда использовать методы класса да ещё экземпляра класса, а не обычные программы? Давно отказались от программ, по самым разным причинам. Никакого особого профита программы не дают. Ни с точки зрения ООП, ни с точки зрения поддержки, ни с точки зрения развертывания и обновления инсталяций servitЗачем здесь merge? Передавайте некий объект по ссылке, в котором будут все Ваши переменные, включая и многомерные. Немного странный вопрос, merge здесь за тем что я его использую в разных ситуациях, привел его в качестве примера потому что именно на нем большая разница в производительности. Объект передавать можно, я так и делаю на несколько уровней абстракции выше, но в нем тоже нужно многомерные переменные как то заполнять, и они медленее обычных локальных. Там где овчинка выделки стоит я использую свойства, но там где важна скорость приходится работать с локальными переменными автормаленький готовый пример не помешал бы. А смысл ? Большой метод под две тысячи строк вида что то вроде: если метод=1, иначе если метод=2 иначе если метод=3 и так далее servitКак вариант: Нет, такой вариант не устраивает, поддерживать и рефакторить такой код лично мне сложнее, при этом он не дает никакого особого преимущества над там что у меня сейчас ... |
|||
:
Нравится:
Не нравится:
|
|||
10.11.2015, 08:31 |
|
|
start [/forum/topic.php?fid=39&msg=39098628&tid=1556571]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 145ms |
0 / 0 |