Re[51]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:23
Оценка:
Здравствуйте, gandjustas, Вы писали:

H>>У интерфейсов нет понятий видимости или невидимости методов. Интерфейс рассматривается только в целом. Тот факт, что второй интерфейс не совместим с типами COM, делает его не COM интерфейсом.

G>COM интерфейсом делает наследие от IUnknown.

G>Методы в принципе могут быть любыми. Если ты используешь другое соглашение о вызове, то этот объект может быть использовать только в среде Delphi. Если аргументы не являются variant — совместимыми, то нелюзя вызывать метоеды через IDispatch.


И при чем тут IDispatch

G>Ты бы лучше про COM прочитал сначала.


Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
Re[59]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:27
Оценка: :))
Здравствуйте, gandjustas, Вы писали:

H>>Объясняю еще раз, для особо одаренных. Сегодня ты должен спроектировать класс, и реализовать его так, чтоб завтра, некто другой мог получить (или проверить на возможность получения) от этой сущности другую сущность, о наличии которой тебе на момент проектирования не известно. Работая с объектами ты этой задачи не решишь, ну или изобретешь свой аналог GetInterface/QueryInterface.

G>Ты сейчас как-то криво рассказал про фабрику классов. Тольео её придумали гораздо раньше COM

Фабрика-то ту при чем? В своем ли ты уме??

G>Кстати COM нужен не для получения сущности (хотя непонятно чт ты имеешь ввиду) о наличии которой неизвестно на момент проектирования.

G>COM — бинарный стандарт повтороно используемых компонент. Все компоненты знают на момент проектирования какие инерфейсы они поддерживают

Я уж и не знаю, какие тебе еще примеры приводить, чтоб ты понял... Вот прикинь, получил ты интерфейс IUnknown (неважно, как и от кого), ты можешь запросить у него интерфейс ICanFly? Можешь. Можешь даже в том случае, если реализующий (IUnknown) объект не имеет понятия о ICanFly. Теперь давай тоже самое с объектами.
Re[52]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:29
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


H>И при чем тут IDispatch

А ты почитай — узнаешь

G>>Ты бы лучше про COM прочитал сначала.

H>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
А ты читал спеку по COM?
В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.
Re[53]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:35
Оценка:
Здравствуйте, gandjustas, Вы писали:

H>>И при чем тут IDispatch

G>А ты почитай — узнаешь

Ты мне предлагаешь почитать о том, что мне приходилось реализовывать Я тебе свой пример XML-RPC вызова приводил через диспатчинг (сразу скажу, диспатчинг делаю я сам), аль ты забыл?

G>>>Ты бы лучше про COM прочитал сначала.

H>>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
G>А ты читал спеку по COM?
G>В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.

Прекращай тупить.
Re[60]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:36
Оценка: +2
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


H>>>Объясняю еще раз, для особо одаренных. Сегодня ты должен спроектировать класс, и реализовать его так, чтоб завтра, некто другой мог получить (или проверить на возможность получения) от этой сущности другую сущность, о наличии которой тебе на момент проектирования не известно. Работая с объектами ты этой задачи не решишь, ну или изобретешь свой аналог GetInterface/QueryInterface.

G>>Ты сейчас как-то криво рассказал про фабрику классов. Тольео её придумали гораздо раньше COM

H>Фабрика-то ту при чем? В своем ли ты уме??

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

H>Я уж и не знаю, какие тебе еще примеры приводить, чтоб ты понял... Вот прикинь, получил ты интерфейс IUnknown (неважно, как и от кого), ты можешь запросить у него интерфейс ICanFly? Можешь. Можешь даже в том случае, если реализующий (IUnknown) объект не имеет понятия о ICanFly. Теперь давай тоже самое с объектами.


Ну на C# я напишу
  (obj as IInterface)//Если obj реализует IInterface, то вернется переменная этого типа, иначе будет null.

При этом человек, который писал о класс объекта obj мог и не знать о существовании IInterface.

Ты вообще знаешь для чего QueryInterface придумали?
Re[14]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>В .NET и Java у человека не будет проблем с утечками даже если он не понимает указатели.


