Размер библиотек

  • Автор темы Автор темы Kee_Keekkenen
  • Дата начала Дата начала
K

Kee_Keekkenen

привет всем,
поделитесь своими соображениям по преодолению ограничения размера кода в библиотеках..
в частности, при написании кода классов с наследованием..
какие пути решения вы используете ?
 
Тоже задумался над этим когда одна библиотека разрослась до 1,5 мегабайта... сейчас думаю о возможностях использования динамического кода ( описал , точнее перевёл и немного дополнил , - тут )
Дин. код даст возможность подключать библиотеки в секции Use тоже динамически и не хранить тонны кода в скр. библиотеках(а можно даже в обычных документах, что я реализовавывал). Хотя у этого метода очень много разных подводных камней и ограничений.Но загружаються эти бибилиотеки в память ТОЛЬКО по мере использования

Ну и плюс канечно разные оптимизации кода ( без заведения кучи ненужных переменных ), замена конструкций ттипа
Код:
 Dim ws as new NotesUIworkspace
Dim uidoc as NotesuiDocument
Set uidoc = ws.CurrentDocument
Dim doc as NotesDocument
Set doc = uidoc.Document
s = doc.GetItemValue( "MyField" )(0)



на такие
Код:
 Dim ws as new NotesUIworkspace
s = ws.CurrentDocument.Document.GetItemValue( "MyField" )(0)

да и тоже возможный вариант - это использование внешних библиотек - Dll
 
в данный момент у меня видимо что-то с руками не так, потому что клиент стал падать при повторных вызовах классов из библиотеки, размер библиотеки на самом деле маленький, но что-то в ней не так..
написал несколько классов:
1. базовый (в основном тут абстрактные функции)
2. наследник от 1
3. наследник от 2
4. наследник от 2
5. сам по себе (работа с файлом настроек), используется в 3 и 4

все эти классы лежат в одной либе.. для использования классов 2,3,4 в события бд были созданы 3 отдельные библиотеки, в которых инициализировался только один класс (2, 3, или 4)

когда класса было четыре все работало и настройки сохранялись в персональный документ, затем я решил настройки выносить в файл и добавил класс(по аналогии с функциями get, set для environment изменения параметров в notes.ini) для работы с файлом.. работа данными с файла производится через notesstream..

тестировал этот класс агентом все работало..

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

извините, что немного поторопился с созданием темы, я почему-то решил что дело в размере.. видимо дело в качестве кода или подводных камнях лотуса, которые пока не увидел..
 
ну у меня с 1,5 метровой бибиллотеки - падений небыло ... так что дело не в размере. Тем более что Вы говорите что он маленький...

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

а в 5м классе с notesstream -что там с обработчиком ошибок ?
 
Kee_Keekkenen у вас 4 класса или библиотеки? просто вот тут речь про библиотеки:
а теперь при повторном использовании библиотеки 4
скорее всего где-то "закольцовано" использование библиотек... из-за такого клиент на самом деле может падать...
 
а в 5м классе с notesstream -что там с обработчиком ошибок ?

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

причина в некорректном коде 5 либы с notesstream частое открытие/закрытие файла в поток и валит лотус

скорее всего где-то "закольцовано" использование библиотек... из-за такого клиент на самом деле может падать...

в мое случае это не то, после падения я вынес каждый класс в отдельную библиотеку и тут уже трудно перепутать где и что лежит..
 
Kee_Keekkenen не... извиняюсь, я немного некорректно выразился... я про закольцованность типа:

у вас есть библиотеки lib1 и lib2 .... например, в lib1 используется "lib2" ....
а есть форма, в которой указано "Use lib1 и Use lib2" .... когда библиотек немного, падения клиента может и не быть, а когда исрользуется не одна "перекрёстная" библиотека - падения клиента возможны...
т.е. в форме достаточно указать "родительскую" библиотеку... если остальные библиотеки от нее наследуются, то указывать их использование в форме (и пр.) не нужно...
 
Ну и плюс канечно разные оптимизации кода ( без заведения кучи ненужных переменных ), замена конструкций ттипа
Код:
 Dim ws as new NotesUIworkspace
Dim uidoc as NotesuiDocument
Set uidoc = ws.CurrentDocument
Dim doc as NotesDocument
Set doc = uidoc.Document
s = doc.GetItemValue( "MyField" )(0)



на такие
Код:
 Dim ws as new NotesUIworkspace
s = ws.CurrentDocument.Document.GetItemValue( "MyField" )(0)

Боже упаси от такой оптимизации... не читабельно совсем...
А размер библиотеки совсем не проблема...До 2-х Гб работает нормально, а это болдее чем достаточно... :) Тем более на производительность не влияет...
 
нужно добавлять "имхо"

Нет, не надо, так как это не только мое мнение.. с ним, уверен, согласистя большинство :D

ScriptLib = 2 Gb вот такого я ещё не видел )))

Я тоже не видел, 2 Гига - потолок для библиотеки просто :lol:
 
я все еще в тупике..
допустим есть иерархия наследования классов и при инициализации самого последнего наследника происходит компиляция кода, в который встраиваются по крайней мере константы, функции и процедуры используемые в конструкторах (и те, от которых они зависят), а также все методы инициализируемого класса, т.о. может получиться внушительный код..

т.о. по отдельности классы могут быть не большими, а в результате наследования "собака могла подрасти"
каков у вас размер таких "конструкций", не библиотек, а именно таким образом связанных объектов?..

все-таки у меня есть смутное подозрение об ограничении размера загружаемого компилированного LS-кода..

мое подозрение о кривости кода 5-го класса не подтвердилось, переписав 5-й класс по другому, но клиент падает по прежнему..

осталось проанализировать 4-й класс, использующий 5-й (3-й, использующий 5-й работает)..

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

Recompile all LS пробовали?
 
Отдебаггить весь код пока не найдете конкретную строку где клиент умирает пробовали?

Recompile all LS пробовали?

1 невозможно, т.к. код либы используется через use в форме и падение происходит при открытии документа - щелкаешь по документу 1-й раз все работает, 2-й разпадает( даже если инициализировать класс прямо на форме)..
2 не помогает
 
А эта либа где в форме юзается? В Globals? Если да, попробуйте перенести Use в какое-нить другое место, например просто в Options формы, или на конкретные акшны/хотспоты.
 
Клиент падает совсем не из-за размера кода... Что-то Вы там такое просто делаете, что не нравится клиенту... Тока дебажить...
Если дебагером не выходит - есть же принты и мессаджбоксы... ;)
 
Я заметил, что когда есть либы с классами, и одна используется в другой, то лотус видимо при загрузке в форме этих либ начинает толи перекомпиливать их, толи какие-то еще хитрые операции происходят. Как пример - у меня была либа с классами, когда она была в Globals - форма открывалась по 10 секунд. Стоило убрать её из глобалсов на хотспоты - форма стала открываться мгновенно. Причем отработка кода в хотспотах тоже мгновенно происходила. Версия клиента 6.5.1.

Похоже что в глобалсах классовые либы юзать просто нельзя из-за каких-то непонятных багов.
 
Я заметил, что когда есть либы с классами, и одна используется в другой, то лотус видимо при загрузке в форме этих либ начинает толи перекомпиливать их, толи какие-то еще хитрые операции происходят. Как пример - у меня была либа с классами, когда она была в Globals - форма открывалась по 10 секунд. Стоило убрать её из глобалсов на хотспоты - форма стала открываться мгновенно. Причем отработка кода в хотспотах тоже мгновенно происходила. Версия клиента 6.5.1.

Похоже что в глобалсах классовые либы юзать просто нельзя из-за каких-то непонятных багов.

А тут ничего удивительного нет.
Если Вы пихатете use в глобал Options, то все что у Вас в декларейшене и инициализации библиотеки отрабатывает при открытии документа. Если же вы вешаете юз на хотспот, то все это дело отрабатывает при клике на хотспот.. по-моему все правильно и логично... Так что если у Вас таких хотспотов 2 и больше, то правильней вешать юз на глобальный опшинс и пожертвовать этой парой секунд при открытии документа, а не ждать эти парку секунд при каждом клике на хотспот...
 
Нет, всё не так. В такой либе у меня ничего не было в инициализации.
 
K-Fire
в данный момент при тестировани использую use "ACCstart" Options формы, а в инициализации формы инициализирую данный класс

вот мои классы
1. Class ACCommon - в основном функции
2. Class ACCbase As ACCommon - доступ к базе
3. Class ACC As ACCbase - доступ к данным, использует ACCOptions для занесения параметров доступа в файл, отрабатывает при открытии бд
4. Class ACCstart As ACCbase - на основе параметров доступа сохраненных ранее, разрешает запрещает доступ к данным, использует ACCOptions для считывания параметров
5. Class ACCOptions - работа с файлом настроек (читает/пишет в файл строки параметр=значение)

проблема возникает при использовании класса ACCstart, совместно с ACCOptions при чем падение может возникать, как до инициализации объекта класса ACCOptions, во время получения значения параметров, так и после того, как все отработало, а именно при ЗАКРЫТИИ документа, только что открытого документа..
но падает клиент только после повторного открытия одного и того же документа, хотя я принудительно удаляю и в внутри классов и снаружи после их отработки

для чистоты закомментировал весь код класса ACCstart кроме инициализации класса ACCOptions и получения нескольких параметров, и процедуры закрытия класса

может быть проблема в листе, который я использую
Код:
Type param
value As String
End Type
Private data List As param

при инициализации ACCOptions данные из файла с параметрами заносятся в лист
Код:
If Not checkFile( filePath) Then Exit Sub
filenum = Freefile()
Open filePath For Input Lock Write As filenum Charset=DEFCHARSET
Do Until Eof(fileNum)			
Line Input #fileNum, text
If text <> "" And Instr( text, PD) > 0 Then 
data(Strtoken( text, PD, 1)).value = Strtoken( text, PD, 2)
End If
Loop
Close filenum
при закрытии класса, если данные менялись, то переписываются данные в файл
Код:
	Sub close		
Dim filenum As Integer
try:
On Error Goto catch
If isDataChanged Then
filenum = Freefile()
Open filePath For Output Lock Write As filenum Len=1000 Charset=DEFCHARSET 
Forall dat In data
Print #filenum, Listtag(dat) & PD & dat.value
End Forall
Close filenum
End If
Erase data
Set ses = Nothing		
Exit Sub
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Sub
End Sub

ну и собственно, занесение и получение значения параметров
Код:
Function setEnvir( key As String, value As String) As Boolean		
try:
On Error Goto catch			
If data(key).value <> value Then
data(key).value = value			
isDataChanged = True
End If
Exit Function
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Function
End Function
'--------------------------------------------------------------------------------------------------------------------------------------					
Function getEnvir( key As String) As String		
try:
On Error Goto catch		
getEnvir = data(key).value
Exit Function
catch:
Call errh (Getthreadinfo(1) & " (Class ACCOptions)", False)
Exit Function
End Function
'--------------------------------------------------------------------------------------------------------------------------------------

вроде все логично, но почему лотус падает, когда получаем данные не понятно ?!
может кто сталкивался с подобным ?
 
Так что если у Вас таких хотспотов 2 и больше, то правильней вешать юз на глобальный опшинс и пожертвовать этой парой секунд при открытии документа, а не ждать эти парку секунд при каждом клике на хотспот...
Ошибочка вышла.
Библиотека не инициализируеться при каждом клике на хотспот, а только 1 раз.
Т.е. возможно, что первый клик будет работать дольше других, но все последующие будут без инициализации.
Такое поведение под 7.0.2
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!