ООП От начала до конца...

В этом форуме автор намерен рассказывать о своём нелегком пути становления программистом.

Модератор: SLIM

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

ООП От начала до конца...

Сообщение SLIM » 23.10.2008 (Чт) 12:58

Значится так.
Уже совсем не могу смотреть на себя в зеркало не зная основы основ.
Хочу обратиться ко всем вам за помощью в данном вопросе.
Мне хочется знать все об ООП чуть ли не до самого низкоуровневого понятия.
Использование объектов пез понимания не дает мне покоя.

Итак начнем по порядку.
Первое что у меня возникает - это
Что происходит при создании объекта и чем отличается создание объекта
Код: Выделить всё
Dim Cn As New ADODB.Connection

от
Код: Выделить всё
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection

Существуют ли другие способы создания объектов?
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: ООП От начала до конца...

Сообщение alibek » 23.10.2008 (Чт) 13:03

То что ты спрашиваешь, имеет очень косвенное отношение к ООП.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 23.10.2008 (Чт) 13:07

То что ты спрашиваешь, имеет очень косвенное отношение к ООП.

Тоесть? Так происходит создание объектов и выделение памяти на на них и т.д. Почему косвенно?
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: ООП От начала до конца...

Сообщение alibek » 23.10.2008 (Чт) 14:36

Потому что ООП никак не связано с реализацией COM.
Ты определись, что ты хочешь, понять что такое ООП, или узнать о COM.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 23.10.2008 (Чт) 15:30

Хочу про ООП. То что я привел в пример - просто первое что пришло на ум.
например так лучше будет
Код: Выделить всё
Dim nCLS as SomeClass
Пишите жизнь на чистовик.....переписать не удастся.....

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: ООП От начала до конца...

Сообщение alibek » 23.10.2008 (Чт) 16:05

Тогда еще раз.
ООП связан с COM очень косвенно.
Lasciate ogni speranza, voi ch'entrate.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 23.10.2008 (Чт) 16:16

Тогда видимо я чего-то не понимаю.
Что здесь COM а что здесь ООП. Видимо с этого и стоило начать
Пишите жизнь на чистовик.....переписать не удастся.....

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Re: ООП От начала до конца...

Сообщение FaKk2 » 24.10.2008 (Пт) 0:49

Он имеет ввиду зачем нужен New оператор.

SLIM
Когда ты пишешь Dim sc As SomeClass ты говоришь компилятору, что желаешь зарезервировать идентификатор sc за типом SomeClass. Сам идентификатор ни на что не указывает, но компилятор знает, что он может указывать только на обьект типа SomeClass. Позже, тебе надо инициализировать этот идентификатор, ту бишь создать в памяти обьект типа SomeClass и записать на него ссылку в идентификатор sc. Поэтому у тебя есть три варианта выполнения этих двух шагов:
Код: Выделить всё
Dim sc As New SomeClass

или
Код: Выделить всё
Dim sc as SomeClass
sc = New SomeClass()

или
Код: Выделить всё
Dim sc As SomeClass = New SomeClass()


Вышесказанное относится к VB.NET. В VB6 свои ньансы о которых говорит alibek.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

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

Re: ООП От начала до конца...

Сообщение Хакер » 24.10.2008 (Пт) 1:49

SLIM писал(а):чем отличается создание объекта
Код: Выделить всё
Dim Cn As New ADODB.Connection

от
Код: Выделить всё
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection


Разнциа в том, что во втором случае объект создаётся явно и единожды — при выполнении второго statement-а. В первом же случае при каждом обращении к Cn будет сначала проведена проверка на Cn Is Nothing, и если получится True, то объект будет создан. Т.е. во втором случае объект создаётся всякий раз при обращении, если ссылка никуда не указывает.

Существуют ли другие способы создания объектов?

CreateObject — как альтернатива New.
CoCreateInstance — как более низкоуровневый вариант.
Вызов IClassFactory::CreateInstance — как ещё более низкоуровневый вариант.

