powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Модули класса. Все ли так просто.
70 сообщений из 70, показаны все 3 страниц
Модули класса. Все ли так просто.
    #32231951
Видел спор о порядке уничтожения объектов. Ну и мне тоже захотелось подлить масла в огонь.

пусть есть первый класс
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Compare Database
Option Explicit

Private m_c As Collection
Private m_Count As Long
Private Sub Class_Initialize()
    Debug.Print  "clsAny1.Initialize" 
    Set m_c = New Collection
    m_Count =  1 
End Sub

Private Sub Class_Terminate()
    Debug.Print  "clsAny1.Terminate" 
    Set m_c = Nothing
End Sub

Public Sub Add(ByRef cls As clsAny2)
    m_c.Add cls,  "id"  & m_Count
    m_Count = m_Count +  1 
    Set cls.Parent = Me
End Sub


ну куда же без второго класса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Option Compare Database

Private m_parent As clsAny1
Private Sub Class_Initialize()
    Debug.Print  "clsAny2.Initialize" 
End Sub

Private Sub Class_Terminate()
    Debug.Print  "clsAny2.Terminate" 
    Set m_parent = Nothing
End Sub

Property Set Parent(ByRef prnt As clsAny1)
    Set m_parent = prnt
End Property


Ну и наконец тетсовая процедурка
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub Test()
    Dim cls1 As clsAny1
    Dim cls2 As clsAny2
    
    Set cls1 = New clsAny1
    Set cls2 = New clsAny2
    cls1.Add cls2
    Set cls2 = Nothing
    Set cls1 = Nothing
End Sub


И что же будет на выходе?

clsAny1.Initialize
clsAny2.Initialize
clsAny2.Terminate
clsAny1.Terminate

Иванов, садись ДВА!

На выходе будет вот что:

clsAny1.Initialize
clsAny2.Initialize

Загвоздка вся в том, что классы содержат ссылки друг на друга.
Исправляется это добавлением следующего метода в класс clsAny1
Код: plaintext
1.
2.
Public Sub RemoveAll()
    Set m_c = Nothing
End Sub

B вызова его в тестовой процедуре.

Выводы:
1. Помнить, что
Set obj = Nothing
не уничтожает объект или выражаясь ООПыми словами не является деструктором объекта, а уничтожает только ссылку на объект.
2. Не верьте событию Terminate, в сложных классах лучше написать свой деструктор.
3. Быть внимательным при программировании отношений Parent-Child.

Вроде все!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231958
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Будем надеяться, что среди стандартных объектов Аксесса нет таких взаимных ссылок, а есть только строгая иерархия.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231970
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да. Это, кажется, у Гетца описано было... Или еще где - не помню уже... Циклические ссылки... Сам на эти грабли наступал в свое время, да и сейчас случается. Именно поэтому обязательно (во время разработки) веду лог (один из логов), отражающий созданные и уничтоженные классы, а так же в каждой строке счетчик, отображающий "живые" классы. Переодически анализирую этот лог и если в момент выхода из приложения (что прописывается отдельной строкой лога) счетчик не равен нулю, то начинаю копать кто и почему не умер. А хде "масло" та? :)

На счет "масла", то... (если позволите предположить, что речь идет о споре, в котором и я принимал участие)... могу сказать следущее:
Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти! Мы пытаемся высвободить память, которая занята объектом, который нам уже не нужен. Более того, мы очень хотим добиться в этом положительног результата , иначе положились бы на механизм автоматического уничтожения переменных (и еже с ними ссылок на объекты) при их выходе за область видимости и не тыкали бы везде и всюду Сет=ничё, Сет=ничё, сет=ниче. Ну а коль скоро мы так печемся о памяти, то позвольте и мне подлить маслеца:
Имеем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ГлобальныеПеременные:           ПамятьПриложения
Строка                          ?
ОбъектА                         ?
ОбъектБ                         ?

СтартоваяПроцедураПроекта:
Строка= "А"  'один символ          1 :  "А" 
ОбъектА= New Что-то              2 : Объект  "Что-то" 
ОбъектБ= New Что-то2             3 : Объект  "Что-то2" 

По ходу выполнения проекта:
Строка= "Некая строка"             1 : X ( "А" ) - мертвая память, запись значения в
                                позицию № 4 
Set ОбъектА=Nothing              2 : Х (Объект  "Что-то" ) - мертвая память
Set ОбъектБ=Nothing              3 : Х (Объект  "Что-то2" ) - мертвая память 
                                 4 :  "Некая строка"  - здесь, ибо не поместилась
                                   полностью в позиции № 1 .

Далее, чтобы мы не делали, как бы мы не пользовались памятью, области с номерами 1-3 останутся "мертвыми" до окончания проекта. Это мое видение того, что происходит внутри, которое частично подтверждается некоторыми тестами. И что же? Мы так яростно боремся за память и тут такая лага оказывается (может быть)...
Пока я не уверен в том, что всё происходит именно так, но в копии рабочего проекта попробовал применить нехитрую технологию: Все глобальные переменные, которые могут по определению занимать различное количество памяти (строковые переменные и массивы. Но с массивами сложнее и проще, поэтому здесь не рассматриваю) в момент старта приложения инициализирую значением, несколько превышающим предположительное максимальное его значение во время выполнения проекта. После этого, специальной строковой переменной произвожу "закрепление" и дальше забываю про всю эту ерунду.
Далее перезапускаю винду, запускаю недоработанный проект, выполняю ряд заранее определенных операций и смотрю на память, которую занимает проект. Повторяю всё тоже самое для доработанного проекта. В последнем случае (после 3-х различных перепроверок) занимаемая процессом память была меньше на 200Кб-1,2Мб(!). Должен сказать, что на ВИДИМОЙ производительности это никак не сказалось, да и на самом деле ХЗ что там творилось во время тестов, но лично для меня это РЕЗУЛЬТАТ.

