Lotus Analyzer V1.6

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#1

Lotus Analyzer V1.6
Описание:
Эта утилита предназначена для проверки LS кода в выбранной базе посредством DXML экспортера а так же служит неким измерителем качества написанного кода.
Всё что необходимо это открыть эту базу в лотус клиенте начиная с версии 6.5, выбрать необходимую базу и смотреть полученный анализ.
Утилита ничего не меняет в выбранной базе, а лишь считывает всю информацию из всех её элементов дизайна.
Используется чистый Lotus Script без использования каких либо dll
Очень рекомендую использовать данную утилиту как новичкам лотуса так и профи.
Так же она поможет сделать выбор среди систем написанных на лотусе, если важным аргументом является качество и оптимизация написанного кода.

Минимальные требования:
- Lotus Notes 6.5 и выше
- доступ в необходимую базу

Краткая предыстория:
Занимаясь более 10 лет лотусом я сталкивался с разными продуктами. Часто встречался с откровенным БРедом и очень сильно хотелось иметь какое-то средство позволяющее сразу показать и по возможности вычистить всё ненужное и лишнее, а так же понять насколько качественный код я пишу и предоставляю заказчикам.
В моей работе чаще всего пользовался Teamstudio Analyzer (утилита позволяющая найти код, который где-то используется) и scanEZ (утилита позволяющая просмотреть всё изнутри).
Но как-то ни разу не наталкивался на утилиту, которая бы могла проверить синтаксис кода LS на предмет варнингов (не используемая переменная/функция, не задекларировано и т.д.), так как это сделано в C++ и других языках высокого уровня.
Подойдя к моменту, когда очередная моя система ]]>СЭД MasterDOC ]]> обросла большим количеством "фич" решил проверить её на мусор, качество и оптимизацию, для этого и пришлось начать писать эту утилиту, которая достаточно шустро пробегается по всему коду и показывает на что следует обратить внимание.
Ко всему прочему данная утилита предоставляется всем нашим заказчикам, чтобы они лично могли убедиться, что предоставляемая им система очень качественная и сравнить это со своими наработками в лотусе и при необходимости подправить и выйти на "планку качества".
Так как данная версия бесплатна, то я оставляю за собой право высылать полученный результат себе на почту - не бойтесь исходники ваши никуда не пересылаются, пересылается лишь результат оценки работы утилиты, дабы я знал правильно ли она работает и вел по ней статистику.
Если вдруг вам захочется сказать мне "спасибо" то лучше сделайте это в денежном эквиваленте, контакты мои у вас есть.

Сравнительный анализ по версиям на шаблоне "StdR6Mail" mail6.ntf (6.5.6 от 06.12.2006):
Версия Line codes Errors Correlation Time work
1.0 34285 532 1.5517% 99 sec
1.1 34331 793 2.3099% 102 sec
1.2 37258 891 2.3914% 117 sec
1.3 37258 943 2.5310% 119 sec
1.4 37258 1088 2.9202% 121 sec
1.5 59121 2502 4.2320% 113 sec
1.6 59094 2823 4.7771% 209 sec

Версия 1.6 - 05.01.2011
- исправлено ложное срабатывание на неиспользованную переменную
- исправлена некоректная обработка переменных содержащих в конце % $
- добавлены действия: DELETE LSOBJECT позволяет удалить откомпилированный Lotus Script, после данного действия необходимо сделать рекомпиляцию всей базы Tools\Recompile All LotusScript, данное действие необходимо периодически делать, так как если вы переписываете LS на @ то откомпилированный код не пропадает а продолжает висеть мёртвым грузом в элементах дизайна
- добавлены действия: DELETE $Fields позволяет удалять поле в форме/подформе в котором содержится список всех полей что есть и были в данной форме/подформе
- добавлен новый цвет для РТтекста: действия выделяются синим цветом
- добавлен итог сколько Kb освобождено при удалении LSOBJECT
- добавлен итог сколько Kb освобождено при удалении $Fields
- доработана проверка неиспользованных функций/процедур в библиотеках по всей базе данных
- добавлен алгоритм обработки констант по аналогии с переменными
- добавлена проверка на зря использованную библиотеку, когда её процедуры и переменные не использованы