Для локальных приватных внутрипроектных классов, вместо New можно юзать msvbvm60!__vbaNew и msvbvm60!__vbaNew2. Можно, но не нужно, ибо недокументированные они.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 24.10.2008 (Пт) 13:22

Хакер писал(а):В первом же случае при каждом обращении к Cn будет сначала проведена проверка на Cn Is Nothing, и если получится True, то объект будет создан. Т.е. во втором случае объект создаётся всякий раз при обращении, если ссылка никуда не указывает.

То есть по сути это только "замедляет" все что можно? Зачем тогда вооще такой способ придумали?
Хакер писал(а):CreateObject — как альтернатива New.
CoCreateInstance — как более низкоуровневый вариант.
Вызов IClassFactory::CreateInstance — как ещё более низкоуровневый вариант.

За это спасибо. Буду разбирать
Хакер писал(а):Для локальных приватных внутрипроектных классов, вместо New можно юзать msvbvm60!__vbaNew и msvbvm60!__vbaNew2. Можно, но не нужно, ибо недокументированные они.

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

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: ООП От начала до конца...

Сообщение tyomitch » 24.10.2008 (Пт) 13:42

SLIM писал(а):То есть по сути это только "замедляет" все что можно? Зачем тогда вооще такой способ придумали?

Для случаев, когда создание объекта ресурсоёмко, а фактически он нужен не сразу и/или не всегда.
Проверка на Is Nothing занимает ничтожную часть времени большинства вызовов методов.

SLIM писал(а):в VB усть таки недокументируемые ф-ии, тем немение они использутся. Почему бы и нет

А нафига? Чисто для понта?
Изображение

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 24.10.2008 (Пт) 14:17

tyomitch писал(а):Для случаев, когда создание объекта ресурсоёмко, а фактически он нужен не сразу и/или не всегда.
Проверка на Is Nothing занимает ничтожную часть времени большинства вызовов методов.

Это Понятно. Спасибо.
tyomitch писал(а):А нафига? Чисто для понта?

Я же говорил. Хочу знать все. Как вариант и это тоже знать хочется
Пишите жизнь на чистовик.....переписать не удастся.....

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: ООП От начала до конца...

Сообщение ANDLL » 24.10.2008 (Пт) 20:05

SLIM писал(а):
tyomitch писал(а):А нафига? Чисто для понта?

Я же говорил. Хочу знать все. Как вариант и это тоже знать хочется
Знать все сложновато. А вот знать нужное, важнее чем знать ненужное
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: ООП От начала до конца...

Сообщение Хакер » 24.10.2008 (Пт) 20:12

SLIM писал(а):То есть по сути это только "замедляет" все что можно? Зачем тогда вооще такой способ придумали?

Нет.
Во-первых, проверка осуществляется и при работе с обычными ссылками. Просто с DAN-ссылками в резульатет этой проверки создаётся новый объект, а обычными ссылками — ошибка "Object variable or with block variable not set".
Во-вторых, всё чуть хитрее и проверка осуществляется не каждый раз. Есть такое понятие как безопасный контекст. Это область кода, где если ссылка была установлена в начале, то она гарантированно останется установленой на протяжении всего БК.

БК начинается проверкой на Nothing, и заканчивается:
  • Непосредственным изменением ссылки
  • Вызовом любой процедуры (для глобальных ссылок)
  • Вызовом любой процедуры, при условии что ссылка передаётся ByRef (для статических и нестатических локальных ссылок)

Скажем, для кода
Код: Выделить всё
SomeObj.SomeMethod 1, 2, "asd"
SomeObj.SomeCoolMethod
SomeObj.SaveAllData
SomeObj.ReloadProperties
SomeObj.Serialize


проеверка осуществяется только один раз — перед выполнением первого statement'а. Потому что делать её в остальных случаях бессмысленно — с ссылкой гарантировано ничего не произошло — безопасный контекст не прерывается на протяжении всего этого кода.