У меня тоже, вроде, всё!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32231979
Фотография Нуф-нуф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил про еще один мой тест (какой я скромный оказывается) по данной теме (память), о результатах которого можно посмотреть здесь.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232053
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нуф-Нуф: можно я крамольный вещь скажу?
В мире объектного программирования, до которого мы доплыли попутным ветром, нарастив ветрила с 4 мгц до 3 (или скока щас там?) ГГц, набрав тоннажу с 64кило до (у меня 128 мб, у гордых счастлифчиков побольше :-) никого и не интересует оптимальность как таковая. Зачем большому брату оптимальные программы? Чтобы все сказали - хватит! довольно этой бессмысленной гонки процессорной мощности, памяти, этого универсализма (когда любое окошко растягивается и мышкой можно в любом месте кликнуть) ценой полного забития на стержневые процессы ОС? А деньги!
Неа... Маздай на это пойтить никак не могет. И интел не пойдет, кремниевая долина. Ты как программер должен все время упираться в память и производительность и капать себе, своему начальству, своим клиентам - надо!надо сменить машинный парк! Софтина с такой классной фичей, но работает увы, на железе в 4 раза мощнее. Раскошеливайтесь граждане!
Я, конечно, ретроград, старая калоша, еще буду ныть тут в других топиках про сахар и щи кислые. Но одновременно и чайник, это я правду говорю, просто довольно долго был рядом с ИТ, а жена - конкретный профи. Если подробнее себя описывать, то такое два в одном старой калоши с чайником можно смело именовать самоваром. Поэтому /подбрасывая шишечки и раздувая сапогом огонек/ продолжу диссиденствовать: в середине 80-х, когда на в 1000раз менее мощных DEC-овских машинах программеры макросами на регистры спецпроцессоров сами закидывали данные и биты на контроллерах выставляли, в целом в компе нехилые задачи крутились. Саныч не даст соврать. Ну так примерно в 256-512 кило. и при этом многозадачность - не было проблемы набирать статью в текстовом редакторе, одновременно вычислительная задача какой-нить градиентный спуск делала, ну и, конечно, дискетка в фоновом режиме форматировалась, как же без этого. Правда тогда в программировании не было понятия класса, свойств, методов. Потому что у машины есть центральный процессор, который умеет выполнять команды ОС, и память, в которой можно хранить данные и программы. Остальные "классы" - это всегда, прежде всего, физические устройства, т.е. спецконтроллеры, у которых иерархия свойств и методов реализована на уровне железа. А софтина, обслуживающая класс - это драйвер (имхо).
А теперь вот классы на ПК широкого профиля создаются. Наверное, это удобно для разработчика. Мои общения с "классами" по сути состоят в запуске экземпляра имеющейся программы, например, из аксесса - ворд. Но уж больно сложный огород получается под объекты. Как нажмешь на плюс, объект в отладчике раскрывая, так волосы дыбом встают - сколько добрый акс свойств и методов по умолчанию впендюрит исключительно для удобства разработчика. Какие после этого могут быть рассуждения про оптимальность! Тока успевай мозги дополнительные вставлять да камни новые.

Не знаю. Мое частное мнение - что-то мы конечно нашли, но много и утеряли. И искусственный интеллект ближе не стал к воплощению. Ибо как-то экстенсивно все в ИТ-индустрии развивается.
Хотя, конечно, холодильники через И-нет продукты заказывают. Прогресс не остановить, блин.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232054
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позволью себе чуть-чуть прояснить. (любопытным это окажется полезным)

Все объекты VBA - суть COM-объекты.
Все COM-объекты имеют следующие функции, которые наследуют от IUnknown (посмотреть в MSDN):
AddRef();
Release();
QueryInterface();
Эти функции являются системными, поэтому не показываются в браузере объектов (по F2), но они есть и активно используются.

Объектная переменная в VBA - это просто ссылка на объект. Когда такой переменной присваивают значение (set cn=new Connection), то у объекта вызывается функция AddRef(), когда ссылка освобождается, вызывается Release(). Чаще всего сам COM-объект ведет счетчик ссылок на себя самого, и как только этот счетчик становиться равным 0-лю, то удаляет сам себя.

QueryInterface() запрашивает у объекта его некоторый интерфейс (вот почему мы порой можем присваивать переменной типа Control какой-нибудь TextBox), т.е. объект может иметь как бы несколько типов.

Этим можно пользоваться. Можно создать объект, реализующий несколько типов. Например, мы создаем некий класс - ElementSpravochnika. Это будет наш базовый класс. Затем, создаем новый класс Sotrudnik, и с помощью ключевого слова Imlements реализуем все public методы и свойства ElementSpravochnika. В этом случае, тип Sotrudnik можно применять везде, где ожидается ElementSpravochnika. Описанным способом можно реализовывать произвольное количество интерфейсов в некотором классе (получаем настоящее ООП).
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232057
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вдогонку,

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

При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе. (например OnError стоит на более высоком уровне). Так что, по-возможности используйте локальные переменные и забудьте для них про Nothing.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232067
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vidmas
Я бы все таки поостерегся давать такие советы.Негоже программисту полагаться на поведение системы (да еще разработанной микрософтом).
Кроме чисто техничечких причин,о которых тут уже немало говорилось,есть еще понятие стиль программирования.И так же ,как Шарапов не оставлял бумажек на своем столе,так и программист не должен оставлять за собой "мусор".
Так и начинается моральное падение:
Сегодня не поставил Set var=nothing,завтра недопил бутылку пива,послезавтра изменил Родине.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232096
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VIG

что значит Негоже программисту полагаться на поведение системы ?

Мы что, на кофейной гуще гадаем, или что - VBA такой уж "черный" ящик?
Да на мой взгляд VB/VBA- это вообще самые отлаженные и надежные технологии, которые когда-либо делала Майкрософт. То, что Access иногда глючит, так это к VBA никакого отношения не имеет, он использует VBA просто как "движок"(Кстати, любой, при желании может использовать VBA-движок в своих программах.)

Сегодня не поставил Set var=nothing,завтра недопил бутылку пива
Диктую большими буквами Set var=nothing не убивает объект, а вызывает у объекта функцию Release() и обнуляет саму объектную ссылку. (см. мои предыдущие посты). При выходе из области видимости, все локальные переменные все-равно очищаются и вызывают у своих объектов Release(), так что ты просто плодишь лишний код.
И еще, если у тебя OnError стоит на более высоком уровне (в вызывающей подпрограмме), и у тебя возникла ошибочная ситуация, и ты не дошел до своих Set var=nothing , так что, по-твоему? Объекты навсегда в памяти остаются?!! До 2000 года подавляющее большинство бизнесс приложений там на западе было написано на VB, причем в основном - серверная часть. Если бы этот микрософтный VBA оставил хотя бы один объект случайно неудаленным, то эту микрософт просто бы уже сожрали за такие дела!

Народ, кончайте вы эти суеверия. Уясните себе твердо: объекты остаются в памяти только при наличии кольцевых ссылок друг на друга, так что лучше обратить внимание именно на это, т.к. в этом случае set var=Nothing ничего не даст, а ты будешь в полной уверенности, что удалил объект. НЕ УДАЛИЛ, удалил все-лишь одну из ссылок на объект. Применять set var=Nothing считаю целесообразным только "сознательно", например по закрытию формы нам надо "разорвать" круг взаимных ссылок, а то форма будет висеть в памяти вечно, хоть и не видимая...

Не, блин "Негоже программисту полагаться на поведение системы"

Это все равно что верить, будто присутствие нехорошего человека может вызывать у программы глюки. Программные глюки бывают только по одной причине ...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232147
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ничего себе, понаписали...

2Шкуренко Александр
На выходе будет вот что:

clsAny1.Initialize
clsAny2.Initialize


Хорошо. Вернее плохо. То есть, будем иметь ввиду. Спасибо.

