Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
ВнизВстречаем Record Helper Найти похожие ветки
← →
oxffff © (2007-03-11 13:30) [0]Согласно
http://forum.ixbt.com/topic.cgi?id=26:33495-8
и
http://forum.sources.ru/index.php?showtopic=143384
Можно объявлять и Record Helper.
Помощь молчит по этому поводу.
← →
oxffff © (2007-03-11 13:31) [1]Вот пример.
(C) Взято из http://forum.ixbt.com/topic.cgi?id=26:33495-8
TRectHelper = Record Helper For TRect
Function GetWidth : Integer; Inline;
Function Getheight : Integer; Inline;
Property Width : Integer Read GetWidth;
Property Height : Integer Read GetHeight;
End;
← →
Kerk © (2007-03-11 13:55) [2]Ну и бредятина
← →
oxffff © (2007-03-11 14:05) [3]
> Kerk © (11.03.07 13:55) [2]
> Ну и бредятина
?
Поясни
← →
Kerk © (2007-03-11 14:09) [4]> [3] oxffff © (11.03.07 14:05)
Нафига такие извраты? Тогда б уж object не убирали
← →
oxffff © (2007-03-11 14:19) [5]
> Kerk © (11.03.07 14:09) [4]
> > [3] oxffff © (11.03.07 14:05)
>
> Нафига такие извраты? Тогда б уж object не убирали
Кстати и все таки есть плюс. Как я не противился в других ветках.
Что касаемо реализации.
Object мог запутать.
Поскольку к нему можно было применить Typeof для получения VTB.
А виртульные методы в record не объявишь.
Это удобная настройка над TRect. Тот же scope.
Вместо того чтобы
function Width(Rect:Trect):integer;
пишешь rect.Width, что в принципе удобно.
Поскольку тот же scope и псевдо-методы классифицируются.
Хотя дело вкуса.
← →
Аноним (2007-03-11 18:00) [6]
> Kerk ©
Ты не прав. Штука действительно классная. Другое дело, что компилятор таки глючит на многих новых расширениях синтаксиса, в том числе и на рекорд-хелперах.
← →
Суслик © (2007-03-11 18:31) [7]я бросил несколько репортов 2 дня назад о том, что это недокументировано.
> Ты не прав. Штука действительно классная. Другое дело, что
> компилятор таки глючит на многих новых расширениях синтаксиса,
> в том числе и на рекорд-хелперах.
а чтобы компилтор не глючил нужно репорты писать.
-------
кстати в новой версии очень неплохо пофиксили ошибки, связанные с advanced records. Самая мерзкая - что нельзя было вызывать метод у записи, которая возвращена в результате функции:
getRecord().SomeMethod().
очень часто (не всегда) это приводит к internal error с1624.
← →
jack128 © (2007-03-11 20:34) [8]oxffff © (11.03.07 13:30)
Можно объявлять и Record Helper.
И можно было объявлять с момента выхода D2006
← →
Игорь Шевченко © (2007-03-11 20:41) [9]А нафига ?
Мне кто-нибудь может объяснить, в чем полезность этой фичи ?
← →
просто так (2007-03-11 21:07) [10]моск отцов из борланд плодит "гениальные" идеи
← →
oxffff © (2007-03-11 21:28) [11]
> jack128 © (11.03.07 20:34) [8]
> oxffff © (11.03.07 13:30)
> Можно объявлять и Record Helper.
> И можно было объявлять с момента выхода D2006
Но help про них умалчивает.
← →
Petr V.Abramov (2007-03-11 23:55) [12]> oxffff © (11.03.07 21:28) [11]
если хелп умалчивает, это может значить одно из:
1. нельзя
2. потом не жалуйся
← →
Юрий Зотов © (2007-03-12 00:01) [13]> Игорь Шевченко © (11.03.07 20:41) [9]
> в чем полезность этой фичи ?
ИМХО, в том же, в чем и хелперов классов. Положим, я юзаю некую библиотеку, в которой используется некий Record. Но мне по каким-то причинам требуется расширить его функциональность. Пишу хелпер.
← →
oxffff © (2007-03-12 00:03) [14]
> ИМХО, в том же, в чем и хелперов классов. Положим, я юзаю
> некую библиотеку, в которой используется некий Record. Но
> мне по каким-то причинам требуется расширить его функциональность.
> Пишу хелпер.
Прошу вас в соседнию ветку
Вот завел себе блог (Суслик 12.03.07 00:02)
← →
Игорь Шевченко © (2007-03-12 00:06) [15]Юрий Зотов © (12.03.07 00:01) [13]
процедуру напиши
← →
oxffff © (2007-03-12 00:07) [16]
> Игорь Шевченко © (12.03.07 00:06) [15]
> Юрий Зотов © (12.03.07 00:01) [13]
>
> процедуру напиши
Нет helper
:)
← →
Юрий Зотов © (2007-03-12 00:09) [17]> Игорь Шевченко © (12.03.07 00:06) [15]
Тогда и ООП на фиг не нужно. Любую программу можно написать и на процедурном подходе - но иногда ООП позволяет сделать это проще и удобнее. То же и здесь.
← →
Юрий Зотов © (2007-03-12 00:12) [18]> oxffff © (12.03.07 00:03) [14]
Я там был. Ну да, возможны баги - ну и что? Одно дело - принципиальная возможность, другое - баг в ее реализации.
← →
oxffff © (2007-03-12 00:16) [19]
> Юрий Зотов © (12.03.07 00:12) [18]
> > oxffff © (12.03.07 00:03) [14]
>
> Я там был. Ну да, возможны баги - ну и что? Одно дело -
> принципиальная возможность, другое - баг в ее реализации.
>
В этой ветки уже обсуждают целесообразность применения
class helper
← →
Игорь Шевченко © (2007-03-12 00:20) [20]Юрий Зотов © (12.03.07 00:09) [17]
> Тогда и ООП на фиг не нужно.
А что ООП - это жупел что ли ? Или серебряная пуля ? Вовсе нет.
Юра, покажи мне пример, когда helper для record"а будет проще и удобнее, чем процедура, работающая с этим рекордом.
Вот честное слово, интересно мне.
← →
Юрий Зотов © (2007-03-12 00:22) [21]Вдогонку. Честно говоря, я вообще не вполне понимаю, зачем понадобились рекорды с методами. По сути, это статические объекты - и уж если в них возникла нужда, так не проще было ввести что-то вроде описателя static:
type
TMyClass = class(...)
...
end;
var
MyClass: TMyClass; static;
И все. Компилятор просто строит код создания объекта при входе в область видимости переменной MyClass его автоматического убиения при выходе из этой области. Остальное (VMT, RTTI и пр.) - не меняется.
← →
oxffff © (2007-03-12 00:26) [22]
> Юрий Зотов © (12.03.07 00:22) [21]
> Вдогонку. Честно говоря, я вообще не вполне понимаю, зачем
> понадобились рекорды с методами. По сути, это статические
> объекты - и уж если в них возникла нужда, так не проще было
> ввести что-то вроде описателя static:
>
> type
> TMyClass = class(...)
> ...
> end;
>
> var
> MyClass: TMyClass; static;
>
> И все. Компилятор просто строит код создания объекта при
> входе в область видимости переменной MyClass его автоматического
> убиения при выходе из этой области. Остальное (VMT, RTTI
> и пр.) - не меняется.
Зачем так усложнять. Перегружаешь NewInstance и FreeInstance.
В куче выделяешь псевдо стек. И свой esp в переменной.
← →
Юрий Зотов © (2007-03-12 00:28) [23]> Игорь Шевченко © (12.03.07 00:20) [20]
> А что ООП - это жупел что ли ?
Не жупел. Никто этого и не говорил. Просто еще один инструмент, для ряда задач более удобный, чем другие - только и всего.
> пример, когда helper для record"а будет проще и удобнее, чем процедура,
> работающая с этим рекордом.
Инкапсуляция, Игорь. Код лучше структурируется, легче читается и т.д. А пример ты и сам легко напишешь.
← →
oxffff © (2007-03-12 00:30) [24]>Вдогонку. Честно говоря, я вообще не вполне понимаю, зачем
> понадобились рекорды с методами. По сути, это статические
> объекты
Естественно ноги растут из .NET struct c методами и интерфейсами. Только понятно, что в самой области памяти занимаемой структурой нет никаких сслылок аля всех тех которые по отрицательному смещению от VTB.
Да и не нужны они, поскольку нет наследования для структур. Поэтому тип известен на этапе компиляции и однозначно можно вызвать метод или получить интерфейс для этого типа.
← →
Petr V.Abramov (2007-03-12 00:31) [25]> Юрий Зотов © (12.03.07 00:28) [23]
Юр, а какова, на твой взгляд, принципиальная разница между объектом и рекордом с мЕтодами? На мой взгляд, фигней люди занимаются.
← →
Юрий Зотов © (2007-03-12 00:32) [26]> oxffff © (12.03.07 00:26) [22]
Имелось в виду - на уровне языка. Ручками-то, яснь пень, можно сделать что угодно - но уж если разработчикам вдруг захотелось ввести в сам язык статические объекты - так зачем было делать их именно на базе record? Вот это непонятно.
← →
Petr V.Abramov (2007-03-12 00:33) [27]> oxffff © (12.03.07 00:30) [24]
не видел [24], пока писАл :)
← →
oxffff © (2007-03-12 00:35) [28]To Юрий Зотов ©
Зачем record VMT ведь наследования нет.
← →
Petr V.Abramov (2007-03-12 00:38) [29]> Зачем record VMT ведь наследования нет.
Да люди, которые библиотеку разрабатывали, ушли или в другие места, или в запой. А которые компилятор делают - им до сих пор не надоело :)))
← →
Юрий Зотов © (2007-03-12 00:41) [30]> oxffff © (12.03.07 00:35) [28]
Не понял. Где я говорил про record VMT?
← →
Игорь Шевченко © (2007-03-12 00:41) [31]Юрий Зотов © (12.03.07 00:28) [23]
Так я в соседней ветке как раз об удобстве чтения ситуация вида Memo.Lines.DoWork и писал - неудобно, когда вдруг встречаются неожиданные методы.
← →
oxffff © (2007-03-12 00:46) [32]
> Не понял. Где я говорил про record VMT?
ОК. Я не правильно распознал контекст.
Что касаемо
> MyClass: TMyClass; static;
Тогда появиться конструктор по умолчанию.
Вообщем а у конструктора с параметрами не будет знать, как объекту выделена память.
Придется по мимо регистра dl, и флаг выделения памяти указывать.
Усложнится компилятор.
← →
oxffff © (2007-03-12 00:48) [33]Также и с деструктором.
dl и флаг выделения памяти.
← →
Юрий Зотов © (2007-03-12 00:50) [34]> Юрий Зотов © (12.03.07 00:28) [23]
Понятие "неожиданный" относительно. Дело документированности и привычки. Тебя же не смущает Memo.Lines.SaveToFile? Нет, потому что этот метод документирован, не раз тобой юзался и ты к нему привык. А поюзаешь какой-нибудь хелпер, так и Memo.Lines.DoWork тоже тебя не смутит.
ИМХО, хелперы - штука мощная. Фактически, позволяет сделать нечто вроде множественного наследования. Кому как, а мне далеко не раз не хватало чего-то подобного.
← →
oxffff © (2007-03-12 00:52) [35]>Фактически, позволяет сделать нечто вроде множественного наследования
Ancestor list - это опечатка. Только один helper родитель
← →
Юрий Зотов © (2007-03-12 00:56) [36][34] было ответом на [31].
> oxffff © (12.03.07 00:46) [32]
Само собой, появится. И компилятор тоже усложнится. Но, ИМХО, он усложнился бы меньше, чем если учить его работать с хитрыми рекордами.
А флаг выделения памяти - зачем? Есть точка входа в область видимости переменной - туда надо вставить код создания. Есть точка выхода из этой области - туда надо вставить код уничтожения. И все, никаких флагов. А обе точки компилятор и так определяет, так что не шибко-то он и усложняется.
← →
Petr V.Abramov (2007-03-12 00:59) [37]> ИМХО, хелперы - штука мощная. Фактически, позволяет сделать нечто вроде множественного наследования.
а почему бы не сделать множественное наследование, как у врагов?
а вот когда это "вроде" найдет отражение в батонокидательстве, тогда будет ПРИНЦИПИАЛЬНО новое.
А пока - ничего. Вот в MS студии сделали property binding - ниче нового, но это то, что руками делалось. А в d.net - ну чего такого, что принципиально скорость ПРИКЛАДНОЙ разработки повысит?
← →
Юрий Зотов © (2007-03-12 01:00) [38]> oxffff © (12.03.07 00:52) [35]
Тоже не понял.
← →
oxffff © (2007-03-12 01:03) [39]
> А флаг выделения памяти - зачем? Есть точка входа в область
> видимости переменной - туда надо вставить код создания.
> Есть точка выхода из этой области - туда надо вставить код
> уничтожения. И все, никаких флагов. А обе точки компилятор
> и так определяет, так что не шибко-то он и усложняется.
MyClass: TMyClass; static;
Конструктор вызывает classCreate, который выделяет память.
Поэтому у конструктора должна быть информация выделять память или нет для NonStatic и для Static объектов.
Только проблемы возникнут позже.
Static "переменной вы ничего не присвоите и ее присваивать придется тоже с осторожностью". Понятно почему?
← →
oxffff © (2007-03-12 01:07) [40]
> Юрий Зотов © (12.03.07 01:00) [38]
> > oxffff © (12.03.07 00:52) [35]
>
> Тоже не понял.
type
identifierName = class helper [(ancestor list)] for classTypeIdentifierName
memberList
end;
Страницы: 1 2 3 вся ветка
Форум: "Прочее";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.037 c