Деревья на Ls?, HowTo? |
25:01:2008, 12:06
Сообщение
#1
|
|
|
|
Буянит во мне идея, но недели две не получается реализовать
Смысл: В начале и в конце каждого Sub'a/Function'a пишется wf.Start / wf.End В середине можно залогировать какое-либо событие, запусть что-либо (например benchmark - тест производительности)... В итоге нужно получить отчет типа: Т.е. построить дерево, состоящее из сабов + доп инфа...
Сообщение отредактировал fedotxxl - 25:01:2008, 12:06 -------------------- |
|
|
|
![]() |
Ответов
(1 - 13)
|
|
|
25:01:2008, 12:09
Сообщение
#2
|
|
|
|
где построить?
аа.... кажеться понял... хотя возможно и не так понял в скрипте ваши сабы зделайте функциями boolean и дальше
-------------------- Буть осторожен в своих желаниях - они могут сбыться
]]>< База знаний Lotus >]]> ]]> ]]>консультаций по ICQ не даю |
|
|
|
25:01:2008, 17:12
Сообщение
#3
|
|
|
|
В wf.Start передавайте в качестве параметра имя вызывающей процедуры/функции: wf.Start(GetThreadInfo(LSI_THREAD_PROC)).
Или в самом методе wf.Start берите имя вызвавшей процедуры/функции: GetThreadInfo(LSI_THREAD_CALLPROC). Было бы интресно узнать задачу/цель и взглянуть на пример кода. Есть идеи. (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) |
|
|
|
25:01:2008, 19:48
Сообщение
#4
|
|
|
|
желаете-с универсальное логирование получить, да еще и с учетом стека вызовов?.. (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)
поройте функцию lsi_info() (аналог GetThreadInfo), возможно там есть весь стек вызовов, кто знает... в дебагере-то как-то строится стек вызова, значит и так можно построить... Сообщение отредактировал Akupaka - 25:01:2008, 19:52 -------------------- не учите меня плохому...
|
|
|
|
25:01:2008, 20:38
Сообщение
#5
|
|
|
|
Для: Akupaka
Именно... нужен стек вызовов. lsi_info выдает стек, но это не дело. Если в каждом Sub'e писать Start и End, то мы сможем составить этот стек сами. Другое дело, как правильно это сделать. В этом и вопрос Логирование я сюда приписал как вариант использования Для: Yakov Спасибо, сам знаю. Для: Morpheus Мне кажется вы неправильно поняли Задача: посторить стек вызовов на основе классов, запоминания информации по вызовам. +возможность расширения до логирования, benchmarka и т.д. В итоге у нас получится, я так понимаю, разветвленное дерево Sub'ов Нужно вспомнить как строить деревья и принемимо ли это тут -------------------- |
|
|
|
26:01:2008, 01:33
Сообщение
#6
|
|
|
|
Удивительно, но какую-то вменяемую хрень я написал
Это наброски... в дебагере получил очень хороший результат... Прикол в том, что писал наугад... просто писал, почти не думая (IMG:http://forum.codeby.net/style_emoticons/default/blink.gif) Пример Сабов: Есть соображения, что неправильно, как улучшить? Сейчас проблема - если в самом первом Sub'e вызвать sc.GoToPrevSub, то scCurrentSub станет Nothing... Вобщем утро вечера мудренее -------------------- |
|
|
|
26:01:2008, 08:34
Сообщение
#7
|
|
|
|
хм... я, наверное, не понимаю в чем смысл... вернее, задачу-то, понял, а вот область применения не "вижу"... (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif)
деревья-то не сложно строить, сложнее их анализировать (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) но в чем смысл? получить дерево процедур для дальнейшего анализа?.. других применений не вижу... -------------------- не учите меня плохому...
|
|
|
|
26:01:2008, 10:15
Сообщение
#8
|
|
|
|
Цитата(fedotxxl @ 26:01:2008, 06:33 ) Выбросить sc.GoToPrevSub. Действия по перемещению указателя осуществлять в sc.End(). Сделать класс wfSubController Singleton'ом, это избавит от необходимости передавать экземпляр всем процедурам. Убрать аргументы у процедур sc.Start() и sc.End(). |
|
|
|
26:01:2008, 14:48
Сообщение
#9
|
|
|
|
Для: Yakov
Цитата Выбросить sc.GoToPrevSub. Действия по перемещению указателя осуществлять в sc.End(). Дело в том, что между sc.End и sc.GoToPrevSub будет стоять метод sc.Process, который будет обрабатывать полученную информацию в случае необходимости... Например, что-либо распечатывать... А если делать этот метод после GoToPrevSub, то саб-то уже другой... впринципе можно запихнуть метод process в End...Цитата Убрать аргументы у процедур sc.Start() и sc.End(). Аргументы передаются для контроля - если закрывается процедура отличная от текущей, то ошибка...Цитата Сделать класс wfSubController Singleton'ом, это избавит от необходимости передавать экземпляр всем процедурам. Не очень понял...Цитата хм... я, наверное, не понимаю в чем смысл... вернее, задачу-то, понял, а вот область применения не "вижу"... Лично сейчас я вижу два применения - качественная отладка длительности работы и логирование, которое будет создавать один файл с логами на весь агент, а нет по файлу на сабдеревья-то не сложно строить, сложнее их анализировать но в чем смысл? получить дерево процедур для дальнейшего анализа?.. других применений не вижу... Может быть ещё прибавится Сообщение отредактировал fedotxxl - 26:01:2008, 14:48 -------------------- |
|
|
|
26:01:2008, 20:49
Сообщение
#10
|
|
|
|
Для: fedotxxl
Singleton кратко описан в ]]>Википедии]]>. Наверное, хотелось бы иметь отладочный лог прогонки агента, тест производительности и т.п., но чтобы всего этого не было в продакшн-версии без переписывания кучи кода. Тогда имеет смысл создать класс "контроллера" с пустыми реализациями методов start() и end() и его подклассы, выполняющие действия по профилированию или записи лога. Далее код, иллюстрирующий мои замечания. Писал прямо здесь, это только наброски. Пример клиентского кода. Изменив одну строчку, получим нужную функциональность. Кстати, в Lotus есть логгер NotesLog. И еще замечание. В справке указано: Цитата User-defined errors must be in the range of 1000-1999.
|
|
|
|
27:01:2008, 00:05
Сообщение
#11
|
|
|
|
Для: Yakov
Прости, в ООП я пока не силен, и голова не варит... 1. Для того, чтобы не передавать контроллер как параметр, ты его объявляешь global'ом? 2. Любое общение с контроллером идет через функцию getController? 3. Новая для меня вещь - переменной объявленной как Base класс можно присваивать наследующие классы? Цитата Set theController = New Logger() 4. Предположим, что у Logger'a и Profiler'a существуют свои методы, которые не совпадают (например в Logger'e - .Log, в Profiler'e - .Profile)... Тогда я в контроллере определяю все возможные методы, а соотв классах переопределяю только нужные? 5. В итоге при тестировании метод getController() у меня будет выглядеть , а при конечной сдаче Цитата Public Function getController() As Controller ?If theController Is Nothing Then Set theController = New Controller() 'New Profiler(), New Logger() End If Set getController = theController End Function 6. Я так понял, что такая реализвация позволит мне переключаться между Logger, Profiler и Controller путем переписания двух строк? Есть ли ещё какие преимущества? Интересно, но задача была несколько другой - написать FrameWork, одной из функций которого было бы удобное логирование и тест на производительность... Включено ли логирование или нет я думал проверять внутри методов Кстати, посмотрел насколько оправдано использование метода getController только лишь для того, чтобы не писать дополнительную строку проверки на существование класса в начале каждого метода. Получил, что 10000 раз исполнения этого метода занимают .015 сек =) Темная вещь Сообщение отредактировал fedotxxl - 27:01:2008, 00:08 -------------------- |
|
|
|
27:01:2008, 22:27
Сообщение
#12
|
|
|
|
==== к сожалению, случайно закрыл вкладку браузера вместе с постом на три экрана. восстановлю, когда высплюсь. (IMG:http://forum.codeby.net/style_emoticons/default/smile.gif) ====
краткое содержание. 0. Ничего, что в ООП не силен, это проходит. 1. Нет. 2. Да. 3. Да. Один из принципов ООП - полиморфизм. 4. Вариантов море. Один вы озвучили. 5. Да. 6. Да. Разве этого преимущества недостаточно? Не более 1.5 микросекунд на вызов функции не такое большое время, чтобы его заметить, если вы не робот-андроид. Сообщение отредактировал Yakov - 27:01:2008, 22:33 |
|
|
|
27:01:2008, 23:12
Сообщение
#13
|
|
|
|
Для: Yakov
Жду вашего развернутого поста, если не сложно Цитата 1. Нет. Как же подругому?Цитата 3. Да. Один из принципов ООП - полиморфизм. Гм.. все-равно мне это сложно понять. В чем преимущество?Цитата 6. Да. Разве этого преимущества недостаточно? Это очень интересная техника, но мне несколько иное требовалось
-------------------- |
|
|
|
9:02:2008, 19:26
Сообщение
#14
|
|
|
|
Для: fedotxxl
Прошу прощения за столь долгое отсутствие. Судя по последним темам, вы уже далеко продвинулись в своих изыскания. Видимо, ответ в эту тему будет слегка запоздавшим. Поэтому по существу отвечу в соответствующих темах, а здесь приведу несколько полезных, на мой взгляд, книг. 1. ООП и дизайн. Классика - Гради Буч. Объектно-ориентированный анализ и проектирование. Паттерны (шаблоны) проектирования - опять же классическая книга "банды четерых" - Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Но эту книгу читать очень тяжело. В принципе, практически в любой книге по UML приводится большое количество паттернов проектирования. Еще одна очень хорошая книга - Мартин Фаулер. Архитектура корпоративных программных приложений. 2. Рефакторинг (переработка кода). Мартин Фаулер. Рефакторинг. Улучшение существующего кода. (Мартин Фаулер вообще очень мощный профессионал. Считаю, что его книги нужно брать не раздумывая. А лучше сразу две: одну самому читать, вторую коллегам/друзьям дарить. См. также ]]>http://martinfowler.com/)]]> Джошуа Кериевски. Рефакторинг с использованием шаблонов (паттернов проектирования). Эта книга из серии Martin Fowler Signature Series. После ее прочтения становятся понятны многие паттерны и способы их применения. Must have (как и всю Martin Fowler Signature Series). 3. Измерение производительности и оптимизация кода. Крис Касперски. Техника оптимизации программ. Эффективное использование памяти. Еще мощный источник знаний и опыта - исходные коды. И не только лотусовые исходники. К примеру, в java очень хорошая и большая библиотека классов. В ней есть практически все, что нужно. Существует масса библиотек и инструментов с открытыми исходными кодами, к примеру, Apache log4j для журналирования (проект apache.org). Я считаю, что чтение исходников - это своего рода обучение программерскому ремеслу (и искусству) у профессионалов. Изучил исходник, проникся, применил к своей задаче (пусть даже на другом ЯП). |
|
|
|
Ссылка на тему:
BBCode:
HTML:
BBCode:
HTML:
![]() ![]() ![]() |
| Тема | |||||
|---|---|---|---|---|---|
![]() |
Деревья на Pascal Написать дерево на Паскале |
0 | Wolfram | 73 | 10:12:2009 - 09:18 Wolfram |
![]() |
АВЛ-деревья программа удаления записи |
0 | DUPLET | 171 | 8:05:2009 - 06:27 DUPLET |
![]() |
Dst деревья | 1 | Cati | 376 | 5:12:2007 - 22:35 Pasha |
![]() |
Деревья решений Построение дерева принятия решения на Delphi |
0 | -Isilme- | 823 | 10:05:2007 - 16:19 Isilme |
![]() |
Бинарные деревья | 6 | toxa_2006 | 2 749 | 26:11:2006 - 12:20 BiSoN |
|
Текстовая версия | Сейчас: 9:02:2010 - 10:18 |
© 2010 .




25:01:2008, 12:06













