Создание объектов при вызове функций

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Filyus
Обычный пользователь
Обычный пользователь
 
Сообщения: 81
Зарегистрирован: 07.07.2011 (Чт) 11:54

Создание объектов при вызове функций

Сообщение Filyus » 13.04.2013 (Сб) 10:07

В VB 6 можно писать
Код: Выделить всё
Private Sub Form_Load()
  Test New Collection
End Sub
Private Sub Test(c As Collection)
  MsgBox c.Count
End Sub
вместо
Код: Выделить всё
Private Sub Form_Load()
  Dim c As New Collection
  Test c
End Sub
Private Sub Test(c As Collection)
  MsgBox c.Count
End Sub

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

Re: Создание объектов при вызове функций

Сообщение Viper » 13.04.2013 (Сб) 10:17

В чем смысл данного кода и уж тем более в чем его "кирпичность"?
Весь мир матрица, а мы в нем потоки байтов!

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

Re: Создание объектов при вызове функций

Сообщение Хакер » 13.04.2013 (Сб) 12:50

Я перенёс. Это суперпримитивный факт, все об этом знают.

Это всё равно что написать
В VB6 можно писать
MsgBox Not vbBlack
вместо
Код: Выделить всё
Const xxx = not vbBlack
MsgBox xxx


New такой же оператор, как унарный минус или Not.

И на всякий случай (а то мало ли?): Dim x As New y это совершенно не то же самое, что и Dim x as y: set x = new y
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание объектов при вызове функций

Сообщение ger_kar » 13.04.2013 (Сб) 17:44

Хакер писал(а):Это суперпримитивный факт
На вид то он конечно примитивный, Но я например такое использование ни разу не встречал. И фиг бы наверное сам бы догадался так использовать. Хотя на практике оно особо и не нужно. Так ради прикола :)

Хакер писал(а):все об этом знают

Ну наверное далеко не все...
Бороться и искать, найти и перепрятать

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

Re: Создание объектов при вызове функций

Сообщение Хакер » 13.04.2013 (Сб) 18:29

ger_kar писал(а):Так ради прикола :)

Глупость.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание объектов при вызове функций

Сообщение ger_kar » 13.04.2013 (Сб) 18:35

Что глупость? Так использовать?
Бороться и искать, найти и перепрятать

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

Re: Создание объектов при вызове функций

Сообщение Хакер » 13.04.2013 (Сб) 18:42

ger_kar писал(а):Что глупость? Так использовать?

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

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание объектов при вызове функций

Сообщение ger_kar » 13.04.2013 (Сб) 18:54

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

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Создание объектов при вызове функций

Сообщение FireFenix » 13.04.2013 (Сб) 19:05

ger_kar писал(а):На вид то он конечно примитивный, Но я например такое использование ни разу не встречал. И фиг бы наверное сам бы догадался так использовать. Хотя на практике оно особо и не нужно. Так ради прикола :)

New вызывает конструктор объекта.
Если некоторая функция принимает на входе объект, который в свою очередь создаётся с некоторыми параметрами для этой функции, то обычная практика в любых языках
Код: Выделить всё
SomeFunc(New Object1(params), new Object2(Params))

Особо и не нужно? Зато сокращает размер кода, а в некоторых случаях даёт ещё и компилятору свободу оптимизаций.

в VB.NET ещё с With это частое явление
Код: Выделить всё
SomeFunc(New Object1() With {param1 = value1, param2 = value2})
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

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

Re: Создание объектов при вызове функций

Сообщение Хакер » 13.04.2013 (Сб) 19:10

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

Ты говоришь «вряд ли понадобится», а дела обстоят иначе: оно просто используется кучей людей и всё тут.

Более того, в VB такое нельзя, а вот в С++-подобных языках с автоматическим подсчётом ссылок / сборкой мусора можно, и используется такая семантика:
Код: Выделить всё
new Cfoo();
new CBar();


Иными словами, ссылка на новый объект никуда не присваивается и никуда не передаётся.

