
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (117) « Первая ... 107 108 [109] 110 111 ... 116 117 ( Перейти к последнему сообщению ) |
Сообщ.
#1621
,
|
|
|
Цитата C#, Pascal, Delphi, VB, PHP, Java, ... продолжать? Ты уже показал, как ты знаешь Delphi (раздельная компиляция юнитов - такой же основной принцип, как и строгая типизация), так что если с другими языками ситуация схожа - то лучше не надо ![]() ![]() PS: Кстати, где ты в словах Ромкина нашел переходы на личности или провокацию на них других участников? Я пока увидел это лишь в словах г-на trainer, по поводу пророков ![]() |
Сообщ.
#1622
,
|
|
|
Поправил из-за сбоя, чтобы не двоилось
Цитата Flex Ferrum @ у меня получается сделать следующий вывод: 1. Delphi не поддерживает неявную идентификацию интерфейсов в среде выполнения (т. е. ее RTTI не так хорош, как его тут малюют) 2. (как следствие) Delphi использует в качестве RTTI для интерфейсов явно указываемые UUID'ы и возлагает обязанность по их созданию на программиста, что (на мой взгляд) несколько странно. 3. (как следствие) Delphi имеет определенные завязки на COM, т. к. ни в каком другом языке (из тех, с которыми я работал) нет специальных языковых конструкций, используемых для навешивания на интерфейсы UUID'ов (в С++ этого вообще нет, в C# для этого используются метаатрибуты классов, но там метаатрибутика используется много для чего еще, в Java - и быть не может, т. к. изначально формировалась в другой среде). 4. Либо говорящий не совсем понимает, о чем вообще ведется речь, и откуда у чего ноги растут. По порядку: 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Да, употребляется именно UUID. И по следующим причинам: RTTI не работает через границу dll и процесса. Требуется bpl, а это чистая зависимость от языка. RTTI также работает для классов, а интерфейс - абстракция, и может быть реализован где угодно и как угодно. На это, собственно, и расчет. Как бы класс ни реализовал интерфейс - интерфейс будет опознан. На мой взгляд, все вполне логично: в результате в Delphi я не обязан реализовывать декларируемый интерфейс непосредственно в классе, там обеспечена двоичная композиция (кажется, это так называется), когда интерфейс реализуется вообще сторонним коклассом, присоединяемым в двоичном коде. Замечу, что да, изначально интерфейсы были созданы для поддержки СОМ. Но это было в прошлом веке. Сейчас, по крайней мере теоретически, данный механизм независим от платформы. И можно говорить, что интерфейсы в Delphi имеют поведение как в СОМ, но имеются ли завязки - я не уверен. По крайней мере, интерфейс, который я привел выше, обязан работать и на Linux, где я о COM не слышал. К сожалению, Kylix не стоит, проверить не могу. Но я уверен, что задумка была именно такая. Именно поэтому был введен IInterface, который, как заявлено, в win32 соответствует IUnknown, 3. Я бы сказал, "интерфейсы работают как в СОМ", привязка не обязательна. 4. А вот это вполне возможно ![]() |
Сообщ.
#1623
,
|
|
|
Цитата И тут, их величество интерфейсы ни с того ни с чего умеют подсчитывать ссылки(это на уровне языка/language core). А их величество строки не умеют? ![]() Цитата Чтобы качественно программировать на Дельфи нужно знать не меньше подводных камней. По крайней мере, не нужно знать, что строки необходимо заканчивать нулевым символом ![]() |
![]() |
Сообщ.
#1624
,
|
|
Цитата --Ins-- @ Ты уже показал, как ты знаешь Delphi Ладно, ладно, молчу, но, лучше бы ты повнимательней присмотрелся к контексту моих "страшных слов"... Цитата Romkin @ Чем отличается то, что сказал ты, от того, что сказал я? Ты процитировал какую-то мудрую книгу по COM, где было сказано, что интерфейс - это не абстрактный класс ![]() Цитата Romkin @ 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Я конечно ничего в Delphi не понимаю, как верно заметил --Ins--, но мне казалось, что в Delphi можно написать someRef as ISomeInterface и получить что нужно без указания каких-либо UUID'ов. Разве нет? |
Сообщ.
#1625
,
|
|
|
Цитата Господа Дельфисты, признайте уже, что Delphi - это Windows-only язык/компилятор и т.д., а программирование на Kylix столь же широко распространёно, сколько сайтостроение на С++. То, что он не получил распространение - это не аргумент. Аргумент - это само существование этого компилятора. Если можно было создать - значит язык кроссплатформенный. И ты не все учитываешь, есть еще .NET и Free Pascal ![]() |
![]() |
Сообщ.
#1626
,
|
|
Цитата --Ins-- @ А их величество строки не умеют? ![]() Ну да. 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible ![]() 2. Варианты - а чего их подсчитывать то? ![]() 3. Динамические массивы - ну да, ещё один костыль в языке для которого есть специальные ф-ции hi/lo, специальные правила MM и пр. BTW, IIRC эти самые массивы совместимы с OLE'шными - то бишь очередная рюшечка ![]() UPD: итого, у вас reference-counted только те сущности, которые нужны для OLE/COM. Добавлено Цитата --Ins-- @ По крайней мере, не нужно знать, что строки необходимо заканчивать нулевым символом ![]() Какие-такие строки? Я ничего никаким нулевым символом не заканчиваю ![]() |
Сообщ.
#1627
,
|
|
|
Я уже говорил, что это нужно для распознания нужного интерфейса. Флекс верно заметил, можно было бы сделать на основе RTTI, но эта штука может меняться даже в разных версиях компилятора, так что не катит.
Цитата archimed7592 @ Если уж на то пошло, то в Си вообще нет понятия символов, есть лишь понятие char, который можно рассматривать как символ, но не более. Вот именно эта концепция и не позволяет удобно работать со строками. Извини, что повторяюсь, но, каким местом ты сюда строки приплёл? Я про символы говорил... Цитата archimed7592 @ В Дельфях синтаксис более строгий, так что компилятор зарубит на корню любые попытки "прострелить себе ногу" Чтобы качественно программировать на Дельфи нужно знать не меньше подводных камней. ![]() Цитата archimed7592 @ Не смешно. Если взять тот же Си, то могу напомнить тебе, что строки с завершающим нулем появились под вполне определенную архитектуру, где была удобная аппаратная поддержка вот это я и называю рющечками: взята конкретная платформа(win32), конкретная технология(COM) и добавлена рющечка в язык ![]() Цитата archimed7592 @ Ну вот, приехали. Это каким же образом связаны базовый объект ООП и типы данных? Или ты не знаешь, что Дельфи позволяет обходиться без ООП? К TObject можно привести только его наследников, но никак не втсроенные типы аля integer, double, boolean, string ![]() Добавлено Цитата archimed7592 @ Архимед, скорее наоборот 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible ![]() ![]() ![]() ![]() |
![]() |
Сообщ.
#1628
,
|
|
Цитата --Ins-- @ И ты не все учитываешь, есть еще .NET и Free Pascal ![]() Free Pascal - бедняги, пытаются по неоднозначной спецификации(используя старый и проверенный метод проб и ошибок) состряпать компилятор, который будет более-менее соответствовать современной редакции Delphi. А Borland плевать, что кто-то что-то там пытается - они будут менять язык и поведение как им заблагорассудиться и не будут "проталкивать новый стандарт". .NET - то же мне кроссплатформенность. Я не удивлюсь, если уже есть brainfuck4dotNET. Чтобы сделать .NET компилятор нужно: 1) добавить все возможности, требуемые CLS и 2) специфицировать существующие возможности языка в терминах CLR. |
Сообщ.
#1629
,
|
|
|
Цитата archimed7592 @ Я конечно ничего в Delphi не понимаю, как верно заметил --Ins--, но мне казалось, что в Delphi можно написать someRef as ISomeInterface и получить что нужно без указания каких-либо UUID'ов. Разве нет? Если SomeRef - класс, то можно. Если интерфейс - то при наличии IID, поскольку переход в общем случае может быть нетривиальным, и упор идет на реализацию этих интерфейсов непосредственно в коклассе. Добавлено Цитата Flex Ferrum @ Ну, если посмотреть в сторону C#, то там интерфейс реализован вообще хитро. Реализация методов интерфейса ищется не только в том классе, который явно описан, как реализующий интерфейс, и наследниках этого класса, но также и в предках этого класса (по сигнатуре метода интерфейса). Вот это - реализация интерфейса, как языковой конструкции. Упс. И в наследниках?! Вот этого точно нет. Это как? Потомок же не создан, он что, создается? А в предках - ищется, куда денешься-то? |
Сообщ.
#1630
,
|
|
|
Цитата 1. Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible Ты не поверишь, но работа со строками в Delphi - куда более логична и прозрачна, чем в C/C++. Программист работает с некой абстрактной сущностью и его совсем не интересуют аспекты ее реализации. Компилятор все берет на себя. Кстати, Цитата ...скорее наоборот Дельфийские строки являются прямым наследником Паскалевских, а OLE появилось позже Так что это микрософт передрал идею, сделав свою технологию Дельфи-совместимой в этой цитате очень большая доля правды. Почитай более старую литературу, там строки, длина которых не определяется нулевым символом, а записана непосредственно рядом со строкой, называются "Pascal-строками" ![]() ![]() |
Сообщ.
#1631
,
|
|
|
Цитата Romkin @ Брр. Чем отличается то, что сказал ты, от того, что сказал я? Я с самого начала утверждал, что интерфейс - абстракция, и нельзя говорить, как именно он обязан реализоваться. При этом ты активно критикуешь реализацию описания интерфейса посредством абстрактного класса. Цитата --Ins-- @ 1 - 2. RTTI для интерфейсов в Delphi просто не употребим. Да, употребляется именно UUID. И по следующим причинам: RTTI не работает через границу dll и процесса. Требуется bpl, а это чистая зависимость от языка. RTTI также работает для классов, а интерфейс - абстракция, и может быть реализован где угодно и как угодно. На это, собственно, и расчет. Как бы класс ни реализовал интерфейс - интерфейс будет опознан. На мой взгляд, все вполне логично: в результате в Delphi я не обязан реализовывать декларируемый интерфейс непосредственно в классе, там обеспечена двоичная композиция (кажется, это так называется), когда интерфейс реализуется вообще сторонним коклассом, присоединяемым в двоичном коде. Замечу, что да, изначально интерфейсы были созданы для поддержки СОМ. Но это было в прошлом веке. Сейчас, по крайней мере теоретически, данный механизм независим от платформы. И можно говорить, что интерфейсы в Delphi имеют поведение как в СОМ, но имеются ли завязки - я не уверен. По крайней мере, интерфейс, который я привел выше, обязан работать и на Linux, где я о COM не слышал. К сожалению, Kylix не стоит, проверить не могу. Но я уверен, что задумка была именно такая. Именно поэтому был введен IInterface, который, как заявлено, в win32 соответствует IUnknown, Почему-то С++ не границы dll не мешают. Я вполне могу (в случае, если я пользуюсь одним компилятором) делать dynamic_cast'ы, "нарушающие" границы dll-ек, и это будет прекрасно работать. И по простой причине - компилятор с RTTI отвечают за то, чтобы такие касты проходили корректно. Интерфейс - это, конечно, абстракция. Но ровно до того момента, пока не получает конкретного воплощения для своего описания. В С++ - это абстрактные классы. В Delphi - это сущности под заголовком interface. Т. е. когда интерфейс приобретает вид вполне конкретной синтаксической и семантической конструкции, он перестает быть абстракцией. Вот в том же С++ я действительно могу использовать "чисто абстрактные" интерфейсы - когда программирую с помощью шаблонов (т. е. занимаюсь метапрограммированием). Там я интерфейс явно нигде не описываю, предполагая, что типы, которыми я типизирую конкретный шаблон, содержат реализации нужных мне методов. Вот это - интерфейсы как абстракция. Тут никакого RTTI и в помине быть не может. Правда, все остается на уровне компилятора. А когда ты в коде описываешь нечто под заголовком interface, этому нечто вполне можно присвоить некий RTTI-идентификатор. Автоматически, а значит навешивать явным образом UUID - это уже от лукавого (что и демонстрирует -Ins-). И кроссплатформенность тут приплетать ни к чему. Уж кому-кому, но не С++-сникам рассказывать про кроссплатформенность. ![]() ![]() |
![]() |
Сообщ.
#1632
,
|
|
Цитата AndNot @ Если уж на то пошло, то в Си вообще нет понятия символов, есть лишь понятие char, который можно рассматривать как символ, но не более. Вот именно эта концепция и не позволяет удобно работать со строками. Где неудобство? Я сколько работаю - одни удобства. На примере можно? Цитата AndNot @ Это не аргумент В Дельфях синтаксис более строгий, так что компилятор зарубит на корню любые попытки "прострелить себе ногу" ![]() ![]() ![]() Цитата AndNot @ Не смешно. Если взять тот же Си, то могу напомнить тебе, что строки с завершающим нулем появились под вполне определенную архитектуру, где была удобная аппаратная поддержка ![]() Если честно, ты не напомнил мне(ибо я этого не знал ![]() Цитата AndNot @ Ну вот, приехали. Это каким же образом связаны базовый объект ООП и типы данных? Или ты не знаешь, что Дельфи позволяет обходиться без ООП? ![]() Ах, вот оно какое тут rational ![]() Цитата Romkin @ Если интерфейс - то при наличии IID, поскольку переход в общем случае может быть нетривиальным, и упор идет на реализацию этих интерфейсов непосредственно в коклассе. Мдя... А коклассы - это случаем не OLE/COM-приблуда? ![]() |
Сообщ.
#1633
,
|
|
|
Цитата archimed7592 @ Строки в Delphi - особая каста. MM строк берёт на себя RTL. UPD: да, и кстати, строки у вас тоже OLE-compatible Собственно, так же, как и массивы ![]() И динамические массивы тоже не путай с вариантными. По-твоему, Delphi полностью OLE-совместимым каким-то получается ![]() Цитата archimed7592 @ UPD: итого, у вас reference-counted только те сущности, которые нужны для OLE/COM. Да уж. Вывод на пустом месте. И где в COM определена структура ansistring? Собственно да, WideString соответствует по структуре BSTR. Насколько - не знаю. Но трудно придумать что-то другое: структура простая, так почему бы не взять то, что уже есть и не изобретать велосипед? А динамический массив - это не safe array! Все, что ты сказал - уж прости, не соответствует действительности и основано на слухах. |
![]() |
Сообщ.
#1634
,
|
|
Цитата --Ins-- @ Программист работает с некой абстрактной сущностью и его совсем не интересуют аспекты ее реализации. Да я тоже работаю с некой абстрактной сущностью и меня не интересуют аспекты её реализации. Только, в отличии от Delphi-программистов я могу выбрать реализацию от STLport, стандартную, реализацию от Qt, из ICU и т.д. Цитата --Ins-- @ очень многие подхватили эту идею и перенесли ее к себе. Так как, например, для операции конкатеции строк не нужно пробегать по всем строкам, определяя положение нулевого символа, и вычисления размера буфера для новой строки. Теперь эти длины можно просто взять из метаданных и сложить. ![]() У, блин, да сто лет в обед, как в С++ не используются NTBS. Да, они там есть, точно так же, как и есть object ... end в Delphi, но наличие не обязует к использованию. |
Сообщ.
#1635
,
|
|
|
Цитата archimed7592 @ А коклассы - это случаем не OLE/COM-приблуда? Я называю коклассом класс, реализующий данный интерфейс. Извини, попутал тебя. |