Судя по тому, что ты тут пишешь, я вижу, что многого ты так и не понял...
Re[14]: Чем вам всем не угодил Delphi?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.05.08 06:38
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>Еще как назовешь. В динамических языках контроль типа осуществляется на стадии компиляции. Нельязя в делфи сравнить число со строкой, будет ошибка компиляции.
Можно. Еще как можно. Более того, в Delphi можно сделать вызов метода, которого объект не поддерживает, и узнать об этом только в рантайме. В точности, как в JS. Вот этот код прекрасно скомпилируется:
var
  obj: Variant;
begin
  obj.FillRect(100, 200, 10, 15, "Blue");
end;

Это и есть проявление динамической типизации.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[54]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:38
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


H>>>И при чем тут IDispatch

G>>А ты почитай — узнаешь

H>Ты мне предлагаешь почитать о том, что мне приходилось реализовывать Я тебе свой пример XML-RPC вызова приводил через диспатчинг (сразу скажу, диспатчинг делаю я сам), аль ты забыл?

Маладец!!!

G>>>>Ты бы лучше про COM прочитал сначала.

H>>>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
G>>А ты читал спеку по COM?
G>>В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.
H>Прекращай тупить.
Аргументы кончились?
Re[61]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:41
Оценка:
Здравствуйте, gandjustas, Вы писали:

H>>>>Объясняю еще раз, для особо одаренных. Сегодня ты должен спроектировать класс, и реализовать его так, чтоб завтра, некто другой мог получить (или проверить на возможность получения) от этой сущности другую сущность, о наличии которой тебе на момент проектирования не известно. Работая с объектами ты этой задачи не решишь, ну или изобретешь свой аналог GetInterface/QueryInterface.

G>>>Ты сейчас как-то криво рассказал про фабрику классов. Тольео её придумали гораздо раньше COM

H>>Фабрика-то ту при чем? В своем ли ты уме??

G>При том. Создание объекта, тип которого известен только во время выполенения — задача фабрки\фабричного метода.

Так нам не требуется ничего создавать. Нужно узнать у сущности, умеет ли она летать.

H>>Я уж и не знаю, какие тебе еще примеры приводить, чтоб ты понял... Вот прикинь, получил ты интерфейс IUnknown (неважно, как и от кого), ты можешь запросить у него интерфейс ICanFly? Можешь. Можешь даже в том случае, если реализующий (IUnknown) объект не имеет понятия о ICanFly. Теперь давай тоже самое с объектами.


G>Ну на C# я напишу

G>
G>  (obj as IInterface)//Если obj реализует IInterface, то вернется переменная этого типа, иначе будет null.
G>

G>При этом человек, который писал о класс объекта obj мог и не знать о существовании IInterface.

А что произойдет в момент компиляции, если obj не реализует IInterface?

G>Ты вообще знаешь для чего QueryInterface придумали?


Будь уверен.
Re[55]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:43
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>>>Ты бы лучше про COM прочитал сначала.

H>>>>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
G>>>А ты читал спеку по COM?
G>>>В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.
H>>Прекращай тупить.
G>Аргументы кончились?

Я тебе уже привел пример не COM-интерфейса, а для тебя это, похоже, картину мира нарушает. Ну-ну...
Re[15]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:43
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, gandjustas, Вы писали:

G>>Еще как назовешь. В динамических языках контроль типа осуществляется на стадии компиляции. Нельязя в делфи сравнить число со строкой, будет ошибка компиляции.
S>Можно. Еще как можно. Более того, в Delphi можно сделать вызов метода, которого объект не поддерживает, и узнать об этом только в рантайме. В точности, как в JS. Вот этот код прекрасно скомпилируется:
S>
S>var
S>  obj: Variant;
S>begin
S>  obj.FillRect(100, 200, 10, 15, "Blue");
S>end;
S>

S>Это и есть проявление динамической типизации.
Да знаю я это. Пару страниц назад сам об этом писал. Причем какя-то опция компилятора отключает это.
Но код
var
  i: integer;
begin
  i:='dgfdgdf';
end;

Вызвоет ошибку компиляции, что есть проявление статической типизации.

В Javascript такой код
var a = new Number;
var b = new String;
a = b;

Ошибки не вызовет.
Re[56]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:45
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


G>>>>>>Ты бы лучше про COM прочитал сначала.

H>>>>>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
G>>>>А ты читал спеку по COM?
G>>>>В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.
H>>>Прекращай тупить.
G>>Аргументы кончились?

H>Я тебе уже привел пример не COM-интерфейса, а для тебя это, похоже, картину мира нарушает. Ну-ну...

Ну ты тупой. Сам создатель COM говорит что любой интерфейс — наследник IUnknown является COM интерфейсом.
А ты продолжаешь свое повторять.
Re: Чем вам всем не угодил Delphi?
От: csharpworker  
Дата: 05.05.08 06:46
Оценка: :))
Здравствуйте, misha_irpen, Вы писали:

УУУУ! Сил читать 75 листов нет и времени.
От себя:
— все примеры, SDK и тому подобные вещи идут с примерами на СИ и Шарпе. Задолбался я переводить это все на паскаль.
— begin, end
— var
Re[62]: Чем вам всем не угодил Delphi?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.05.08 06:47
Оценка:
Здравствуйте, hattab, Вы писали:

H>Здравствуйте, gandjustas, Вы писали:


H>>>Фабрика-то ту при чем? В своем ли ты уме??

G>>При том. Создание объекта, тип которого известен только во время выполенения — задача фабрки\фабричного метода.
H>Так нам не требуется ничего создавать. Нужно узнать у сущности, умеет ли она летать.
А кто мешает написать метод, который спрашивает может ли фабрика создать такой тип?

G>>Ну на C# я напишу

G>>
G>>  (obj as IInterface)//Если obj реализует IInterface, то вернется переменная этого типа, иначе будет null.
G>>

G>>При этом человек, который писал о класс объекта obj мог и не знать о существовании IInterface.
H>А что произойдет в момент компиляции, если obj не реализует IInterface?
Ничего.

G>>Ты вообще знаешь для чего QueryInterface придумали?

H>Будь уверен.
Сомневаюсь.
Re[16]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:47
Оценка:
Здравствуйте, gandjustas, Вы писали:

S>>Здравствуйте, gandjustas, Вы писали:

G>>>Еще как назовешь. В динамических языках контроль типа осуществляется на стадии компиляции. Нельязя в делфи сравнить число со строкой, будет ошибка компиляции.
S>>Можно. Еще как можно. Более того, в Delphi можно сделать вызов метода, которого объект не поддерживает, и узнать об этом только в рантайме. В точности, как в JS. Вот этот код прекрасно скомпилируется:
S>>
S>>var
S>>  obj: Variant;
S>>begin
S>>  obj.FillRect(100, 200, 10, 15, "Blue");
S>>end;
S>>

S>>Это и есть проявление динамической типизации.
G>Да знаю я это. Пару страниц назад сам об этом писал. Причем какя-то опция компилятора отключает это.

Нет такой опции
Re[57]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:48
Оценка: :))
Здравствуйте, gandjustas, Вы писали:

G>>>>>>>Ты бы лучше про COM прочитал сначала.

H>>>>>>Если спека X-Man имеет десять пунктов, а ты соответствуешь только одному... Тебя можно назвать X-Man? Лечи голову, Вилли (с)
G>>>>>А ты читал спеку по COM?
G>>>>>В книге дональда боска (архитектора COM ксати) написано что любой интерфейс — наследник от IUnknown является COM интерфейсом.
H>>>>Прекращай тупить.
G>>>Аргументы кончились?

H>>Я тебе уже привел пример не COM-интерфейса, а для тебя это, похоже, картину мира нарушает. Ну-ну...

G>Ну ты тупой. Сам создатель COM говорит что любой интерфейс — наследник IUnknown является COM интерфейсом.
G>А ты продолжаешь свое повторять.

Не сотвори себе кумира. Думай своей головой.
Re[14]: Чем вам всем не угодил Delphi?
От: DOOM Россия  
Дата: 05.05.08 06:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, DOOM, Вы писали:


