Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Открыть новую тему     Написать ответ в эту тему

valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL

Цитата:
Я использую интерфейсы в том числе и для того, чтобы ослабить связь между частями проекта

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

Цитата:
управляемого не тобой, не так ли?

Отчего же - ты имеешь доступ к счетчику ссылок, можешь им рулить как вздумается. Компилятор просто автоматизирует это, в отличии от GC управляемых сред. То же самое мы имеем с интерфейсами, строками и дин.массивами.
 

Цитата:
Впрочем концепцию strong vs weak link  я бы не назвал простой, тем более что weak link, как я понял, может указывать на что попало. Так что будут и залоченные в памяти взаимно ссылающиеся объекты, и попытки дерефенса освобожденной памяти.

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

Цитата:
А если нужно запихнуть ссылку на объект в Pointer или NativeInt?   Такая магия бывает необходима, скажем, для WinApi, или TVirtualDrawTree. Логика работы ARC в этом случае может быть еще сложнее, чем в обычном случае: сначала нужно сделать явный инкремент, а потом всюду следить,чтобы нигде не произошел неявный декремент

Как ты там говорил... Изволь соответствовать? Так вот разговоры о неявном декременте меня удивляют.
 

Цитата:
ARC это благо, если нам дадут выбор, где и как его использовать. А насильно навязанный ARC - мне не нужен, я против. Я хочу _полной обратной совместимости

Пока, вроде, и получается полная обратная совместимость, за исключением случаев взаимных ссылок объектов. А если везде расставить атрибут [weak] будет совсем полная Хотя, я согласен, что такие радикальные изменения должны быть по меньшей мере отключаемыми.
 
Добавлено:
HeMet

Цитата:
"не используйте это в своем коде - оно не для вас" (вольный перевод: "Class and record helpers provide a way to extend a type, but they should not be viewed as a design tool to be used when developing new code."),  

Это слишком уж вольный перевод Оно вообще о другом.
 

Цитата:
А разрабам Delphi потом тяни лямку

То есть это нормально, когда языковая фича описывается в доке, но нихрена не работает как должна, судя по той же доке?

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 10:09 11-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про ЭМРО, Qt и LGPL, мое имхо.
 
Во-первых, мне не ясно как бы они дружили Дельфи с C++ фреймворком. Возможности прозрачно расширять классы фреймворка не будет, если не сделать полную совместимость с объектной моделью C++, а ее сделать сложно (множественное наследование?).  Был бы такой же слабый interop как у XE4 c iOS: все вижу, на сделать ничего толком не могу, или сложно сделать. То есть, динамическое линкование forever! В этом смысле FMX был все таки native pascal, с ним из паскаля работать на порядки удобнее: родная классовая модель, прозрачное расширение классов, легкая передача объектов туда-сюда, нет заморочек с менеджерами памяти!
 
Во-вторых, Qt всегда бы осталась публичной, не было бы контроля над кодом, он не был бы собственностью ЭМРО. А у FMX был плюс, что его можно было купить!  
 
П.С. Я не вижу никаких лицензионных проблем в использовании LGPL фреймворка с коммерческим софтом, но вот все изменения во фреймворке прийдется также делать открыто и под LGPL.

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 10:45 11-06-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Это слишком уж вольный перевод  Оно вообще о другом.  

Предназначены для расширения типов, но не должны рассматриваться, как средство проектирование новой архитектуры.
Судя по исходникам ЭМБ решила им следующие проблемы: расширение VCL без полной его переделки, вспомогательный функционал для некоторых записей и методы для простых типов, чтобы они косили под объекты. Т.е. малой кровью лечили недостатки своей долгоживущей кодовой базы. Вероятно, с рассчетом на краткосрочную или среднесрочную перспективу, пока в языке не появятся более адекватные средства. Мне так кажется.

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 11:11 11-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks

Цитата:
Во-первых, мне не ясно как бы они дружили Дельфи с C++ фреймворком

Ну как... Делать полные обертки в виде классов, как делается для Win32.
 

Цитата:
А у FMX был плюс, что его можно было купить!  

И в результате не оставить камня на камня от старого кода
 
HeMet

Цитата:
Предназначены для расширения типов, но не должны рассматриваться, как средство проектирование новой архитектуры