2Нуф-Нуф
Почему мы обсуждаем вопрос об обязательном присвоении объектным переменным значения "Nothing" и даже спорим о порядке выполнения данной процедуры? Ответ один-разъединственный - экономия памяти!

Прости, Нуф, но я протестую. Экономия памяти не всегда критична. Конечно, так писать программы единственно правильно, но... В конце концов, если б Access, как ожидалось, чистил переменные при выходе из области видимости, насколько меньше было бы проблемм. В конце концов, может быть проще купить лишних 256 мб памяти, чем найти подобную "необъяснимую" ошибку (я считаю по затраченному времени/заработанным средствам).

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

2Vdimas
При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе.

При выходе из области видимости не уничтожается. (см. 1 пост топика, и мой ответ Нуф-Нуфу)

И при ошибке не всегда. Гарантированно, если переменная живет в библиотеке (или, еще хуже, в библиотечном модуле класса). Для локальной mdb точного рецепта сказать не могу, но подобные проблемы, помнится, у меня были до вынесения части кода и переменных в отдельную mdb.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232154
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Geo: 2Vdimas
При выходе из области видимости объектная ссылка уничтожается сама. И при выходе из-за ошибки в том числе.
При выходе из области видимости не уничтожается

Удаляется В ОБЯЗАТЕЛЬНОМ ПОРЯДКЕ именно объектная ссылка . (не путать с самим объектом!!!!) Сам объект удалиться только тогда, когда на него больше не ссылается ни одна объектная ссылка.
Не путать эти понятия.

-------------------------
и все-таки она круглая...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232158
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vdimas
Очень хорошо.

Set cls1 = New clsAny1 ' Создали класс , ссылку положили в cls1, отработалась инициализация
Set cls2 = New clsAny2 ' Cоздали класс , ссылку положили в cls2, отработалась инициализация
cls1.Add cls2 ' Создали класс , ссылку положили в переменную в cls1
Set cls2 = Nothing ' Удалили первую ссылку на класс
Set cls1 = Nothing ' Удалили вторую ссылку на класс и единственную - на класс

Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, почему ни один из них не был уничтожен? Если был, почему не отработались Terminate?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232162
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да в первом посте обычная циклическая ссылка. :)
Код: plaintext
1.
2.
3.
4.
Public Sub Add(ByRef cls As clsAny2)
    m_c.Add cls,  "id"  & m_Count
    m_Count = m_Count +  1 
    Set cls.Parent = Me
End Sub


Да, ты удалил свои локальные ссылки, но тебе это не помогло (я же говорю, это не панацея, локальные ссылки и так удаляются). Но у нас остались еще объектные ссылки и оба класса ссылаются друг на друга, "держат" друг друга в памяти.
У одного ссылка - Parent, у другого - член коллекции m_c.

елы-палы, уже все поняли...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232166
А все-таки vdimas прав.
Set obj = Nothing -это скорее правило хорошего тона и не более. Почитав о COM объектах я многое для себя уяснил. Спсиб тебе vdimas.

2 GEO
>Вопрос: где осталась хоть одна ссылка на любой из этих классов? Если нигде, >почему ни один из них не был уничтожен? Если был, почему не отработались >Terminate?

1.Ссылки остались внутри классов. clsAny1 хранит ссылки на все clsAny2 (в данном случае коллекция), а каждый clsAny2 хранит в себе ссылку на clsAny1 (m_parent).

2.Не уничтожились потому-что, не все ссылки были удалены! (см. пост vdimas)

3. Поэтому и не отработало потому что не уничтожились объекты

2 Нуф-Нуф
ну ты даешь, стаким подходом тебе пора ближе к C++ или на крайний случай C#. Так держать!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232169
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в С# та же фигня с циклическими ссылками, можно на VB тренироваться.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232173
Фотография progist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdimas не прав.
Обязательно надо удалять объектные ссылки РУКАМИ
и предусмотреть в обработчике ошибок удаление этих ссылок

Безусловно vdimas интересный раззказчик и глубокий теоретик. И я бы поверил ему. Но много раз удавалось переписыванием кода или советами на форумах избавиться самому или помочь людям избавиться от глюков (чьи это глюки уже совсем не понятно), особенно одного из самых расспространенных - Не закрывается окно Аксесс.
Кроме того рекомендации о том что надо искусственно уничтожать ссылки на объекты всегда давались самыми авторитетными авторами.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232176
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нуф-нуф копает в правильном направлении.
Это не что иное как дефрагментация памяти. Правда строки с объектами там не пересекаются (чесс-слово). Но вот строки со строками и объекты с объектами пересекаются. Память постепенно "дробиться", у нас получается очень много общего свободного места, но в них невозможно создать большой объект, потому как все кусочки маленькие. Потом выделяем память под большой объект, пользуем, удаляем его. А потом вдруг опять хаотически "набегут" маленькие объекты и нагрызут в памяти дыр.

Выход один, постараться минимизировать создание и удаление объектов, порой, созданные объекты (особенно если речь идет о большом количестве маленьких объектов) лучше хранить "про запас" и пользовать по мере надобности, чтобы уменьшить количество парных new и delete.

А вот в .NET гарбадж коллектор ПЕРЕМЕЩАЕТ ОБЪЕКТЫ В ПАМЯТИ, в плане борьбы с дефрагментацией, т.е. там это не страшно.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232179
to progist
Локальны объектные ссылки так же как и простые переменные подчиняются правилам видимости и жизни.
Почему же ты тогда в коде не пытаешся уничтожить ссылку на переменную типа Integer, Long и т.п. Ведь, и объектная ссылка, и переменная это ничто иное как указатель на кусок памяти.

Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232180
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
совсем не обязательно присваивать Nothing для локальных переменных (вопреки неоднократно высказаному в форуме мнению).
Ты бы все-таки поостерегся такие советы давать
Присваивать Nothing - необязательно, но крайне желательно. Если есть что-нибудь типа Close - тоже лучше ручками вызывать.

То, что Access иногда глючит, так это к VBA никакого отношения не имеет
Да иногда и к аксесу никакого отношения не имеет. Например, посчет ссылок глючит в библиотеке DAO. И никак ты с этим не поборешься, кроме как закрывая руками то, что DAO оставил (или наоборот, насильно держа ссылку на то, что DAO почему-то закрывает)

По теме обсуждения.
Циклические ссылки - вещь давно известная и сто раз обмусоленная. Читайте Роджерсона, он давным давно про это все что надо написал. И как бороться - то же.
В дочернем объекте ссылку на Parent получайте не через QueryInterface/AddRef (как автоматом делает VB), а простым копированием указателя (хоть через memcpy). И не будет у вас никаких циклических ссылок.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232184
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
progist
неккоректно передаешь мою мысль.

Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ .
Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками. Правда, если на какой-то класс уже никто не ссылается, и он удаляетя, то все его ссылки-мемберы тоже чистятся. Это может вызвать каскадное удаление объектов, если была соблюдена строгая односторонняя направленность владения.