DOO>>Хорош уже откровенно тупить — где написано, что как только появляются объекты, то нужны смарт пойнтеры? Ты бы еще сказал, что на C нельзя написать <подставь сюда свой типичный проект>, потому что там нет объектов!

G>Они также нужны в Delph, потому что там можно забыть написать Free.
Почему ты считаешь, что нет другого способа обойти эту забывчивость? Я же уже написал про банальный подход у TComponent (и ведь работает).
Кстати, в C я бы сказал они нужны, чтобы не забыть вызвать free на участок памяти — но народ же как-то обходится (не спорю, что тяжело им, но есть методы поиска утечек).

G>Любоую программу можно написать без объектов, только вопрос времени.

Неверно. Распространенное заблуждение, что ООП реально сильнее процедурного программирования — почитай как народ офигел, когда поняли, что никто не умеет эффективно проектировать при ООП подходе. И как потом разрабатывали UML — процесс был долгий и мучительный (если я правильно помню, только через 6 лет смогли родить первую версию UML). Т.е. плата за все плюсы ООП — гораздо более серьезная зависимость от правильного проектирования.
Популярная библиотека Gtk является чисто сишной — на одних struct'ах построена и ничего, народ пользуется.


G>Что-то я не увидел примеров.

Еще раз:
C — динамика есть. Память выделяется, надо руками звать free — самый суровый вариант. Но ведь используется в своей нише — потому, что там легко понять, что компилятор сделает их исходного кода. Ты никогда не напишешь на .Net обработчик прерывания. Просто по определению.
Javascript — использование всяких внешних объектов (например, ADO) — соединение надо закрывать (может банально стоять ограничение на количество одновременных соединений и с базой и приехали. Веб приложение на классическом ASP встало). Особенно приятно, если это объект, хранящийся в контейнере сеанса — он не будет уничтожен по завершению работы сценария.
Могу еще что-нибудь придумать...


DOO>>В дельфи, к пример, все наследники TComponent'а в обязательном порядке обладают owner'ом — который отвечает за убийство своих подопечных, когда умирает сам.

G>Только далеко не все классы являются наследниками TComponent
Все визуальные — т.е. гипотетический криворукий программер, умеющий только кидать элементы на форму, будет иметь дело только с наследниками TComponent.


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

G>Выделенное — офигенный недостаток.
Это by design (ну да, иногда недостаток), но в общем и целом это как раз, то, что надо.


DOO>>И, если человек хоть немного понимает, что такое указатель, объект и т.п., то у него не будет проблем с утечками.

G>В .NET и Java у человека не будет проблем с утечками даже если он не понимает указатели.
Но если он не понимает указатели, то до борьбы с утечками он просто не доберется — ничего толком работать не будет.






kuj>>>>>2. Делфи — динамический язык?

DOO>>>>В достаточной мере.
G>>>Не более динаический, чем С++. Можно везде писать (void*) и кастить при каждом обращении.
DOO>>Да... Ну ладно — тогда создай мне экземпляр класса по его строковому имени в ран-тайме. Или хотя бы перечисли методы объекта в ран-тайме.
G>В С++ нет метаданных, поэтому такое невозможно. Но налитчие метаданных не делает язык динамическим.
G>В .NET и Java есть метаданные, но они не позиционируются как динамические языки.

G>Еще как назовешь. В динамических языках контроль типа осуществляется на стадии компиляции. Нельязя в делфи сравнить число со строкой, будет ошибка компиляции. то и есть проявление счтатической типизации.

Я уже приводил пример с поддержкой Variant'а на уровне синтаксиса языка — там ничего не известно на этапе компиляции.


G>В Javascript например написать сравнение числа со строкой вполне можно, это вызвоет ошибку времени выполнения.

Ошибку это не вызовет, проверил бы хоть, прежде чем писать.



DOO>>Ворнинги от того, что в .Net банально многое нельзя, а значит программа не перенесется в среду .Net.

G>В .NET можно сделать все, что можно в делфи.
В .Net нет прямого доступа к памяти, или я ошибаюсь?



