Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

Встречаем 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.033 c
6-1161682892
Tonich
2006-10-24 13:41
2007.04.08
TNMSMTP


2-1174219951
Chaser
2007-03-18 15:12
2007.04.08
Считывание строки в MemoryStream


15-1173772137
Ксандр
2007-03-13 10:48
2007.04.08
Простые числа


15-1173955310
@!!ex
2007-03-15 13:41
2007.04.08
3D изображение не на плоскости


2-1173782342
novill
2007-03-13 13:39
2007.04.08
Вопрос по созданию/уничтожению форм