progist, чудес не бывает :)
Возьми свою собственную программу, разрисуй кружочками классы, а стрелочками - взаимные ссылки (для VB ссылка аналогична понятию "владение") и определись, кто-кого держит. Сразу станет понятно, как "разорвать порочный круг".

Разумеется, повсеместное втыкание Set var=Nothing значительно повышает вероятность, что ты случайно напишешь правильно, но п.1. данного топика дал тебе пример, где тебя это ну никак не спасет. Здесь именно необходимо иметь четкое представление о взаимном владении собственных классов, и тогда чудеса исключены. ;)
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232189
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ЛП

Не знаю как в DAO, но ADO я сталкивался с подобным (объекты остаются в памяти). Только это происходило у меня из-за того, что я сам же это и провоцировал.
Описываю ситуацию, в которой я это наблюдал:
dim rs as ADODB.Recordset
set rs=me.Recordset ' получили рекордсет записей на форме.
...
me.RecordSorce="уже другой запрос", (или пользователь F9 нажал).
так вот, именно в этом случае, я должен сделать set rs=Nothing перед сменой свойства me.RecordSorce, т.е. я должен "отпустить" объект рекордсет перед тем, как форма создаст новый рекордсет по изменению свойства me.RecordSorce.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232194
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
Автоматически удаляются ТОЛЬКО ЛОКАЛЬНЫЕ ССЫЛКИ.
Все остальные - члены классов или модулей необходимо ОБЯЗАТЕЛЬНО чистить руками

Да сколько же раз говорить - локальные ссылки должны удаляться, но иногда не удаляются . Члены классов или модулей точно так же должны удаляться (освобождаться ссылки) при закрытии аксеса. Но иногда этого не происходит.

Пока писал - ты пример на адо привел.
В этом форуме кучу раз советовали делать Requery с помощью конструкции Me.RecordSource = Me.RecordSource - для обычных рекордсетов. И, вроде, для обычный рекордсетов глюков не наблюдали.
И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то.
Если то, что ты привел - глючит, то это как раз глюк аксеса (Me.Recordset), а не адо (ADODB.Recordset). Имхо.

2 Шкуренко Александр
Не закрывается окно Access как раз потому что не все объекты уничтожены. Тестировать и искать ошибки в коде, а не хаять Access
Тебе показать пример абсолютно правильного кода, выполнение которого приводит к незакрывающемуся аксесу?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232196
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
показать
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232199
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И так же кучу раз говорили, что Me.Recordset - это нифига не обычный рекордсет, а мутант какой-то.

Жаль что я на SQL.ru только недавно. :(
Потрясающе интересное местечко.

Дык я и говорю, что ведет он себя этот рекордсет ну очень странно. Вполне логично, что это объект не ADO, а внутренний ассессовский, который имплементит интерфейс адошного рекордсета. Вооруженный такими "знаниями", я именно с ним стараюсь вести себя аккуратно, т.е. не "держать" его перед обновлением записей формы.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232200
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вот:\r
\r
/topic/33519\r
\r
На протяжении этого топика есть несколько примеров.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232201
Конечно!!!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232202
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть поправлю свой последний пост.\r
Все ссылки на все объекты должны уничтожаться - в идеале.\r
Обычные локальные - по выходу из функции. Все остальные - не помню точно когда и в какой последовательности, но ВСЕ должны освободиться. И статические, и глобальные, и пользовательские модули классов всех мастей.\r
\r
Но это происходит не всегда. Из-за некоректной работы при подсчете ссылок либо в самом аксесе, либо в библиотеках (наподобие адо/дао). \r
В результате имеет либо утечку памяти (потерянные объекты из библиотек), либо незакрывающийся аксес (на сам аксес осталась ссылка).\r
\r
Если верить Гетцу, то в аксесе XP (может и 2000-м) изменили поведение аксеса. Теперь при попытке закрыть аксес, на который еще есть ссылки, происходит не сворачивание аксеса (как в 97-м), а действительно закрытие (с нарушением работы клиентов автоматизации, использующих аксес как сервер).\r
\r
показать \r
А слабо запустить поиск в форуме по строке "не закрывается аксес"?\r
Ну если не найдешь - вот тебе, смотри пост Владимира Саныча от 27 май 03, 22:11
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232203
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
апаздал
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232204
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Не апаздал. Твой пост длиннее и садиржятильние.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232206
VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да,после Л.П и говорить то уже нечего.
От себя только добавлю.Чернобыльская станция недолжна была взорваться ,но взорвалась-потому что полагались на систему ,которая недолжна была позволить взорваться,но позволила,потому что ...
P.S. Не удивлюсь,если скоро на форуме увижу топик: Помогите!.Завис космический корабль.Подскажите что делать?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232212
Что касается топика assa "автоподхватившиеся формы"

>теперь можно закрыть вызвавшую оъект форму, он (объект) остается жить. Что, видимо, неправильно.
Очень даже правильно. Еще раз доказывает что Set obj = Nothing не уничтожение объекта

Интересный топ, копаю дальше.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232214
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и не может быть никакого "уничтожения объекта"!!!!
Объект сам себя уничтожает. Когда понимает, что с ним больше никто не работает. Задача приложения - вовремя сказать всем объектам "Мавр сделал свое дело - мавр может отдыхать (или умереть)". Т.е. вызвать Release когда закончили объект использовать. VB это делает за программистов. Но это не повод чтобы этого не знать/не понимать.
Еще раз повторю - читайте Роджерсона ("Основы COM"). Меньше будет глупых вопросов и отвисших от удивления челюстей.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232217
to ЛП
>Еще раз повторю - читайте Роджерсона ("Основы COM"). Меньше будет глупых вопросов и отвисших от удивления челюстей.
Зачем же так грубо! Читать много можно всего интересного. И Струструпа, и Мейерса, и Элджера и т.д. Да все и не прочтешь.
Покажи где я задал глупый вопрос, да и товисших челюстей пока не наблюдается. Да и кстати. Проверяя примеры топика которого ты мне посоветовал, зависание Access не наблюдалось. Жаль что дома A97 нет.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232218
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ссылки, изучил.
Ага, заметил одно обстоятельство, которое отличает мои привычки от описанного в ссылке.

Везде где работаем с объектной переменной (для примера ctlCheckBox1), я использую жесткое правило: когда обращаюсь к значению контрола, то указываю его явно:
ctlCheckBox1.Value , ибо Value - одно из свойств объекта.

Ну вот, 4 года писал под аксес и даже не знал, что его так легко можно "повесить", даже обидно. :)

Кстати, для тех, кто копает:
когда вы пишете конструкцию:
Код: plaintext
if ctlCheckBox then ...

то на момент выполнения оператора if создается дублирующая ссылка на объект, время жизни которой, по-идее ограничивается областью вычисления истинности выражения. Может здесь Ac97 "ноги ломал".
именно поэтому я использую выражение:
Код: plaintext
if ctlCheckBox.Value then ..., 