DOO>>Так что подумай над своими методами ведения спора.

G>То есть ты хочешь сказать что использование вариантных типов не приводит к увечличению числа ошибок?
Я хочу сказать, что это другая тема. Я опроверг изначальный тезис: Дельфи — язык со строгой типизацией. Привел пример. Если тебе так интересно, что я думаю о такой поддержке Variant'а, то скажу просто — я этим старался не пользоваться. Но поддержка есть, значит не совсем строгая типизация. Вот и все.



G>Глупость номер раз — Delphi динамический язык

Я тебе показал отсутствие строгой типизации? Показал. Значит не все так просто в датском королевстве. Не укладывается Delphi в узкое определение статического языка со строгой типизацией — есть там кое-какие фичи.

G>Глупость номер два — использование вариантных типов везде.

Поясни. Кто тут и где про использование вариантных типов говорил?
Re[63]: Чем вам всем не угодил Delphi?
От: hattab  
Дата: 05.05.08 06:52
Оценка: -2
Здравствуйте, gandjustas, Вы писали:

H>>>>Фабрика-то ту при чем? В своем ли ты уме??

G>>>При том. Создание объекта, тип которого известен только во время выполенения — задача фабрки\фабричного метода.
H>>Так нам не требуется ничего создавать. Нужно узнать у сущности, умеет ли она летать.
G>А кто мешает написать метод, который спрашивает может ли фабрика создать такой тип?

Нам не нужно ничего создавать!

G>>>Ну на C# я напишу

G>>>
G>>>  (obj as IInterface)//Если obj реализует IInterface, то вернется переменная этого типа, иначе будет null.
G>>>

G>>>При этом человек, который писал о класс объекта obj мог и не знать о существовании IInterface.
H>>А что произойдет в момент компиляции, если obj не реализует IInterface?
G>Ничего.

Ok. Если это так, то такое поведение оператора as это и есть запрос интерфейса от объекта (но не приведение оного). А теперь запроси от объекта другой объект (ты же сказал, что решение на интерфейсах вызвано кривостью Delphi).
Re[20]: Чем вам всем не угодил Delphi?
От: DOOM Россия  
Дата: 05.05.08 07:00
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, DOOM, Вы писали:


kuj>>>Богатый интерфейс на яваскрипте? Флаг в руки, ветер в спину.

DOO>>А в чем проблема? Можно и интерфейс. Можно и прямо COM объект настрочить на JS (точнее, конечно, это WSH)... Не знал?
G>Да ну, а пример покажешь?

Пожалуйста. Технология называется Windows Script Components — ставить дополнительно ничего не надо, это включено в WSH (не помню с какой версии). Очень удобный способ, на самом деле в некоторых ситуациях.

Листинг 1: Sample.wsc
<?XML version="1.0"?>
<component>
<registration
  description="Sample component v1.0"
  progid="Penton.Sample"
  classid="{8C372226-7D30-4EC4-B1BF-F6C4CEC53AEB}"
  version="1.0"
/>
<public>
<property name="Number">
  <put/>
</property>
<method name="Multiply">
  <parameter name="Multiplier"/>
</method>
</public>
<script language="VBScript"><![CDATA[
Dim Number
Sub put_Number(ByVal NewValue)
  Number = NewValue
End Sub

Function Multiply(ByVal Multiplier)
  Multiply = Number * Multiplier
End Function
]]></script>
</component>


С гуем сложнее — но могу поискать, если надо (по-моему для гуя что-то ставить еще надо).
Re[16]: Чем вам всем не угодил Delphi?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.05.08 07:12
Оценка: 3 (1)
Здравствуйте, gandjustas, Вы писали:
G>Да знаю я это. Пару страниц назад сам об этом писал. Причем какя-то опция компилятора отключает это.
G>Но код
G>Вызвоет ошибку компиляции, что есть проявление статической типизации.
Итого? Есть два кода. Один вызывает ошибку компиляции, другой не вызывает.
Какие выводы можно сделать? Ну, кроме того, что участники дискуссии очень плохо разбираются в системах типов?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.