Версия 1.5 - 06.08.2010
- исправлен подсчёт статистики когда анализ обрабатывается сервером
- исправлено ложное срабатывание на неиспользованную переменную Source в кнопках, хотспотах и т.д.
- исправлен алгоритм поиска переменных (byval)
- начат анализ @-Formula:
1) view select - если встречается два и более пробела/таба в view select и длинна view select больше 256 символов
2) hide when - если встречается два и более пробела/таба, если в формуле скрытия встречаелся @dblookup или @dbcolumn или длинна формулы скрытия больше 512 символов


Версия 1.4 - 25.12.2009
- исправлен подсчёт статистики когда анализ обрабатывается сервером
- добавлена проверка на правильное использование Doc items для UIDoc
- добавлена проверка переменных указанных как аргументы процедур/функций
- добавлена быстрая возможность отправить отработанный серверный анализ на повторное анализирование
- в описание добавлен сравнительный анализ по версиям


Версия 1.3 - 15.12.2009
- исправлен поиск неиспользованных переменных
- исправлен алгоритм поиска неиспользованные функций
- добавлена возможность анализировать сервером
- добавлена возможность сохранять результаты анализа сервера
- анализ сервера сохраняется в базе и отсылается указанным лицам
- серверный анализ сделан через РТтекст и более красив
- добавлена проверка на команду Stop в LS, в которой нет необходимости в нормальном коде
- добавлена проверка на правильное использование Doc items - например: (Doc.Var1 = "1") не правильно, правильно только (Doc.ReplaceItemValue("Var1", "1")) - аналогично с (a1 = Doc.Var1(0)) или ошибочное использование свойств например: (if Doc.IsResponCe then)
- добавлена возможность выбирать анализируемые элементы: All, library, agent, form, view


Версия 1.2 - 12.08.2009
- доработан поиск неиспользованных переменных
- теперь можно сканировать целую папку с базами, достаточно в пути указать название папки а не полный путь к базе
- теперь запись вида i=evaluate(), i=shell() не считается неиспользуемой переменной
- если елемент дизайна содержит весь код во внешнем файле (%include "*.lss") то этот елемент не анализируется
- исправлено когда хотспот наложнный четко на поле считался невидимым
- исправлен алгоритм поиска числовых переменных (var%)
- исправлено когда не искалось "option declare" в секции view при незаполненой секции global
- при ошибке "option declare" теперь указывается в каком элементе был найден lotus script (помогает когда возможно элемент был очищен не до конца)
- дополнена статистика
- defaulthotspot наложенный на картинку теперь воспринимается как отдельный объект
- исправлено когда игнорировался код если в элементе ничего не было заполнено в секции Global
- теперь анализируется Database Script
- добавлена проверка на отсутствие кода в обьекте
- добавлена проверка на наличие подряд двух и более пустых строк
- добавлена статистика по комментариям в коде
- изменен интерфейс на английский


Версия 1.1 - 24.07.2009
- исправлено когда файловый указатель считался не использованной переменной
- исправлено когда переменная не виделась в условии: цикла loop var, execute (dim var...)
- анализ используется ли библиотека где либо в базе
- добавлена обработка ошибки если елемент дизайна не удается обработать DXML экспортером
- теперь обьекты типа кнопок/полей/хотспот в формах/подформах/видах воспринимаются как отдельные обьекты и анализируются более корректно
- анализируются поля/кнопки/хотспоты содержащие в себе LS
- анализируются "невидимые" хотспоты - те у которых текст позднее был стерт и они не видны в дизайне, но присутствуют
- анализ используется ли локальная процедура/функция в данном элементе дизайна
- добавлена возможность не протоколировать выбранные ошибки
- добавлена возможность очистить протокол
- в утилиту добавлены скрытые "тестовые" ошибки, чтобы можно было протестировать всё на ней - Demo режим
- по умолчанию сервер/база указывают на утилиту