Именно так. Дизайн редко бывает идеальным, поэтому очень здорово иметь возможность расширить функционал используемых типов - это ли не енд-юзерская фича...
 

Цитата:
Судя по исходникам ЭМБ решила им следующие проблемы: расширение VCL без полной его переделки

Когда они появились - ни в RTL ни в VCL не использовались вообще.

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 14:03 11-06-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HeMet

Цитата:
Пользователи могут извращаться на тысячу и один лад, вплоть до использования трижды упразднённого object, потому что инструмент, который они не должны были использовать не работает так, как им хочется.  
 
Да! Я могу все что хочу, и хочу все что могу!  
Я хочу использовать old objects, индексировать массивы при помощи (. .)

Код:
 
vector(.ix.):=1//ВОТ ТАК!
 

использовать наследование record helper, поля automated и диспетчирезацию методов по dispId. Потому что это мое наследие, наследие всех, кто однажды полюбил TP или Delphi.
И мне не нравится, если приходят всякие баблорубы, и начинают говорить: "вот это мы изменим, вот это упраздним, будет все как у всех".  Когда я слышу это, мне хочется кого-нибудь убить.
 
А сейчас как раз такие веяния. Пришли новые люди в команду компилятора, запудрили мозги тупым менеджерам, и без пиетета начинают все менять. Immutable strings, ARC - причем принудительно. А что будет сломана совместимость с кодом, написанным десять лет назад - что им до того? Это поколение ушибленное додНЕТ.
 

Цитата:
 
А разрабам Delphi потом тяни лямку.
да! тянуть лямку. А что, мордой салат в корпоративах?  
 
Или тратить деньги, которые сгенерировал десктопный Дельфи, закапывая их на поле чудес, в стране дураков (как делали тупые менеджеры Borland с app lifecycle management, или не менее тупые из эмбы с ее аппстором)?
 

Цитата:
 
Предназначены для расширения типов, но не должны рассматриваться, как средство проектирование новой архитектуры.  

вот то-то же! Я писал приложение, где нужно было установить расширенный доступ к DDL sql-codegen dbExpress (на С++ Builder). Там такой говнокод под капотом, что его наследованием не расширить, и если бы не helpers и доступ к приватным полям и методам, пришлось бы модифицировать стандартный код, что, разумеется нежелательно.
 Хелперы - мощное средство в умелых руках. Низкоуровневое, да. Но порой необходимое как воздух. И оно было бы мощнее, если бы поддерживалось наследование (не только для class, но и для простых типов).
 
valgreesh

Цитата:
Я ничего сложного в концепции ссылок не вижу, и они уж точно не призваны решать проблемы кривых рук.  
Но выглядит именно так. Придут кодеры, покалеченные Доднедом, и начнут говнокодить... А подтирать за ними некому(нет GCC), лишь иллюзия безопасности.  
 

Цитата:
Пока, вроде, и получается полная обратная совместимость, за исключением случаев взаимных ссылок объектов. А если везде расставить атрибут [weak] будет совсем полная
во-первых, какая полная? Ты вообще в курсе, как в нетривиальном коде все может обстоять? Мы не университетской аудитории, это wild-wild-world, там такая может быть "грязная" арифметика указателей, что только держись.  
Но все при этом вылизано, код весьма функционален и полезен, прекрасно работает. И, ВНЕЗАПНО, перестанет! Ты в курсе, еще раз спрошу, как трудно выловить баги, связанные с двойным освобождением памяти?  
 
А [weak] следует пристрелить просто за использование скобок, чертова безвкусица. И я дожен везде его расставлять? В ж""у это уродство!  И что вообще гарантирует weak? Раньше мы контролировали явно всемя уничтожения объекта. Теперь, значит - не будем, верно? Ведь в сложной системе трудно предсказать, когда разрешится последняя ссылка.
 
Так что [weak] практически бесполезен для идеологии ARC, поскольку это гарантированный способ прострелить себе ногу:  [weak]  указатель должен ссылатся на объект, время жизни которого явно тобой контролируется, либо нужно явно контролировать время жизни самого указателя.

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 15:23 11-06-2013 | Исправлено: AlekXL, 15:25 11-06-2013
VitaliM



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
deks
HeMet
valgreesh
AlekXL
и другие.
 
