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

Вниз

Методы класса или поля record а?   Найти похожие ветки 

 
HydraMarat   (2005-02-18 14:44) [0]

Вопрос почти флеймовый. Есть необходимость организовать массив, элементы которого имеют набор процедур, ну примерно как TMemoryManager. Так вот я это сделал record"ом, но там возникают всякие неудобства. Во-первых, постоянно надо использовать "^", а во-вторых неудобно сравнивать идентификаторы таких record"ов (набо использовать "@"). Так вот я подумал, может это выразить в виде классов, содержащих только методы класса? Как вы считаете? Или это коряво? Вопрос скорее организационного плана. Как все-таки принято?

Спасибо.


 
begin...end ©   (2005-02-18 14:46) [1]

> HydraMarat   (18.02.05 14:44)

> Во-первых, постоянно надо использовать "^"

Зачем?


 
HydraMarat   (2005-02-18 14:51) [2]

Потому как сам массив возвращает указатели на соответствующие record"ы... для скорости.


 
begin...end ©   (2005-02-18 14:52) [3]

> HydraMarat   (18.02.05 14:51) [2]

Если он возвращает типизированные указатели на record"ы, то ^ можно не использовать.


 
Digitman ©   (2005-02-18 14:54) [4]


> HydraMarat   (18.02.05 14:51) [2]
> Потому как сам массив возвращает указатели на соответствующие
> record"ы... для скорости.


что-то ты загнул ... явно малосуразное ... по кр.мере - навскидку ..

не сподобишься ли проиллюстрировать в коде ?


 
HydraMarat   (2005-02-18 14:58) [5]

Не понял. Есть класс, который имеем индексированное свойство, которое возврщает эти самые record"ы. Сами record"ы - куча констант, которые класс и вуалирует в виде массива. Непосредственно record"ы "видит" только класс, другие работают со свойством. Так разве я не теряю в скорости, если буду возвращать значение, а не указатель? (в функции read у свойства)


 
HydraMarat   (2005-02-18 15:05) [6]

примерный код:

interface

...

type
 PRec = ^TRec;
 TRec = record
   Proc: procedure;
   Func: function: Integer;
 end;

 TCl = class(TObject)
 private
   ...
   function GetItem(Index: Integer): PRec;
   ...
 public
   ...
   property Items[Index: Integer]: PRec read GetItem;
   ...
 end;

...

implementation

...

const
 Rec1: TRec = (Proc: Pr1; Func: Fn1);
 Rec2: TRec = (Proc: Pr2; Func: Fn2);

у функции вид убожеский, но это только для примера, на самом деле она не такая "тупая"
function TCl.GetItem(Index: Integer): PRec;
begin
 if Index = 0 then
   Result := @Rec1
 else if Index = 1 then
   Result := Rec2
 else
   raise ЛяЛяЛя...
end;

Ну примерно так... Внешние модули соответственно юзают так:

var
 Cl: TCl;
begin
 ...
 Cl.Items[0]^.Proc;
 ...
end;

Так вот, может чтоб с константами не мудится лучше все классами представить? По скорости по ходу все-равно ничего не потеряю, но вот ^ и @ не нужны будут...


 
HydraMarat   (2005-02-18 15:08) [7]

Ну у Rec2 в GetItem тоже естессно "собачка"...


 
begin...end ©   (2005-02-18 15:11) [8]

> HydraMarat   (18.02.05 15:05) [6]

Повторяю: при обращении к записи значок "^" можно убрать. Cl.Items[0]^.Proc --> Cl.Items[0].Proc.


 
HydraMarat   (2005-02-18 15:18) [9]

Ах да, я немного не о том подумал... такое разрешит, но все же... Сравнивать идентификаторы придется-то только @Rec1 = @Rec2. Конечно я этого не проверяю, но одним из параметров процедуры в record"е идет указатель на другой record. Так вот проверить какая это из констант можно только через "собачку" так? А может PRec Заменить на class of, а record заменить на class, а поля на методы класса? Меня здесь смущает использование классов без объектов, кажется корявым? Например, TMemoryManager и TVariantManager сделаны именно record"ами...


 
HydraMarat   (2005-02-18 15:32) [10]

Ну че? Еще мнения будут?


 
Sapersky   (2005-02-18 16:08) [11]

Заменить на class of, а record заменить на class, а поля на методы класса?

Сомневаюсь, что класс выдержит такое издевательство... разве что object ( TRec = object, "старопаскалевский" объект). Их можно считать "записями с методами" и обращаться соответственно.
Но это в том случае, если процедуры не изменяются программно - такого никакой объект не позволит с собой делать, ИМХО.

Cl.Items[0]^.Proc --> Cl.Items[0].Proc

А если указать свойству default, то ещё проще: Cl[0].Proc


 
HydraMarat   (2005-02-18 17:49) [12]

Ну я уж образно выразился! В-общем перевел все на классы, так мне гораздо проще. Уж больно часто приходится сравнивать идентификаторы и реализовывать множество однотипной логики. Я уже отвык это делать простыми процедурками (заколебываюсь искать что?где?как?), да все нужно с директивой forward (знаю, что можно избежать, но это опять же гемор). Так что всё теперь на классах.

Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.041 c
1-1108625387
JohnS
2005-02-17 10:29
2005.03.06
TWebBrowser


1-1108642246
Cosinus
2005-02-17 15:10
2005.03.06
Вопрос по правильному использованию ComponentCount и MDIChildCoun


3-1107500734
Mishenka
2005-02-04 10:05
2005.03.06
Глючит DbRichEdit


14-1108390461
Kubic
2005-02-14 17:14
2005.03.06
подскажите компанент


14-1108057467
juice
2005-02-10 20:44
2005.03.06
Как в BCB работать с процедурным типом?