Module и Class Module

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Module и Class Module

Сообщение Diamock » 22.05.2011 (Вс) 18:59

В VB существуют Module и Class Module. Хотелось бы узнать, в каких случаях целесообразнее использование Module и Class Module.
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Module и Class Module

Сообщение Viper » 22.05.2011 (Вс) 20:21

Class Module используется для создания класса, то есть в случаях описания некоего объекта. В то время как просто Module используется в качестве контейнера для функций и константа объединенных неким общим назначением.
Весь мир матрица, а мы в нем потоки байтов!

Diamock
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 388
Зарегистрирован: 26.10.2009 (Пн) 4:19
Откуда: Кемерово

Re: Module и Class Module

Сообщение Diamock » 23.05.2011 (Пн) 3:34

Viper писал(а):Class Module используется для создания класса, то есть в случаях описания некоего объекта. В то время как просто Module используется в качестве контейнера для функций и константа объединенных неким общим назначением.

Это понятно. Приведу пример. CommonDialog (который не OCX), код для его использования размещают и в Модулях и в Классах.
Я, хочу знать в каких случаях предпочтительно создание объекта, а в каких нет.
In der Beschrankung zeigt sich erst der Meister
Графоманю...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Module и Class Module

Сообщение Хакер » 23.05.2011 (Пн) 3:35

Зависит от логического восприятия программистом происходящего.

Впрочем, при определённом старании даже класс можно сделать используя обычный модуль, а не модуль класса.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Module и Class Module

Сообщение Antonariy » 23.05.2011 (Пн) 13:34

Diamock писал(а):Я, хочу знать в каких случаях предпочтительно создание объекта, а в каких нет.
Объясню на пальцах.
Модуль может содержать какой-то набор публичных переменных. Эти переменные будут для всех членов проекта глобальными, в один и тот же момент времени они будут возвращать одни и те же значения. Ты не можешь в режиме исполнения сделать копию модуля и присвоить копии новые значения, имея два и более разных наборов одновременно. Адресное пространство модуля во время исполнения программы не меняется, можно сказать является статическим.

В отличие от модуля, класс является его полной противоположностью. Можно невозбранно создавать неограниченное количество копий класса, которые называются объектами. Каждый объект хранит свою копию пременных со своими персональными значениями. Для каждого объекта выделяется отдельный кусок адресного пространства, эти куски можно назвать динамическими.

Касательно CommonDialog (который не OCX). Его код размещают в модулях потому что он использует процедуру обратного вызова, которую находит по ее адресу, который ему передают при его создании через оператор AddressOf. AddressOf может работать только со статическим адресным пространством процесса, потому что оно не меняется во время исполнения — точка входа в процедуру обратного вызова гарантированно останется по тому адресу, по которому она оказалась при запуске процесса. Объекты же могут удаляться и создаваться, получая непредсказуемые диапазоны адресного пространства. Если в качестве адреса процедуры обратного вызова будет дан адрес объектной процедуры, то после уничтожения объекта обратный вызов уйдет в астрал и программа рухнет.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Module и Class Module

Сообщение Хакер » 23.05.2011 (Пн) 13:39

Antonariy писал(а):Ты не можешь в режиме исполнения сделать копию модуля и присвоить переменным новые значения, имея два и более разных наборов одновременно.

ActiveX DLL проект в режиме Apartament Threading имеет копию всех переменных модуля для каждого апартамента (читай — потока).

Antonariy писал(а):ddressOf может работать только со статическим адресным пространством процесса, потому что оно не меняется во время исполнения — точка входа в процедуру обратного вызова гарантированно останется по тому адресу, по которому она оказалась при запуске процесса. Если в качестве адреса процедуры обратного вызова будет дан адрес объектной процедуры, то после уничтожения объекта обратный вызов уйдет в астрал и программа рухнет.

Архичушь. Никуда они не уйдут. Разделение адресного пространства процесса на статические и динамическое — нонсенс.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Module и Class Module

Сообщение Antonariy » 23.05.2011 (Пн) 14:08

ActiveX DLL проект в режиме Apartament Threading имеет копию всех переменных модуля для каждого апартамента (читай — потока).
Частный случай, до которого ТСу нет дела. Он не знает разницы между модулем и классом, ну а разные виды dll вообще пока в пролете...
Архичушь. Никуда они не уйдут. Разделение адресного пространства процесса на статические и динамическое — нонсенс.

На данном этапе освоения материала это не существенно. Зато описывает причины и следствия происходящего в тех словах и словосочитаниях, которые ТС способен правильно воспринять. И то, что ты не понимаешь смысла словосочетания "на пальцах" в противовес "в сертифицированных терминах ™".
Последний раз редактировалось Antonariy 23.05.2011 (Пн) 14:15, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Module и Class Module

Сообщение Хакер » 23.05.2011 (Пн) 14:20

Antonariy писал(а):На данном этапе освоения материала это не существенно.

На любом этапе чушь нежелательна. Чушь имеет обыкновение закрепляться в памяти, и выводится гораздо хуже, чем вводится. AddressOf нет возможности применять к методам интерфейсов исключительно по причине стиля: в COM для callback-ов практикуется передача ссылки на интерфейс, а не передача адреса процедуры.

Antonariy писал(а):Он не знает разницы между модулем и классом, ну а разные виды dll вообще пока в пролете...

Вообще-то его слова говорят о том, что всё-таки знает (да и предыдущие посты говорят). А в данном случае, получается, он спрашивает, почему WinAPI-шные фичи одни оборачивают в модуль, а другие — в класс. Вопрос в применимости техник, а не в сути техник.

P.S. Лучше направь свою комментарческую энергию вот сюда.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Module и Class Module

Сообщение Antonariy » 23.05.2011 (Пн) 14:40

Хакер писал(а):
Antonariy писал(а):На данном этапе освоения материала это не существенно.

На любом этапе чушь нежелательна. Чушь имеет обыкновение закрепляться в памяти, и выводится гораздо хуже, чем вводится. AddressOf нет возможности применять к методам интерфейсов исключительно по причине стиля: в COM для callback-ов практикуется передача ссылки на интерфейс, а не передача адреса процедуры.

Antonariy писал(а):Он не знает разницы между модулем и классом, ну а разные виды dll вообще пока в пролете...

Вообще-то его слова говорят о том, что всё-таки знает (да и предыдущие посты говорят). А в данном случае, получается, он спрашивает, почему WinAPI-шные фичи одни оборачивают в модуль, а другие — в класс. Вопрос в применимости техник, а не в сути техник.

Ну передай коммондиалогу адрес объектного коллбэка, а потом удали объект. Особенно, если коллбэк использует данные объекта. В зависимости от вида данных и способов их использования может произойти от ничего до краха программы.

Помимо стиля здесь присутствует предохранитель, не позволяющий прострелить себе ногу.

Вообще-то его слова говорят о том, что всё-таки знает (да и предыдущие посты говорят).
Если бы знал, не было бы вопроса.

Хакер писал(а):P.S. Лучше направь свою комментарческую энергию вот сюда.
Некрофилия, 4 года как-никак прошло.
Проект вскоре после той темы переехал на дотнет, а технология сама по себе мне не интересна. Да любые технологии по производству протезов для vb6 уже не интересны. Их негде применить.

Лучше расковыряй эту тему, если времени много. Эту библиотеку я бы вернул с с++ на vb6, если бы он нормально работал.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Module и Class Module

Сообщение Хакер » 23.05.2011 (Пн) 14:54

Antonariy писал(а):Ну передай коммондиалогу адрес объектного коллбэка, а потом удали объект.

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

Передать коммондиалогу адрес объектного callback-а не получится, потому что он будет ожидать первым параметров передачу This(Me), а CommonDialog ничего такого передавать не будет. Несоответствие прототипов процедур. И именно в этом дело, а не в том, что адреса методов становятся недействительными (или методы, боже упаси, куда-то перемещаются). Как минимум, если бы AddressOf был применим к методам, они бы для всех объектов одинакового класса возвращал бы один и тот же адрес. И этот адрес был бы действительным даже после того, как все такие объекты бы умерли. Я не проверял, но если предположить, что компилятор VB и здесь не пытается всех перехитрить своей оптимизацией, то получится, что даже после смерти всех объектв можно вызвать метод по адресу, передав первым параметром нулевую ссылку. Никакого краха не прозойдёт. Максимум — Object variable or With block variable not set при первом же обращении к Me внутри кода вызываемого метода.

Так что, на каких бы «пальцах» ты не объяснял, есть упрощённые объяснения на пальцах, но в данном случае были просто ошибочные утверждения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Module и Class Module

Сообщение Antonariy » 23.05.2011 (Пн) 15:18

Хакер писал(а):Так что, на каких бы «пальцах» ты не объяснял, есть упрощённые объяснения на пальцах, но в данном случае были просто ошибочные утверждения.
Да, пожалуй чересчур на пальцах. Поздно вспомнил про строение интерфейсов, а переписывать телегу было лень. Конечно, сама процедура остается на том же месте, но пропадают или изменяются контекстно-зависимые данные. В общем, при определенных условиях коллбэком через объектную процедуру можно прострелить себе ногу, а использование AddressOf эту возможность исключает.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Module и Class Module

Сообщение Хакер » 23.05.2011 (Пн) 15:37

Проверил: вызов метода несуществующего объекта в IDE вызывает крах, в скомпилированном виде, как и предсказывалось, «Object variable or With block variable not set».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Module и Class Module

Сообщение Sam777e » 23.05.2011 (Пн) 16:53

Доброго времени суток всем !

to Diamock

Рекомендую почитать книгу "Приемы объектно-ориентированного проектирования" о паттернах проектирования, Erich Gamma и соавторы.
Здоровья и удачи

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Re: Module и Class Module

Сообщение Zenitchik » 12.06.2011 (Вс) 9:07

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 1

    TopList  
cron