Версия 1.0 - 21.07.2009
- сканирование всех элементов дизайна прямо в памяти, создание соответствующих классов и процедур
- вырезание из анализа ремарков/комментариев (' %REM - %ENDREM)
- сбор в единое когда используется перенос строки (_)
- анализ элементов дизайна на наличие в них скрипта LS и если скрипт присутствует то проверка на обязательное наличие Option Declare, так как отсутствие этого часто ведет что переменная названа с ошибкой и функционал из-за этого начинает работать неверно или же используется неправильно задекларированный тип переменной
- анализ на поиск неиспользованных переменных/массивов внутри функций/процедур/классов
- анализ чтобы глобальная переменная не объявлялась в локальной процедуре с тем же именем
- анализ на поиск неиспользованных глобальных переменных/массивов внутри функций/процедур


Идеи и замечания высылайте на мои контакты
скачать можно тут - ]]>Lotus Analyzer V1.6]]> справа кнопка "[скачать]"

тут же можем пообсуждать чего бы вам в этой утилите еще хотелось бы видеть...
 

Вложения

Omh

Lotus team
04.07.2007
2 210
1
#2
Почему в ф-ии
Код:
Function IOIsFileOpenV2(Path As String) As Boolean
If Path = "" Then Exit Function

Dim CorrectPath As String
CorrectPath = NormalizePath(Path)

Dim fileNum As Integer
fileNum = Freefile()

On Error 101 Goto errorFileAlreadyOpen
Open CorrectPath For Random Lock Read Write As filenum
On Error Goto 0

Close filenum

IoIsFileOpenV2 = False
Exit Function

errorFileAlreadyOpen:
IoIsFileOpenV2 = True
Exit Function
End Function
он считает, что
Код:
IOIsFileOpenV2 - содержит лишние переменные: correctpath
Вообще довольно прикольно, многое похоже на правду.
Во всяком случае по поводу неиспользуемых переменных.
Ошибка
Код:
- Отсутствует option declare
иногда указывает на биб-ки, где он точно есть :)
 

Omh

Lotus team
04.07.2007
2 210
1
#4
Ещё в одной ф-ии указал на переменную, которая якобы лишняя, но она точно не лишняя.
Справедливости ради замечу, что 90% лишних переменных указывает правильно.

Вопрос на засыпку: лишние переменные дают заметный удар по перфомансу или не?
 
K

Klido

#5
при попытке открыть админом 8.5.1 - валит лотус... клиентом открывает....

сразу хотелось бы иметь возможность выбора по чему проходим (элементы дизайна), а то полчаса не дождаться, пока будут проверены мелочи вроде десятков мелких баттонов... т.е. хотим, например, проверить только библиотеки - их и выбрали....
а с другой стороны выбор искомых ошибок по типу "не показывать отсутствие option declare"

на произвольно взятой базе на 5-й минуте вылетает еррор: Dom operation failed и дебаггером не ловится....
 

TIA

:-)
Lotus team
15.05.2009
790
3
#6
У меня зациклился на одной из библиотек и вывалился с сообщением "Out of string space".
Библиотека из Sandbox'а. Кусок зацикленных сообщений:

12:25:01 - scriptlibrary: UIAttachmentClass: scriptlibrary: UIAttachmentClass...
scriptlibrary: UIAttachmentClass: class - attachmentwatcher: cleantempfolder - содержит лишние переменные: foldermask, file
12:24:56 - scriptlibrary: UIAttachmentClass: scriptlibrary: UIAttachmentClass...
scriptlibrary: UIAttachmentClass: class - attachmentwatcher: cleantempfolder - содержит лишние переменные: foldermask, file
12:24:53 - scriptlibrary: UIAttachmentClass: scriptlibrary: UIAttachmentClass...
scriptlibrary: UIAttachmentClass: class - attachmentwatcher: cleantempfolder - содержит лишние переменные: foldermask, file
12:24:52 - scriptlibrary: UIAttachmentClass: scriptlibrary: UIAttachmentClass...
 