которое вовсе необязательно стравнивать с true в таком виде (как предлагали в форуме). И висяков за 4 года НЕ ПОМНЮ, кроме упомянутого мною выше случая. (более чем на 50-ти машинах прога работала, совершенно различные конфигурации и операционки, win95-win2k).

И еще один момент, крайне не рекомендуется использовать Variant для объектных ссылок, надо их всегда типизировать. Кстати, к строкам это тоже относиться.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232220
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
По-моему, начался спор о религии. Кто верит в то, что у Майкрософта бывают баги, а кто верит в то, что у Майкрософта не бывает багов... Тут переубедить невозможно.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232221
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> которое вовсе необязательно стравнивать с true в таком виде (как предлагали в форуме).

Поскольку это предлагал я, то попробую оправдаться.

1. Эту рекомендацию я вычитал на каком-то сайте, сам ей никогда не следовал. Вообще стараюсь не писать оборотов типа If a = True, если известно, что переменная и без того логическая.

2. Мне не удалось воспроизвести "незакрываемость" Аксесса при помощи описанного трюка с чекбоксом.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232222
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Шкуренко Александр

Вполне возможно, что для "удачного" эксперимента потребуется именно Ac97 или моложе. Они имели свой VB-движок. Начиная с версии 2000 это все хозяйство (office) работает на стандартном VBA, которое Микрософт позиционировала как отдельный продукт. У меня была приложуха со встроенным VBA, прям как у асеса. Ничего плохого об этом VBA сказать не могу, скорее наоборот.

ЛП несомнено прав, что хотя бы основы COM изучить стоит, если активно программируешь на VB, потому как все классы VB и все с чем он умеет работать - суть COM объекты. Знание самых базовых принципов организации COM помогает понять, что скрывается за строками VB кода, т.е. позволояет выступать в роли "адекватного" программиста.

Себя я позиционирую как C++-ник, но большинство всяких бизнесс проектов выполнял или на ассесе или на VB или с применением встроенного VBA, ибо по надежности и скорости разработки - это тул №1 . Критичные к быстродействию, или требующие частых обращений к WinAPI классы обычно выносились во внешние COM-библиотеки на заключительныхз стадиях проектов. Обычно это было не более 10% всех классов.

Так что, аксесс форева!

--------------------------
а при слове .NET - все насторожились
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232224
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч

дело не в true, суть моего подхода - ctlCheckBox. Value , т.е. я явно задаю VB, что собираюсь иметь дело не со всем объектом, а лишь с его свойством Value. Для меня эта такая же дисциплина кода как для многих Set var=Nothing. Наверно именно поэтому с подвисаниями не сталкивался.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232225
to vdimas
>Везде где работаем с объектной переменной (для примера ctlCheckBox1), я использую жесткое правило: когда обращаюсь к значению контрола, то указываю его явно:
ctlCheckBox1.Value, ибо Value - одно из свойств объекта.

А в чем раньше кодить начал в С++ наверное, либо хорошо знаешь C++ и COM с его методами по умолчанию.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232226
Не успел вопрос задать, а он уже ответил. Телепат :-))
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232227
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шкуренко Александр

пора завести отдельный форум: COM, и приглашать туда VB-программистов, потому как это родственная им технология.
Прекрасно знаю о многих аттрибутах методов COM-объектов, в том числе и об упомянутом. :)
Но если уж сражаться за COM:
(прошу прощенья за оффтоп, но COM-форума пока нет, а сюда это гораздо ближе, чем к c++)

Я не уверен, что такая конструкция:
if ctlCheckBox then
в старом Ас97 интерпретировалась сразу правильно (в 97 был именно интерпретатор, в отличии от VBA в поздних версиях), тут именно = true помогала интерпретатору разобраться, КАК ИМЕННО будет использоваться его объект, и выбрать свойство по-умолчанию. Если этого не делать, то приведенная запись создает временную переменную типа Variant (которая будет содержать КОПИЮ ссылки на ctlCheckBox), и уже с этим временным Variant и будет происходить вся работа.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232268
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> дело не в true, суть моего подхода - ctlCheckBox.Value

Это я понимаю. Поскольку True и .Value у нас противопоставляются как неправильный и правильный подходы, то я и сказал, что вариантом с True я не пользуюсь. Что касается .Value, то я вполне понимаю логичность этого стиля (хотя, к сожалению, не настолько дисциплинирован, чтобы этому всегда следовать). :^)
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232304
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
в 97 был именно интерпретатор, в отличии от VBA в поздних версиях

У тебя опять залипание мозга?

В 97-м - VBA 5.0, в 2000/2002 - VBA 6.х
Различие есть в библиотеках, интерфейсе, чуть-чуть в языковых конструкциях, но уж никак не в последовательности обработки исходных текстов.
Как был VB компилятором в промежуточный язык (команды которого затем интерпретировались), так и остался.

Не надо гнать пургу. Или, еще раз повторю, осторожнее в терминологии.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232314
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 ЛП

В соседнем топе уже извинился, что с версиями мог попутать, на 97-м работал очень мало, уже в 1999-м перешел на бету 2000-го. Да VBA компилит классы по мере надобности, но как сейчас помню (в ту дореволюционную пору ;)) ), что пришлось поработать еще на той версии Access, в котором был в чистом виде интерпретатор, причем свой собственный, и не VB и не VBScript, и VBA еще не было, а был язык макросов в Excel. (соответственно насчет ИМЕННО 97-го мог и призагнуть).

Биография, знаешь ли, бурная была, и микропорцессорные блоки систем радиосвязи разрабатывал, и БД, и драйверы писал, - короче вертелся как мог, время трудное было. (некогда было на несущественные мелочи внимания обращать).

Меня бы с той моей энергией да в нынешние благодатные времена... :)

Насчет истории Access - пошел обращаться к анналам, пока сильно не наругали...

А интересно, по какой причине народ еще ас97 юзает?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232324
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это в аксесе 2.0 был AccessBasic (а не язык макросов Excel), а начиная с 95-го - VBA
Да и в excel уже давным-давно VBA.
Давненько ты видать с офисом не работал

А интересно, по какой причине народ еще ас97 юзает?
По причине унаследованных систем
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232327
Фотография progist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2vidmas
ты не смотри, что у Лоха ник такой, на самом деле он и не Лох совсем
Я давно это просек, почти сразу, как сюда пришел.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232366
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лифчик
Мне кажется, что мы мало что потеряли. В незапамятном 1985 году мне нужно было решить задачу. Машина СМ-4, я убил месяц с програмимистом на постановку, написание и отладку. Сам-то я тоже не профи, а уж в то время имел о программировании самое смутное представление, поскольку два семестра платонического обучения программированию (к машинам не подпускали, все на бумажке) были благополучно забыты
. Сейчас, вспоминая задачу, четко понимаю, что потрачу на Access максимум 4 дня, из которых 2 ушли бы на интерфейс для пользователя. И, несмотря на то, что он не заточен специально под статистику, ушло бы на обсчет максимум минут 10-20, что меня мало волнует.
Вот и считаем деньги.
Можно и нужно восхищаться парусниками и теми, кто ими управлял, но они ушли как массовое средство перевозки - но парус остался для тех, кто в него влюблен, думаю так и здесь.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232367
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 vdimas
А интересно, по какой причине народ еще ас97 юзает?
А времени нет переписывать и тестировать два десятка приложений и ставить А2000 на 4 десятках машин. Прижмет - придется, но пока все устраивает.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232398
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛП Это в аксесе 2.0 был AccessBasic (а не язык макросов Excel),