Блин! Как интересно Вас читать!  
Я серьезно.

Всего записей: 2184 | Зарегистр. 12-01-2005 | Отправлено: 15:34 11-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Судя по исходникам ЭМБ решила им следующие проблемы: расширение VCL без полной его переделки

 
в этом есть проблема: это костыли. В следующий раз придется расширять не только библиотеку, но и костыли. хелперы для хелперов ?
 

Цитата:
как трудно выловить баги, связанные с двойным освобождением памяти?    

что именно трудно ? найти где и почему уничтожился в первый раз? но это уже кривихна архитектуры, кто владелец в какой момент времени. Хотя от этого не легче...
 

Цитата:
Ведь в сложной системе трудно предсказать, когда разрешится последняя ссылка.

ты про RAII типа монопольного tfilestream ? для этого они ввели финалайзер - .DisposeOf
 
Хотя я согласен, что если им нжен был ARC, чем корёжить сущиствующий RTL надо было построить параллельный на TInterfacedObject...
 

Цитата:
все изменения во фреймворке прийдется также делать открыто и под LGPL.

т.е. проблема только в менталитете начальников ЭМБы.
 

Цитата:
мне не ясно как бы они дружили Дельфи с C++ фреймворком

Не Qt'ом единым.
 

Цитата:
тем более что weak link, как я понял, может указывать на что попало

Нет, они обнуляются автоматически, как в ObjC ARC
 
Что тоже доставит много радости ламерам, любящим писать простыни
 
DataModule1.Query10.FieldByName('asaas').DataKind := ...
DataModule1.Query10.FieldByName('asaas').DisplayName := ...
DataModule1.Query10.FieldByName('asaas').OnGetText := ...
 
И когда в середине этакой фигни Query10 "внезапно" станет Nil будет смешно

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 18:57 11-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AlekXL

Цитата:
Придут кодеры, покалеченные Доднедом, и начнут говнокодить

А придут ли...
 

Цитата:
Ты вообще в курсе, как в нетривиальном коде все может обстоять? Мы не университетской аудитории, это wild-wild-world, там такая может быть "грязная" арифметика указателей, что только держись

Если под "грязной арифметикой" не подразумевать говнокод вида:

Код:
 
obj := TObject.create;
nativeInt(obj) := 0;
 

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

Цитата:
Но все при этом вылизано, код весьма функционален и полезен, прекрасно работает. И, ВНЕЗАПНО, перестанет!

Да не волнуйся ты так, ARC работает только на мобильных платформах, в классическом компиляторе его нет и не известно будет ли вообще.
 

Цитата:
 Ты в курсе, еще раз спрошу, как трудно выловить баги, связанные с двойным освобождением памяти?

Так я же сказал, что ARC не решает проблему кривизны рук. Если код допускает такие ситуации, нефига на компилятор пенять.
 

Цитата:
И что вообще гарантирует weak?

Слабая ссылка позволяет ссылаться на объект без увеличения счетчика ссылок.
 

Цитата:
 Раньше мы контролировали явно всемя уничтожения объекта. Теперь, значит - не будем, верно? Ведь в сложной системе трудно предсказать, когда разрешится последняя ссылка

Неверно. Старый код должен без проблем работать под ARC если разрулить взаимные ссылки (через [weak], указателями, да вообще как угодно). ARC точно так же позволяет контролировать и управлять временем жизни объекта, как это делается с интерфейсами. Отличие ARC от GC в том и заключается, что работа ARC полностью детерминирована и мы всегда знаем когда умрет объект, при условии нормальной архитектуры и отсутствия кучи глобальных переменных "на всякий случай" - т.е. типичного говнокода.
 

Цитата:
Так что [weak] практически бесполезен для идеологии ARC

ARC невозможен без слабых ссылок.
 
Arioch1

Цитата:
ты про RAII типа монопольного tfilestream ? для этого они ввели финалайзер - .DisposeOf

Напрасно ты используешь терминологию управляемой среды. У финалайзеров совсем другая семантика.

Цитата:
Хотя я согласен, что если им нжен был ARC, чем корёжить сущиствующий RTL надо было построить параллельный на TInterfacedObject...