SLIM писал(а):в VB усть таки недокументируемые ф-ии, тем немение они использутся. Почему бы и нет

Нет этих функций в языке Visual Basic. Они есть в конкретной реализации компилятора/рантайма для этого языка. Если, например, Sun возьмётся делать свой компилятор для VB, то там этих функций совершенно не обязано быть.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 24.10.2008 (Пт) 23:55

ANDLL писал(а):Знать все сложновато. А вот знать нужное, важнее чем знать ненужное

Согласен....
Хакер писал(а):БК начинается проверкой на Nothing, и заканчивается:

* Непосредственным изменением ссылки
* Вызовом любой процедуры (для глобальных ссылок)
* Вызовом любой процедуры, при условии что ссылка передаётся ByRef (для статических и нестатических локальных ссылок)

Не совсем понял. То есть ссылка создается с проверки на Nothing, с этого момента начинается БК. И заканчивается он если я меняю ссылку, это понятно (опять таки, т.е. если ссылка не меняется на протяжении всего VB кода, то этот код будет "территорией" БК?). Далее, вызов любой процедуры....т.е.? С третим пунктом вообще сложновато.
Т.е. как я понял БК прирвется в случае
Код: Выделить всё
SomeObj.SomeMethod 1, 2, "asd"
SomeObj.SomeCoolMethod
SomeObj.SaveAllData
Set SomeObj = ........
SomeObj.ReloadProperties
SomeObj.Serialize

А также в случае
Код: Выделить всё
SomeObj.SomeMethod 1, 2, "asd"
SomeObj.SomeCoolMethod
SomeObj.SaveAllData
вызов процедуры (Любой вообще?)
SomeObj.ReloadProperties
SomeObj.Serialize
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: ООП От начала до конца...

Сообщение Хакер » 25.10.2008 (Сб) 0:02

Если ссылка глобальная, то БК заканчивается вызовом любой процедуры (вообще любой).
Еслли ссылка локальная, то БК перерывается вызовом только той процедуры, в которую передаётся указатель на эту ссылку.

Т.е.
Код: Выделить всё
Sub Foooooooooooooo()

   Dim lnk as Object
   Set lnk = New CHuman
   
   MsgBox "Hi!"
   lnk.SayHello         ' перед выполнением этого — начало БК.
   MsgBox "GoodBuy!" ' тут БК не прерывается
   A lnk           ' и тут БК не прерывается
   B lnk           '  а после этого statement'а — прерывается.
   MsgBox "Gigigig!"
   lnk.SayGoodbuy    ' а тут начинается уже второй БК

End Sub

Sub A(ByVal Link As Object)
    Link.DoSomething
    Set Link = Nothing
End Sub

Sub B(ByRef Link As Object)
    Link.DoSomething
    Set Link = Nothing
End Sub



Если [Dim lnk As Object] вынести за пределы функции, то БК будет перерываться любым вызовом, в том числе MsgBox-овским.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Re: ООП От начала до конца...

Сообщение SLIM » 25.10.2008 (Сб) 0:13

Хакер писал(а):Если ссылка глобальная, то БК заканчивается вызовом любой процедуры (вообще любой).
Еслли ссылка локальная, то БК перерывается вызовом только той процедуры, в которую передаётся указатель на эту ссылку.

Разжевал и в рот положил....теперь все понятно

А что произойдет с ссылкой если локальная процедура (в которой собственно она создавалась) завершилась, а "принудитьльного" уничтожения ссылки не было? Т.е. после
Код: Выделить всё
lnk.SayGoodbuy    ' а тут начинается уже второй БК
Пишите жизнь на чистовик.....переписать не удастся.....

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

Re: ООП От начала до конца...

Сообщение Хакер » 25.10.2008 (Сб) 0:23

Ссылка не уничтожается, а сбрасывается.
Объект уничтожается, если все ссылки на него сброшены.

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


Вернуться в SLIM

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList  
cron