Да ясен пень, что Excel-Excel-ем, а Access-Access-ом! Я сказал, что работал на той, версии когда еще VBA не было (а был, язык макросов у екселя, типа уточняю версию того барахла тех времен).

Потом перешел на ac97, но зело он капризный был, особенно при подключении линкованных таблиц по локалке, да и еще много мелких всяких головных болей принес, поэтому постарался побыстрее перепрыгнуть на 2000-й, и об 97-м сохранились слабые воспоминания.

--------------------
Развелись, понимаешь, санитары леса.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232599
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Alexander G : В Вашем посте содержится подтверждение моих слов. С 85 по н.в. мощность настольных вычислителей возрасла мин.1000 раз. А задачу свою Вы решили за 30 дней тогда, и за 4 - сейчас. 30/4=7.8 раза. Вот и я о том же. Приладили, понимаешь, прямоточный ВРД к телеге и рассекают на ней по магазинам. Нет чтобы крылья приставить и взлететь! ("Наши люди в булочную на такси не ездят"(с)Бриллиантовая рука.)
Кроме того, за эти годы Вы, безусловно, и поумнели :-)

Вообще, я не ностальгирую по парусам. Я на то лишь указываю, что если программеры не развращены постоянным тупым наращиванием вычислительной мощности и работают в режиме ограниченных ресурсов, они начинают изобретать логику, структуры, архитектуру и прочие решения, которые позволяют экономить (память/время). И это - КРАСИВЫЕ решения. Ну, конечно, красивые для тех, которые могут оценить, например, красоту метода золотого сечения в сравнении с методом перебора.
А сейчас экономить не модно. Это - не коммерческое поведение. Все равно через 3 года нужно обновить свою железку и поставить Винды N+1. Как и автомобиль. Иначе ты ретроград. Не пройдешь сертификацию ISO. Денег не дадут. Такая вот попса получается.
А красота нынешняя имеет заставку виндов и пахнет деньгами. Какое-там-на-хрен золотое сечение! ...Компьютерные монстры на столе у секретарши, где раньше п/м Ятрань стояла. Да на подобной машине наши отцы ракету для посадки на луну обсчитывали! А теперь это подставка под кофе и пасьянс. 95% офисных компьютеров используется как замена пишущей машинке. Ну может где-то еще электронные таблицы бухгалтерами юзаются. Электронная почта как простая СУБД. Все. Остальное - приблуды. И это - на 1,5 Ггц и 500 МБ оперативки! Нет, мы положительно с Феррари на болиды Формулы-1 пересаживаемся. Только на хрена это нужно, вы задумывались? Чтобы песочные часы побороть? А может есть другие способы?

Я уверен, что есть. Только они нарушат капитализацию некоторых уважаемых фирм и сдуют некоторое количество мыльных пузырей в районе индекса Насдак. Поэтому - неприемлемы.
Четыре года назад искали решение для автоматизации торговых точек на основе ПОС-терминала. начиналось все это дело с 16 мб оперативки и не помню какого пентиума. Не важно. Главное - стоимость комплекта $2000. Для Москвы сойдет. Думали, что пока начнем внедрение, цены упадут и можно будет для деревни собирать комплекты в районе $1000 - тогда концы с концами сходились в бизнес-плане. Наивные! Через полгода уже базисный комплект 32 мб, пентиум вполтора раза быстрее, а стоимость всего этого дела выше на $200. Мы говорим - "Нам не нужны ваши 32мб и быстрый пентиум в деревне! На кассе крутится одна задача." Ответ - невозможно, опция с меньшей памятью и процессором обойдется вам дороже."
Такая вот хрень. Я конечно не призываю добывать огонь верчением палочки в колоде, но некоторые тенденции в ИТ индустрии мне сильно не нравятся. Иной раз хочется под парус встать или до магазина на велосипеде доехать вопреки моде.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232603
Фотография Лифчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то калькулятор, встроенный в мозг сбойнул при делении 30/4= 7.5
Видно совсем квалификацию потерял :-(
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32232700
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
угу, прям в душу заглянул.

На мой взгляд, качество ПО за последние лет 5 сильно упало, и продолжает падать .

Причем во всех областях. Надо ввести закон, чтобы программисты обязательно добивались работоспособности своих программ на машинах типа p133 32 MB. :)
Чтобы программисты БД запросики свои зело оптимизили.
Чтобы программисты С++ вконце концов начали думать головой, а не тем, на чем сидят, или нафик ваще из отрасли. Хожу по сайтам типа codeproject, codeguru, sourceforge. Зачастую все больше вижу тихого ужаса, и все меньше чего-нить стоящего.
Развращает быстрая железка, позволяет девелопить спустя рукава...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233074
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vdimas,
Предположим, собрались мы, и озадачились вопросом. "Робяты, что ж мы делаем, мы ж не ведаем, что творим! Хотим поднять качество нашего ПО. Какие мероприятия для достижения этой задачи нам надо наметить?" Что бы Вы нам ответили?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233342
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а кто мешеает перейти на ассемблер и делать все самим?
от круты форм до клиент-сервисных систем?
использование процессора=100%
и уже низя будет пенять на Билла.
потом к исполняемой задаче добавить еще одну, чё проц между нажатиями на клаву стоит-простаивает?
потом еще одну...
потом получится 3 , далее 3.11
и 95 ... 98 ... МЕ........

а у меня была тут феня - не сделаЛ rst.Close вовремя....
все работало.....
пока в не захотел сделать очень красиво....
сделал... раньше синий экран, счас - привет Билу....
с неделю бился - две формы с подформами как три сосны - все наглядно , все правильно. хорошо , что SQL.ru есть
и Лох тут есть
Присваивать Nothing - необязательно, но крайне желательно. Если есть что-нибудь типа Close - тоже лучше ручками вызывать
вспомнил .....
навтыкал .....
и счас тащуся....
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233443
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лифчик
Прошу извинить что пишу не сразу, часовые пояса слишком разные.
Я бы не сказал, что поумнел, просто добавилось опыта, но не ума:). А пропорция 7.8 раза относится в к трудоемкости разработки, сам расчет с распечаткой шел, если не изменяет память дня 2.
А поводу красивых решений... Это касалось, как и сейчас, настоящих профи. И тогда существовали рядовые программеры, которые не слишком озабочивались (или не могли) эффективностью. На моей памяти на Мир-1 (до СМ-4) геофизики крутили обсчет 10 суток, на СМ-4 по двое суток. Подозреваю, что эффективностью и красотой там не пахло.
С другой стороны да, красиво, быстро, но экономить на на железе смысла нет. С моей кочки зрения, программер такой квалификации, который пишет красивые программы, должен стоить, даже по нашим меркам, не меньше 1000$. И сравним со стоимостью персоналки.
По поводу секретарши - все верно, но тут никуда не деться, экономить две-три сотни баксов на системном блоке бессмысленно, а монитор все равно менять раз в 3-4 года.
Кстати, об экономии :) Дней 10 назад жена позвонила, попросила поставить ей принтер (ну срочно надо было, пока тамошних мальчиков вызовешь). Поставил, говорят, посмотри, нам еще три дали. Захожу и отвисает челюсть -стоят три полноразмерных HP-5100dtn. У них все управление - 9 человек, т.е на 7 человек эти три принтера. И сетки нет! На мое робкое замечание, что такие у нас стоят по одному на этаж и как-то очередей не наблюдается, развели руками и сказали - что дали...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233447
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Varan

Я же говорю - старым дедовским способом. Написал че-нить, проверь на медленной машине на адекватность, сразу узкие места найдешь. Зачастую вполне очевидные, но незаметные невооруженным глазом на быстрых машинах. Когда большое количество таких мелочей копиться в большом проекте - ясен пень снижается общая производительность. Это самый простой способ и не занимает много времени. В моем подходе один недостаток - не у всех есть доступ к старым машинам.
Гораздо более тяжелый другой способ - все время задаваться супер-целью нахождения максимально эфективного результата. Способ неэффективный, т.к. как известно только 10% от общего кода занимают 90% общего времени выполнения, т.е. отлавливать надо именно "узкие" места. Зачастую опытный программер видит эти узкие места издалека. Но все чаще наблюдаю картину, когда какой-нить чел хвастается только тем фактом что он СДЕЛАЛ и у него ЗАРАБОТАЛО. :) В далекие 92-е этот вопрос даже не обсуждался, всегда стоял вопрос КАК ЗАРАБОТАЛО, т.к. техника подхода требовала.

Не думаю, что сейчас этот вопрос утратил актуальность. Если в средней оптово-розничной фирме 30-50 одновременно работающих девочек строчат как из пулемета накладные (каждая по 300 и более строк), база пухнет по нескольку метров в день, то тут призадумаешься. Можно идти в лоб и покупать какой-нить супер-пупер 4-х головый сервак за $5000, а можно и pIII обойтись (это все происходило в 2001-м).
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233648
кам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да вы че ?
Нашли о чем ностальгировать !
Был просто кошмар.

Пишешь, сдаешь на пробивку.
На следующий день получаешь перфокарты, сдаешь на счет.
На следующий день получаешь листинг с ошибками.
Исправляешь, сдеешь на счет
На следующий день получаешь листинг с ошибками.
...
И так до получения результата. То что сейчас делается в течении часа, занимало месяц !
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32233719
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vdimas,
А если потенцальные ошибки заложены не только "в коде", а в самой идее, в архитектуре проекта?
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234358
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Varan

Если под архитектурой ты понимаешь схему базы и алгоритмы обработки, то ты прав. Приходиться изворачиваться, - не помню, что бы у меня хотя бы один проект был полностью нормализован - всегда есть избыточность в угоду быстродействию.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234410
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vdimas,\r
"Если под архитектурой ты понимаешь схему базы и алгоритмы обработки, то ты прав."\r
Да, но меня в данном вопросе интересует следующее - как надо проектировать БД, чтобы уменьшить число ошибок, упростить отладку, увеличить наглядность?\r
Ты вот тут (можно на "ты", фото посмотрел, вроде не старый) говорил о том, что при использовании объектно-ориентированного подхода при написании интерфейса приходится мыслить как бы в одном стиле, а при проектировании схемы БД, написании запросов - в другом.(если я правильно понял). Я тут несколько книг прочел про объектно-ориентированное программирование - вроде, все здраво - вот тебе методика борьбы со сложностью - модульность, инкапсуляция, наследование, полиморфизм. Хотелось бы попробовать это применить, но вот только не вижу я, как это при использовании БД можно применить. Программы примеров из этих книг либо вообще не взаимодействуют с БД, либо взаимодействуют, но базовые принципы ООП при моделировании данных не используются. Короче, налицо какой-то разрыв - с одной стороны явно идет рекламная кампания этого ООП, а с другой - реально при разработке БД это ООП применить нельзя.\r
Прошу прощения за сумбурный текст.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234659
фыва
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что вам мешает при проектировании базы мыслить "объектно" ?
А отражение объектов на реляционную базу чисто формальная процедура, которая может быть выполнена различными способами.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234670
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при проектировании баз мешает в основном причина проектирования - заказчик.
на начальном этапе не знает что хочет(как правило ему надо КИНГУРУ)
на последнем включается аппетит надо то и то и это, но за прежнин деньги.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234758
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Varan

Процитирую себя же из той же ветки:

Какие сейчас наиболее популярные направления борьбы со cложностью:

1. Entity engin - использует БД как просто место хранения состояний объектов. О таких вещах, как ограничение целостности, речь не идет. Мощь встроенных инструментов БД практически не используется. Зато очень удобно проектировать бизнесс-логику произвольного уровня сложности.

2. База сама в себе. Интерфейс с пользователем - через набор хранимых процедур, инкапсулирующих всю необходимую логику приложения. Часто применяемый подход настоящих "зубров" БД. И совершенно не получается именно так спроектировать простейшую бухгалтерскую систему, где можно настраивать формулы и алгоритмы для автоматического расчета проводок, потому как на VB или чем-то подобном бухгалтер вполне может написать расчетный скрипт, а вот на Transact SQL - никогда! К тому же, полное проектирование приложения на стороне БД требует гораздо большей квалификации ... <кусь>

3. Смешанный тип - часто используется в 3-х звенке. Что удобно вычислять на сервере БД - вычисляют на БД, что не удобно - то на сервере приложений. При взгляде на такое приложение вообще обычно трудно выделить такие понятия как "концепция приложения". Зачастую больше подходит "писанина", потому как большинство проблем решены "по месту" (так собирались первые автомобили). Не программный продукт, а сборник компроммиссов. Толкаемые Microsoft "современные" решения как раз из этой области. Приходиться задействовать гораздо больше людей, чем если бы это было нужно используя варианты 1 или 2.

