Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];

Вниз

Методы класса или поля 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 2.438 c
1-1108561665
SeDOy
2005-02-16 16:47
2005.03.06
Чтение файлов с изменяющейся структурой


1-1108744682
TTR
2005-02-18 19:38
2005.03.06
Для чего нужно закрывать хэндл процесса в функции CreateProcess ?


11-1089774782
Денис
2004-07-14 07:13
2005.03.06
Перетаскивание на ноду


4-1102528255
lendasoft
2004-12-08 20:50
2005.03.06
Показать форму на втором мониторе


11-1092721240
Ал
2004-08-17 09:40
2005.03.06
Localizy





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский