09.08.2005, 16:53 | #1 |
Участник
|
добраться из ClassFactory "обратно" до класса
Hello All!
Как узнать в ClassFactory, какой именно класс работает? Например, если при запуске класса, основанного на RunBase, в SysSetupFormRun посмотреть this.name(), увидим dialog, а classId2Name(classIdGet(this)) есть SysSetupFormRun. Args пустой, соответственно и caller() нельзя получить. А хотелось бы узнать имя класса, который extends RunBase. Смысл: например, чтобы для отслеживания запусков форм/отчётов модифицировать только ClassFactory, а не каждый отслеживаемый класс. |
|
09.08.2005, 17:49 | #2 |
NavAx
|
Re: добраться из ClassFactory "обратно" до класса
Цитата:
Изначально опубликовано somebody
Как узнать в ClassFactory, какой именно класс работает? Цитата:
Например, если при запуске класса, основанного на RunBase, в SysSetupFormRun посмотреть this.name(), увидим dialog, а classId2Name(classIdGet(this)) есть SysSetupFormRun. Args пустой, соответственно и caller() нельзя получить.
Цитата:
А хотелось бы узнать имя класса, который extends RunBase.
Цитата:
Смысл: например, чтобы для отслеживания запусков форм/отчётов модифицировать только ClassFactory, а не каждый отслеживаемый класс.
__________________
Isn't it nice when things just work? |
|
09.08.2005, 18:08 | #3 |
Участник
|
1) зачем?
2) no comment 3) что значит "увидеть в SysSetupFormRun"? 4) no answer |
|
09.08.2005, 18:18 | #4 |
Модератор
|
Видимо, г-н somebody хочет отслеживать предка, который вызвал тот или иной класс/отчет. Типа стека вызовов.
Хм. чуствуется подход после Java С Уважением, Георгий |
|
09.08.2005, 18:21 | #5 |
NavAx
|
Цитата:
Изначально опубликовано somebody
3) что значит "увидеть в SysSetupFormRun"?
__________________
Isn't it nice when things just work? |
|
09.08.2005, 18:25 | #6 |
NavAx
|
Цитата:
Изначально опубликовано George Nordic
Видимо, г-н somebody хочет отслеживать предка, который вызвал тот или иной класс/отчет. Типа стека вызовов. Хм. чуствуется подход после Java С Уважением, Георгий Цитата:
Изначально опубликовано George Nordic
1) зачем? 2) no comment 4) no answer господина somebody вообще не интересуют ответы.
__________________
Isn't it nice when things just work? |
|
10.08.2005, 11:14 | #7 |
Участник
|
Я попробую сформулировать за автора проблему с которой он столкнулся. Возможно, ее можно решить и без использования ClassFactory.
AXPTA 2.5 SP3 С момента введения в эксплуатацию AXAPTA было введено множество самых разных модификаций. Принимались на работу и уволнялись как собственные (самой компании) разработчики, так и менялись программисты Columbus вносившие свои модификации. Приходили и уходили начальники самых разных отделов, которые считали, что вот они-то как раз наведут во всем порядок, но для этого надо ввести еще вот такую и такую функциональность. После их ухода (а иногда и ДО) про эту функциональность благополучно забывали. Иногда еще до ее внедрения. В результате, имеем в системе огромное количество самых разных объектов. Сама задача заключается в следующем. Необходимо определить, какие же объекты реально используются в системе, а какие - нет. Пока остановились на задаче определения факта использования классов, форм и отчетов. Это основная масса объектов, где скопился "мусор". Под термином "используются" в данном случае понимается факт открытия (вызова) соответствующего объекта. В момент открытия (вызова) объекта надо "скинуть" в некий лог информацию следующего содержания: тип объекта имя объекта дата и время обращения Для справки (т.е. не обязательно) можно еще добавить пользователь компания Каким образом можно организовать заполнение этого лога? Другими словами, журналирование использования объектов AXAPTA? |
|
10.08.2005, 12:46 | #8 |
NavAx
|
Интересная задача :-) Как в общем виде решить, не знаю. Но что касается наследников от Runbase, то imho, достаточно переопределить в Runbase, метод new и в нем писать в лог данные, получаемые через:
classidget(this) и classId2Name(classidget(this))
__________________
Isn't it nice when things just work? |
|
10.08.2005, 13:58 | #9 |
Administrator
|
Рискну предложить исследование использования объектов в построенных перекрестных ссылках. Очевидно, что тк
Цитата:
Под термином "используются" в данном случае понимается факт открытия (вызова) соответствующего объекта.
Цитата:
но для этого надо ввести еще вот такую и такую функциональность
очевидно, что если есть класс, не имеющий наследников, и ни один метод из этого класса не запускается, то класс - скорее всего мусорный. Конечно - такой процесс долгий и нудный.... однако теоретически может привести к результатам. В отношении лога можно добавить что есть классы, которые вообще никогда не запускаются, однако запускаются их наследники (как напр RunBase). |
|
10.08.2005, 16:01 | #10 |
NavAx
|
А может профайлер приспособить под это дело, при логине включать скртыно? Или, покопавшись в нем, разобраться - как он определеят всю нужную информацию.
|
|
10.08.2005, 16:44 | #11 |
Участник
|
Разверну идею, поданую macklakov.
Создаете новую таблицу с полем единственным полем ClassID. Из new пишите в нее ClassID. Потом сажаете несколько человек на тестирование всех стандартных операций в системе. Тестируете и получаете ClassID всех используемых. Далее любым известным способом формируете разность - все классы минус используемые. Из числа оставшихся возможно предположить 2-3% тех, которые нужны, но функционал просто забыли протестировать. Далее перекрестными ссылками ищутся все определения каждого конкретного класса из числа разностных классов и коментарятся. Коментарий дополняется двумя спец. макросами. Первый нужен, чтобы все такие комментарии можно было найти для удаления, второй - все с использованием такого класса для восстановления в случае ошибки. Постепенно кол-во оставшихся классов сведется к 0. В финале, тестируете еще раз и вытираете комментарии. Работа долгая и потная, но чудес не бывает По крайней мере, это системный подход.. |
|
10.08.2005, 17:48 | #12 |
Участник
|
Еще пара идей:
*статически проанализировать граф вызовов при помощи Xref и выявить недостижимые объекты *пройтись по достижимым кастомизированным методам и вставить автоматически в начало каждого метода (или только для new классов, но тогда надо создавать new и корректно перекрывать) что-то типа PHP код:
|
|
11.08.2005, 15:22 | #13 |
Участник
|
Да. Речь идет только и исключительно об объектах созданных в слое USR. Не измененных, а именно созданных. Получить их список можно через таблицу UtilElements или UtilIdElements.
Да. Перехват в RunBase позволит выявить достаточно большую часть используемых объектов. Однако это далеко не все классы и отчеты. Предварительный анализ показал, что на базе RunBase сделано примерно 2/3 всех классов слоя USR. При этом никак не учитываются формы, а отчеты лишь частично, если они запускаются через RunBaseReport (это примерно 2/5 всех отчетов слоя USR) PS: Не надо описывать как сделать анализ на основе полученных данных. Это я и сам соображу. Вопрос в том, как эти данные получить PPS: то, что написал belugin я вообще не понял. |
|
11.08.2005, 15:45 | #14 |
Участник
|
какая конкретна буква непонятна?
1. Можно проанализировать перекрестные ссылки по данным хранящимся в таблицах XRef* и выяснить статически, какие классы не вызываются. 2. Можно пройтись инструментом, который будет вставлять в начало всех методов (через TreeNode ) фрагмент, логгирующий вызовы. А после окончание логгирования его убрать. |
|
11.08.2005, 16:12 | #15 |
NavAx
|
Цитата:
Изначально опубликовано belugin
2. Можно пройтись инструментом, который будет вставлять в начало всех методов (через TreeNode ) фрагмент, логгирующий вызовы. А после окончание логгирования его убрать.
__________________
Isn't it nice when things just work? |
|
11.08.2005, 16:21 | #16 |
Участник
|
Если командир не может предотвратить объявление переменных, он должен его возглавить.
См. код в 1 моём сообщении |
|
11.08.2005, 16:25 | #17 |
NavAx
|
Цитата:
Изначально опубликовано belugin
Если командир не может предотвратить объявление переменных, он должен его возглавить. См. код в 1 моём сообщении
__________________
Isn't it nice when things just work? |
|
11.08.2005, 18:02 | #18 |
Участник
|
Цитата:
Изначально опубликовано belugin
Если командир не может предотвратить объявление переменных, он должен его возглавить. См. код в 1 моём сообщении PHP код:
|
|
11.08.2005, 18:07 | #19 |
Участник
|
не могу придумать случая, когдабы поиск до первойфигурной не сработал. (если отсеять комментарии). комментарии может отсеять, например XPPParser или регулярное выражение.
Или можно отсеят комментарии просто обнаруживая символы комментария до скобки и ругаясь на них. Поруганные места править руками. |
|