Так оно же и так практически эквивалентно. TInterfacedObject под ARC'ом стал тупой оберткой над механизмом подсчета ссылок TObject.
 

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 21:55 11-06-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я хочу использовать old objects, индексировать массивы при помощи (. .)

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

Цитата:
использовать наследование record helper, поля automated и диспетчирезацию методов по dispId.

With тройной вложенности и absolute вместо приведения типа, прямое обращение к портам ввода-вывода и обработка прерываний в прикладном коде. Динамическая диспетчеризация под COM затачивалась, пусть там и остается.
 

Цитата:
Потому что это мое наследие, наследие всех,  

Может мне тоже вспомнить про моё TP-«наследие» со школьной скамьи? Вообще, это называется древний, дремучий код, но «наследие» определённо звучит красивее.
 

Цитата:
кто однажды полюбил TP или Delphi.

Любите дальше: ставьте DOS на виртуалку, туда TP и ностальгируйте сколько угодно, а в современном языке таких выкрутасов не надо.
 

Цитата:
Когда я слышу это, мне хочется кого-нибудь убить.

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

Цитата:
А сейчас как раз такие веяния. Пришли новые люди в команду компилятора, запудрили мозги тупым менеджерам,

 Программисты, под чью дудку пляшут менеджеры — это что-то новое.
 

Цитата:
Immutable strings

 
Нету их ещё и не будет, пока не будет доказана их исключительная полезность. Даже под iOS это COW-строки. То ли народ ничего не читает, то ли у ЭМРО талант свои намерения подавать самым поганым образом.
 

Цитата:
ARC - причем принудительно.  

Он на iOS везде. Ругать iOS-ный компилятор за то, что там везде ARC. Это всё равно, что ругать виндовый за то, что у него весь COM на интерфейсах.  
 

Цитата:
А что будет сломана совместимость с кодом, написанным десять лет назад - что им до того?

Они его как раз вводят таким образом, что бы старый код работал без видимых отличий и переписываний. Разница проявится в особых случаях: например, когда убивается объект, на который есть ссылки из других частей программы.  
Под десктопам это приводит к висячим-указателям (dangling pointer), когда не понятно жив пациент или уже нет. А там и двойное высвобождение памяти подоспевает или использование мертвого объекта, короче говоря, бомбы замедленного действия.
В случае ARC объект просто будет жить до тех пор пока на него не пропадут ссылки, либо до конца программы. Если ссылка была на какой-нить файл или типа того, это плохо, но код, который до этого довел, в любом случае, хуже.
Проблемы висячих указателей с ARC тоже нет: свойство Disposed однозначно указывает на состояние объекта.
 

Цитата:
Это поколение ушибленное додНЕТ.

Не путайте, в .NET сборщик мусора (недерминированный механизм), а ARC - это, по сути, то, что сейчас используется для интерфейсов, динамических массивов и строк.
 

Цитата:
А что, мордой салат в корпоративах?  

Пусть лучше среду развивают, а не древности стерегут.
 

Цитата:
Там такой говнокод под капотом, что его наследованием не расширить, и если бы не helpers и доступ к приватным полям и методам, пришлось бы модифицировать стандартный код, что, разумеется нежелательно.

Вы того же самое могли получить, скопировав себе файлы в папку проекта и поправив там, что нужно. Правда, правки были бы не отделимы от остального кода. С другой стороны у хелперов есть неслабый минус: нельзя просто так перекрыть непубличный метод - нужно ещё и перекрыть публичные, которые к нему ведут. Я на это напоролся, когда правил TPathData из FMX: пришлось в хелпер пихать то, что совсем туда пихать не хотелось. В итоге сделал, как написал выше.
 

Цитата:
Придут кодеры, покалеченные Доднедом, и начнут говнокодить...

И чем их говнокод хуже говнокода с old objects, absolute вложенными with и прочим? Тем что он не «родной»?
 

Цитата:
Ты вообще в курсе, как в нетривиальном коде все может обстоять? Мы не университетской аудитории, это wild-wild-world, там такая может быть "грязная" арифметика указателей, что только держись.  

 
Вы ругаетесь на говнокод от дотнетчиков, а сами пишите про «нетривиальный код», который, видимо, написан из расчета, что каждый кто к нему прикоснулся должен страдать. Считай, что в лоб, что по лбу.
 

Цитата:
Ты в курсе, еще раз спрошу, как трудно выловить баги, связанные с двойным освобождением памяти?  

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

Цитата:
А [weak] следует пристрелить просто за использование скобок, чертова безвкусица.

Он — атрибут, они все в скобках. Но лучше бы сделали ключевым словом.
 

Цитата:
И я дожен везде его расставлять?

Не надо его везде расставлять. Они нужны только там, где иначе будут циклические ссылки, либо там где доступность ресурса не обязательна (аля кнопка и TAction).
 

Цитата:
В ж""у это уродство!

Вы и так полно уродства описали, чем Вас это так напрягло?
 

Цитата:
Ведь в сложной системе трудно предсказать, когда разрешится последняя ссылка.  

Только если в ней ссылки на конкретный объект расползаются чёрт знает куда.
Тут два варианта:
1. Объект всем нужен - ARC сохранит его до тех пор пока он кому-то нужен, а потом замочит.
2. Анти-шаблон «Плюшкин»: хватаем всё что мимо пробегает и ни за что не отпускаем. Косяк в архитектуре: используем слабые ссылки. Без ARC это бы привело либо к утечкам памяти, либо к висячим указателям и двойной очистке памяти.
 

Цитата:
Так что [weak] практически бесполезен для идеологии ARC

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

Цитата:
либо нужно явно контролировать время жизни самого указателя.

Что ARC и делает, когда обнуляет слабые ссылки на очередной убитый объект.
 

Цитата:
Да! Я могу все что хочу, и хочу все что могу!  

А я не хочу поддерживать код, который написан под таким лозунгом.

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 22:07 11-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
 absolute вместо приведения типа

а есть в Дельфи хоть один другой метод приведения типов, удовлетворяющий DRY, т.е. не дублирующий ни приведение ни - временные переменные - значение ?
 
if x is Txxx then (x as Txxx).dddd - за каким хреном тут as нужен? что за идиотизм?
 
Приведение типов в Дельфи непрактичное.
 
Добавлено:

Цитата:
Да не волнуйся ты так, ARC работает только на мобильных платформах, в классическом компиляторе его нет и не известно будет ли вообще.

 
тем хуже. тем больше лукавства в якобы одной Delphi для десктопа и мобильных платформ.
 
Добавлено:

Цитата:
Так оно же и так практически эквивалентно.

 
вот именно, и получили две одинаковых сущности с раными названиями, за каким чертом непонятно
 
надо изначално было ввести [weak] в TInterfacedObject и танцевать ARC от него, а не перекраивать базовую модель TObject

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 23:14 11-06-2013
X11



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
if x is Txxx then (x as Txxx).dddd - за каким хреном тут as нужен? что за идиотизм?  

а так
if x is Txxx then Txxx(x).dddd

Всего записей: 3253 | Зарегистр. 24-11-2005 | Отправлено: 23:34 11-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
и то и другое одинаково нарушают DRY
 
второе к тому же опаснее для будущей возможной переделки типов или для копипаста с другими классами, если строится лесенка типа
 
if t is Txxxx then...
if t is Tyyyy then...
if t is Tzzzz then Txxxx(t).ddddd

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 23:37 11-06-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
и то и другое одинаково нарушают DRY

А как надо?

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 00:11 12-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у absolute есть на мой вкус два недостатка.
 
1) это вообще не там объявляется. Это должно быть не в типе, а в переменной. Как в других паскалях

Код:
 var XXX origin YYY: TTTT;  

2) желательно иметь absolute менее безбашенный, например с аналогом проверки типов as
 
Зато у него есть преимущества
 
1) он объявляется в начале функции, ты сразу видишь что используются преобразования и к этому месту надо приложить больше внимания
2) он объявяется однажды. Если надо потом что-то переделать - как угодно: сделать отдельную переменную, изменить исходный тип, изменить новый ти - это делается в одном централизованном месте. Нельзя что-то забыть изменить или неправильно изменить в остальном коде, потому что все "хакерство" централизовано в одном месте.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 00:36 12-06-2013
valgreesh



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1