Выбери себе подходищий вариант. В наиболее чистом виде связка ООП-СУБД - это п.1. Очень популярный сейчас способ. Для каждого объекта задаются операции: создания, редактирования, удаление. Сам объект проецирует эти операции на вызов соотв. хранимых процедур или же на динамическое формирование и выполнение соответствующих запросов. Обычно в базе хранят состояния объектов, т.е. то, что ты считаешь нужным сохранить об объекте, чтобы потом адекватно его восстановить. При изменении свойств объекта более правильным считаю именно формирование динамических батчей, а не вызов процедур, для того, чтобы на сервер слать только обновленные поля. Для этих целей и нужен некий енжин, который представляет из себя набор базовых классов и поддерживающих средств для автоматизации этого процесса.

Поищи в и-нете по entity engine, тонна материала и различных точек зрения. Народ пока "зреет" ...

Да, если хватает людей, причем ситуация такова, что есть "полный" набор узкоспециализированных спецов: (БД, ООП, GUI), однозначно пишите 3-х звенку. (п.3.)
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234780
Фотография vdimas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один из примеров:

http://intersystemskorea.co.kr/analysts/2001symp/Israel/Tony_Grover_BuildingDBIndepApps.ppt
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32234901
ч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ч
Гость
Да, если хватает людей, причем ситуация такова, что есть "полный" набор узкоспециализированных спецов: (БД, ООП, GUI), однозначно пишите 3-х звенку.

И как только выберете 3-х звенку людей станет нехватать...
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32236251
Фотография Varan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vdimas, all
Спасибо, за информацию. Буду думать.
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32236417
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщето грамотней писатьв том варианте , которыйобеспечивает максимальную производительность при минимуме затрат.
3 вариант самый оптимальный : если кусок будет оптимальнее работать на сервере значит дожен там работать.
если на клиенте значит та ему и сидеть.
часы делать часовщик, пирожное булочник, каждому свое.

нефик писать клиентскую часть со всем интерфейсом на сервере

Зачастую больше подходит "писанина", потому как большинство проблем решены "по месту" (так собирались первые автомобили). Не программный продукт, а сборник компроммиссов.

неправильное понимание. дела.

не сборник компромисов , а грамотное разделение на выполнение .
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32239095
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Шкуренко

по поводу «неправильно» я как раз размышлял о том, «правильно» ли иметь возможность циклических ссылок. («Автоподхват» объекта ссылкой на себя – простейшая циклическая ссылка). Вопрос таков: если даже помыслить механизм отслеживания «иерархии» ссылок, можем ли мы однозначно сказать, в каком случае объект надо разрушить при разрушении вызвавшего его (изначально) объекта (т.е. все оставшиеся ссылки на объект – его собственные порождение по иерархии), а в каком – нет? Скорее всего, вопрос логически невнятен. И видимо приходится всегда иметь дело с возможностью циклической ссылки. (Кстати «автоподхват» хорош для реализации MIDI интерфейса – например легко держать по экземпляру справочников на строку формы, с возможностью ручного копирования данных, не заботясь об организации коллекции или массива ссылок на порожденные формы в родителе).

Я нигде не говорил, что Set Anything = Nothing разрушает объект. Просто это явный вызов «обнуления» ссылки. Кстати и дергать «библиотеки» я думал с тем, чтобы при их «отключении» вычистить глобальные переменные библиотек (видимо именно VBA), в которых, вероятно и остаются инициализированные (например) конструкцией {If chkBox Then} объектные ссылки. Да вот «отключить» библиотеку (ее средствами) похоже нельзя. - Простите за VBA–шный взгляд на работу библиотек (как VBA модулей).


А в целом – вопрос оптимизации, мне кажется, не в том, как строить и разрушать объекты, а как строить и разрушать «представления» объектов – т.е. именно ту часть объекта, которая необходима в данном куске кода. Тогда под объектом можно понимать структуру, позволяющую бесконечную деталировку, а под представлениями - уровни деталировки – то, что мы называем объектом сегодня. Вопрос именно в механизме (обобщенном) позволяющим определять, какую часть объекта достаточно построить (в памяти), чтобы вернуть например некоторое запрашиваемое свойство, или выполнить некий метод объекта. Или же позволять в явном виде манипулировать требуемыми представлениями из текста программы (объявлять «глубину» при создании). Последнее представимо сегодня в виде «ручной» реализации «представлений» как РАЗЛИЧНЫХ объектов, с ручным вызовом нужных исходя из контекста. Но вряд ли это интересно, если объекты не столь сложны, что покушаются на всю доступную память. Т.ч. это скорей мыслимая специфическая техника, чем некая панацея (избавления этапа исполнения от безумного создания и разрушения замков в стиле озверевшего джина из «понедельника»).
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32239442
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>«правильно» ли иметь возможность циклических ссылок.\r
\r
Нас не спрашивают правильно или не правильно. Таковы правила игры VB/VBA и COM объектов.\r
\r
>Вопрос таков: если даже помыслить механизм отслеживания «иерархии» ссылок, можем ли мы однозначно сказать, в каком случае объект надо разрушить при разрушении вызвавшего его (изначально) объекта (т.е. все оставшиеся ссылки на объект – его собственные порождение по иерархии), а в каком – нет?\r
\r
Почитай внимательно все посты этого топика. Ведь писали же и ЛП и vdimas, что COM объекты сами решают когда пришло время им умереть (Счетчик ссылок = 0) и мы не можем просто-так взять и уничтожить объект. Мы можем только "подчистить хвосты" . Ну а если нам лень их подчищать, то можно и избавиться от циклических ссылок.\r
(См. /topic/43786) .\r
Метод хорош при организации отношений Parent-Child.\r
\r
На следующие части твоих вопросов отвечу когда все обдумаю!\r
Продолжение следует...\r
>И видимо приходится всегда иметь дело с возможностью циклической ссылки.\r
\r
Не приходится, а скорее придется. \r
-Ты видишь суслика?\r
-нет.\r
-И я нет. А он ЕСТЬ!\r
\r
>хорош для реализации MIDI интерфейса – например легко держать по экземпляру справочников на строку формы, с возможностью ручного копирования данных, не заботясь об организации коллекции или массива ссылок на порожденные формы в родителе\r
\r
очепятка MIDI - MDI, но все поняли и так. Очень непонятно написано. А! Наверное так, если я правильно тебя понял. Имеется справочник. Для него существуют две формы или более. Одна из них это форма в виде списка( видим список элементов с ограниченным числом полей: id, name etc). А другая это форма элемента (видим только один элемент но поля уже все). А как тогда отслеживать открытие для одного элемента двух форм. Хм... Ну можно у форм элементов создать Public методы типа GetID() и бежать по коллекции Forms(). Но нужно бегать по всем формам, в коллекции бы мы точно знали какие формы открыты. Но это уже дело вкуса!
...
Рейтинг: 0 / 0
Модули класса. Все ли так просто.
    #32239450
Shkurenko Alexander
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой!
Про продолжение следует не туда влепил. Должно быть в самом низу поста.
...
Рейтинг: 0 / 0
70 сообщений из 70, показаны все 3 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Модули класса. Все ли так просто.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]