Lotus Analyzer V1.6

Тема в разделе "Разработки форумчан", создана пользователем ToxaRat, 21 июл 2009.

  1. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    [​IMG]
    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]]> справа кнопка "[скачать]"

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

    Вложения:

    • Analize16.rar
      Размер файла:
      77,2 КБ
      Просмотров:
      70
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Почему в ф-ии
    Код (Text):
    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
    он считает, что
    Код (Text):
    IOIsFileOpenV2 - содержит лишние переменные: correctpath
    Вообще довольно прикольно, многое похоже на правду.
    Во всяком случае по поводу неиспользуемых переменных.
    Ошибка
    Код (Text):
    - Отсутствует option declare
    иногда указывает на биб-ки, где он точно есть :)
     
  3. Cleric-Lviv

    Cleric-Lviv Lotus team
    Lotus team

    Регистрация:
    3 янв 2008
    Сообщения:
    605
    Симпатии:
    0
    а мне понравилось:)
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Ещё в одной ф-ии указал на переменную, которая якобы лишняя, но она точно не лишняя.
    Справедливости ради замечу, что 90% лишних переменных указывает правильно.

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

    Klido Гость

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

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

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    У меня зациклился на одной из библиотек и вывалился с сообщением "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...
     
  7. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    ПолуОФФ:
    Если включать в понятие перформанс время, затрачиваемое на сопровождение: очевидно - да.
    Имхо, не стоит постоянно думать о производительности в процессе проектирования и непосредственно написания кода. ( не надо пользовать алгоритм быстрого поиска для обработки целочисленного массива из 100 элементов )
    Производительность - одна из важнейших характеристик продукта, но написание 100% кода с оглядкой на перформанс - пустая трата денег работодателя.
    Антону Владимировичу Коваленко - респект. Даже сама идея очень удачна. А тут с реализацией!
    Тулза очень полезна, если работает, как обещано. Мне, как разработчику, значительно важнее читабельность кода, нежели его производительность. Почти в любом проекте есть код, который никогда не удаляется только потому, что неизвестно - используется ли он или нет. Меньше кода - меньше ошибок.
     
  8. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    ну спасибо :)

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

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

    если можно сделайте мне экспорт такой библиотеки, чтобы откатать
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    В конструкции вида
    Код (Text):
    Do While ...
    Do
    Done = True
    ....
    If ... Then
    ....
    Done = False
    End If

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

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    если можно то дизайн этой базе вышлите

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

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Полезно также анализировать число строк процедур/функций. Как правило кусок кода более 100 строк в голове плохо укладывается, такое следует разбивать на отдельные смысловые части.
     
  12. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    и это пофиксил
     
  13. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, 100 строк - черезчур мало :)
    Ну и не делать это как ошибку, а просто предупредить, что многова-то...
     
  14. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    думал об этом, но тогда мой стиль многие из вас возненавидят, так как у меня процедуры должны помещаться в 37 строк(стандартный размер экрана дизайнера) и это вместе с комментариями, тем более есть примеры когда разделять безполезно
    например когда пишите шлю из одной системы в другую где нужно одну ячейку внести в другую, тут и массив ячеек будет большой и без массива тоже много

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

    Klido Гость

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

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    эту фразу я выдаю когда поле в которое я логирую приближается к 32К, сканировать продолжаю но лог уже не наполняю
    как раз на ПЯ и увидел что лог можно переполнить :)

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Не любит анализатор и 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) }
     
  18. Klido

    Klido Гость

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    судя по ф-ционалу утили - работа проделана грандиозная, респект

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

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

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    жестко однако ParamTypeName теперь отсекает а вот P будет 50/50
    выполнять екзекут в одну строку через ":" я на текущ. этапе не смогу профиксить

    спасибо
    логи переполняются из-за количества ошибок, если ошибок нет в логе будет лишь 5 строк
    да и не удобно в файл, обьясню - сам уже неделю с этим работаю, беру прямо из лога копирую кусок, тут же находу его и правлю а лепить это в отдельный файл и потом с этим заморачиваться будет не удобно, да и не столь визуально наглядно получится

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

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

Поделиться этой страницей