13.03.2009
625
1
#7
Вопрос на засыпку: лишние переменные дают заметный удар по перфомансу или не?
ПолуОФФ:
Если включать в понятие перформанс время, затрачиваемое на сопровождение: очевидно - да.
Имхо, не стоит постоянно думать о производительности в процессе проектирования и непосредственно написания кода. ( не надо пользовать алгоритм быстрого поиска для обработки целочисленного массива из 100 элементов )
Производительность - одна из важнейших характеристик продукта, но написание 100% кода с оглядкой на перформанс - пустая трата денег работодателя.
Антону Владимировичу Коваленко - респект. Даже сама идея очень удачна. А тут с реализацией!
Тулза очень полезна, если работает, как обещано. Мне, как разработчику, значительно важнее читабельность кода, нежели его производительность. Почти в любом проекте есть код, который никогда не удаляется только потому, что неизвестно - используется ли он или нет. Меньше кода - меньше ошибок.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#8
ПолуОФФ:
Если включать в понятие перформанс время, затрачиваемое на сопровождение: очевидно - да.
Имхо, не стоит постоянно думать о производительности в процессе проектирования и непосредственно написания кода. ( не надо пользовать алгоритм быстрого поиска для обработки целочисленного массива из 100 элементов )
Производительность - одна из важнейших характеристик продукта, но написание 100% кода с оглядкой на перформанс - пустая трата денег работодателя.
Антону Владимировичу Коваленко - респект. Даже сама идея очень удачна. А тут с реализацией!
Тулза очень полезна, если работает, как обещано. Мне, как разработчику, значительно важнее читабельность кода, нежели его производительность. Почти в любом проекте есть код, который никогда не удаляется только потому, что неизвестно - используется ли он или нет. Меньше кода - меньше ошибок.
ну спасибо :)

Почему в ф-ии

Function IOIsFileOpenV2(Path As String) As BooleanIf Path = "" Then Exit FunctionDim CorrectPath As StringCorrectPath = NormalizePath(Path)Dim fileNum As IntegerfileNum = Freefile()On Error 101 Goto errorFileAlreadyOpenOpen CorrectPath For Random Lock Read Write As filenumOn Error Goto 0Close filenumIoIsFileOpenV2 = FalseExit FunctionerrorFileAlreadyOpen:IoIsFileOpenV2 = TrueExit FunctionEnd Function

он считает, что

IOIsFileOpenV2 - содержит лишние переменные: correctpath
признаюсь - ошибка, как-то не додумался сразу проверить что переменная используется как файловый указатель, в след. версии учту

Справедливости ради замечу, что 90% лишних переменных указывает правильно
если в переменную присвоено значение и в дальнейшем значение из неё не поднимается - считаю что она не используется, поэтому прошу обратить на это внимание

Ошибка
- Отсутствует option declareиногда указывает на биб-ки, где он точно есть
если можно сделайте мне экспорт такой библиотеки, чтобы откатать
 

Omh

Lotus team
04.07.2007
2 210
1
#9
В конструкции вида
Код:
Do While ...
Do
Done = True
....
If ... Then
....
Done = False
End If

Next
Loop Until done
Loop
тоже посчитал done лишней.

Больше вроде косяков не приметил.
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#10
на произвольно взятой базе на 5-й минуте вылетает еррор: Dom operation failed и дебаггером не ловится....
если можно то дизайн этой базе вышлите

утилита возможно еще сыровата, но на большинстве своих баз и стандартных лотусиных откатал без ошибок
 

nvyush

Lotus team
22.04.2009
2 317
0
#11
ПолуОФФ:
Если включать в понятие перформанс время, затрачиваемое на сопровождение: очевидно - да.
Полезно также анализировать число строк процедур/функций. Как правило кусок кода более 100 строк в голове плохо укладывается, такое следует разбивать на отдельные смысловые части.
 

Omh

Lotus team
04.07.2007
2 210
1
#13
Не, 100 строк - черезчур мало :)
Ну и не делать это как ошибку, а просто предупредить, что многова-то...
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#14
Полезно также анализировать число строк процедур/функций. Как правило кусок кода более 100 строк в голове плохо укладывается, такое следует разбивать на отдельные смысловые части.
думал об этом, но тогда мой стиль многие из вас возненавидят, так как у меня процедуры должны помещаться в 37 строк(стандартный размер экрана дизайнера) и это вместе с комментариями, тем более есть примеры когда разделять безполезно
например когда пишите шлю из одной системы в другую где нужно одну ячейку внести в другую, тут и массив ячеек будет большой и без массива тоже много

я же старался выделить ошибки к которым явно не придраться
 
K

Klido

#15
на большинстве своих баз и стандартных лотусиных откатал без ошибок
может всё-таки версия клиента?
после нескольких попыток получил "!ЛОГ ПЕРПОЛНЕН!"... хотя клиента даже перегружал... не очищается?
хорошая идея со стандартной базой - натравил на англ. почту 8.5.1... 26314 строк - ошибка DOM operation failed...хм

что радует, так в стандартном почтовом 3% неправильностей, а в своих - не более 0.8% :)
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#16
после нескольких попыток получил "!ЛОГ ПЕРПОЛНЕН!"... хотя клиента даже перегружал... не очищается?
эту фразу я выдаю когда поле в которое я логирую приближается к 32К, сканировать продолжаю но лог уже не наполняю
как раз на ПЯ и увидел что лог можно переполнить :)

ошибка DOM operation failed...хм
хоть я и распарсиваю весь код, вероятность, что могу уйти в вечный цикл существует
и на ранних этапах у меня это происходило, особенно когда мне нужно было аккуратно понять обьявленный класс со всеми его переменными, функциями и процедурами...
 

TIA

:-)
Lotus team
15.05.2009
790
3
#17
Не любит анализатор и execute. Считает ParamTypeName и P лишними переменными.

Dim ParamTypeName As String

...
ParamTypeName = Typename(Param)
Execute { Use "}+LSLibName+{" : Dim P as }+ParamTypeName +{ : Set P = tmpParam : Set tmpObj = New }+ClassName +{(P) }
 
K

Klido

#18
а может сразу во внешний файл? всё равно от поля толку, надо сохранять для разборов...
и сканирование в бэкграунд неплохо бы спрятать при этом...
хоть я и распарсиваю весь код, вероятность, что могу уйти в вечный цикл существует
это понятно, но стандартный почтовый шаблон.. хотя.. у них там всегда много разного интересного :)
 

lmike

нет, пердело совершенство
Премиум
27.08.2008
6 567
263
#19
судя по ф-ционалу утили - работа проделана грандиозная, респект

мои соображения:
-неясно почему логи переполняются - их можно в др. место лить (в файл тхт и цеплять к доку)
-ДОМ модель на больших объемах жрет память и время, SAX пердпочтительнее (хотя и сложнее в реализации), ежели для java - есть др. библы для обработки

можно попытаться (хотя в успехе не уверен) заюзать XSLT вместо логики в коде...
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#20
Не любит анализатор и execute. Считает ParamTypeName и P лишними переменными.

Dim ParamTypeName As String

...
ParamTypeName = Typename(Param)
Execute { Use "}+LSLibName+{" : Dim P as }+ParamTypeName +{ : Set P = tmpParam : Set tmpObj = New }+ClassName +{(P) }
жестко однако ParamTypeName теперь отсекает а вот P будет 50/50
выполнять екзекут в одну строку через ":" я на текущ. этапе не смогу профиксить

судя по ф-ционалу утили - работа проделана грандиозная, респект

мои соображения:
-неясно почему логи переполняются - их можно в др. место лить (в файл тхт и цеплять к доку)
-ДОМ модель на больших объемах жрет память и время, SAX пердпочтительнее (хотя и сложнее в реализации), ежели для java - есть др. библы для обработки
спасибо
логи переполняются из-за количества ошибок, если ошибок нет в логе будет лишь 5 строк
да и не удобно в файл, обьясню - сам уже неделю с этим работаю, беру прямо из лога копирую кусок, тут же находу его и правлю а лепить это в отдельный файл и потом с этим заморачиваться будет не удобно, да и не столь визуально наглядно получится

ДОМ в данном случае память жрет не сильно, во всяком случае у меня на 1 гиге все тип топ, кроме тех случаев если вдруг я зациклюсь на шибко умном классе, но тогда и утилита с места не сдвинется.
Пример:
берем реальный ПЯ шаблона 6.5
в момент анализа достиг пика в 7Мб
не так уж и много

Execute { Use "}+LSLibName+{" : Dim P as }+ParamTypeName +{ : Set P = tmpParam : Set tmpObj = New }+ClassName +{(P) }
немного подумав...
если это весь екзекут то тут P всё же лишнее так как используется она в конце Set tmpObj = New }+ClassName +{(P) } где вместо P можно использовать тот же tmpParam, который присваивается в P строкой ранее