Например, создание записи в логе делается не так:
CreateLogMessage("Hello!");
а так:
new LogMessage("hello");
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание объектов при вызове функций

Сообщение ger_kar » 13.04.2013 (Сб) 19:36

FireFenix писал(а):Если некоторая функция принимает на входе объект, который в свою очередь создаётся с некоторыми параметрами для этой функции, то обычная практика в любых языках
Код: Выделить всё
SomeFunc(New Object1(params), new Object2(Params))
Ну может во многих, но точно не в любых. В VB6 такое точно не прокатит, ибо вызов конструктора с параметрами там не предусмотрен. Тема создана в ветке VB6, пример тоже для VB6, все сказанное мною тоже относится исключительно к VB6. Поэтому надо оставить все многообразие языков программирования и сосредоточится на VB6 :)

Хакер писал(а):Ты говоришь «вряд ли понадобится», а дела обстоят иначе: оно просто используется кучей людей и всё тут.
Кучей людей применительно ко всему многообразию средств и языков программирования или кучей людей применительно к VB6? Сколько кода разного видел на VB6, то такую семантику вызова нигде не встречал.
Хакер писал(а):Более того, в VB такое нельзя, а вот в ...
Ну мало ли, что и где можно. Главное что в VB6 такое нельзя. И все прекрасно обходится и без этого и никто по этому поводу особо не сожалеет :) .
Бороться и искать, найти и перепрятать

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

Re: Создание объектов при вызове функций

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

ger_kar писал(а):Кучей людей применительно ко всему многообразию средств и языков программирования или кучей людей применительно к VB6? Сколько кода разного видел на VB6, то такую семантику вызова нигде не встречал.

И конечно же распространяешь частный случай (свой собственный опыт) на всех остальных?

ger_kar писал(а):В VB6 такое точно не прокатит, ибо вызов конструктора с параметрами там не предусмотрен.

Вот надо понимать, что не в VB не предусмотрен вызов конструктора с параметрами, а всё намного глубже. COM предусматривает кучу способов создания объектов. И тут у программиста/архитектора огромное раздолье: и моникеры, и фабрики классов (свои и чужие) и персистентные объекты.

Естественно, если бы был навязано, что объекты обязаны быть экземплярами каких-то классов (на самом деле не обязаны) и обязаны иметь конструктор и обязаны принимать параметры для конструктора определённым способом — были бы недовольные, и это было бы не так хорошо. Поэтому поступили совершенно по-другому.

Тем не менее, в рамках ActiveX-технологии (которая представляет собой как бы подмножество COM-мира) есть способ-создания-объектов-по-умолчанию. Никто не навязывает использовать именно его. Кроме того, есть немного отличающийся. Программист свободен в выборе. Но тем не менее, способ-создания-объектов-по-умолчанию — это фабрика классов, поддерживающая интерфейс IClassFactory.

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

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

Единственная ошибка, это то, что общепринятного и общерекомендуемого способа (типа IClassFactoryEx) для конструкторов с параметрами они не создали (тут есть причина, о которой можно рассказывать отдельно). И ещё есть мир, который не хочет жить настолько хорошо, насколько это возможно. Потому что мир, который мы имеем, хочет жить по немного другому принципу: он хочет жить настолько просто, насколько это возможно.

Поэтому дали людям возможность называть свои контролы как им угодно, но осталось куча пофигистично настроенных людей, у которых все проекты называются Project1, все формы называются Form1, Form2 и т.д, а все контроллы — Command1 и Label1. Потому что им так проще и они не видят необходимости давать названия, если и без того всё вроде бы работает.

Вот так и тут. Простой IClassFactory очень скоро стал почти стандартом. Функция в стиле «быстрая обёртка», называющаяся CoCreateInstance, предназначенная для создания объектов, конструкторы которых точно не имеют параметров, — тоже стала очень популярной.

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

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Создание объектов при вызове функций

Сообщение ger_kar » 14.04.2013 (Вс) 1:46

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


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 73

    TopList