Цитата:
 тем больше лукавства в якобы одной Delphi для десктопа и мобильных платформ

Для прикладного кода разница и правда невелика.
 

Цитата:
получили две одинаковых сущности с раными названиями, за каким чертом непонятно

Совсем даже не одинаковые - TInterfacedObject реализует IInterface.
 

Цитата:
if x is Txxx then (x as Txxx).dddd - за каким хреном тут as нужен? что за идиотизм?

А он тут и не нужен. As нужен там где отсутствует проверка типа.
 
Arioch1
HeMet
Без absolute обойтись можно всегда, но эта конструкция избавляет от кода вроде:
Код:
TOtherType((@VarOfAnyType)^)
и это благо т.к. читается такой код не очень легко, мягко говоря

Всего записей: 292 | Зарегистр. 30-11-2011 | Отправлено: 01:11 12-06-2013 | Исправлено: valgreesh, 01:14 12-06-2013
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1

Цитата:
if x is Txxx then (x as Txxx).dddd - за каким хреном тут as нужен? что за идиотизм?

Что, в других языках софткаст к типу не нужен? ... Интересно.
 
Добавлено:

Цитата:
у absolute есть на мой вкус два недостатка.

Absolute - это наложение, а не каст. Не там объявляется? Какая ещё проверка как у as при наложении? .. мда, отборный бред ...
 
К чему вся эта каша из головы? Опять народу мозги пудрим?

Всего записей: 767 | Зарегистр. 18-05-2009 | Отправлено: 09:44 12-06-2013 | Исправлено: Eternal_Shield, 09:47 12-06-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Что, в других языках софткаст  

 
Component Pascal: if var is type - уже софткаст.
 

Цитата:
Absolute - это наложение, а не каст.

И иногда это мешает им пользоваться.
Если бы был именно тайпкаст, централизованный в начале функции как absolute - это было бы здорово.
 

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 12:38 12-06-2013
Eternal_Shield

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1

Цитата:
Component Pascal: if var is type - уже софткаст.

...
 

Цитата:
И иногда это мешает им пользоваться.

Примеры в студию или личку
 

Цитата:
тайпкаст, централизованный в начале функции как absolute

Не ясно что имеется ввиду вообще. Разговор за begin инициализатор в методе чтоли?
 
 

Всего записей: 767 | Зарегистр. 18-05-2009 | Отправлено: 16:11 12-06-2013 | Исправлено: Eternal_Shield, 16:11 12-06-2013
deks



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очередной раз про "удачный" RTL Дельфи.
 
Ну, коллеги - хоть кто то может мне сказать, почему у классов из System.Generics.Collections (например, TObjectList <T>) все методы - не виртуальные?! То есть я не могу их переопределить, чтобы добавить нужное мне поведение! Ну вот какая логика-то в этом была, когда это делали?

Всего записей: 857 | Зарегистр. 09-10-2003 | Отправлено: 15:48 13-06-2013
RuXandr

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
... а есть в Дельфи хоть один другой метод приведения типов, удовлетворяющий DRY, т.е. не дублирующий ни приведение ни - временные переменные - значение ?  
if x is Txxx then (x as Txxx).dddd - за каким хреном тут as нужен? что за идиотизм? ...  


Цитата:
... а так  if x is Txxx then Txxx(x).dddd ...  


Цитата:
... и то и другое одинаково нарушают DRY ...

 
Вобщем задался вопросом и правда, а как ???  
Решение, которое нашел, конечно далеко не идеальное, но от ошибок избавляет:  
 
Обобщенный тип:

Код:
 
type
 
  TCast<T: class> = record
      class function Check(Src: TObject; out Dst: T): Boolean; static; inline;
  end;
 
....
 
class function TCast<T>.Check(Src: TObject; out Dst: T): boolean;
begin
  Result := Src is T;
  if Result then
    TObject(Dst) := Src;
end;
 

Пример использования:

Код:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  btn: TButton;
begin
  if TCast<TButton>.Check(Sender, btn) then
    btn.Caption := 'ok';
end;
 

Всего записей: 96 | Зарегистр. 13-10-2009 | Отправлено: 18:13 13-06-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE4


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru