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

Вниз

Вот завел себе блог   Найти похожие ветки 

 
pasha_golub ©   (2007-03-11 15:02) [120]


> jack128 ©   (09.03.07 21:16) [98]



> думаю многие хранили Integer в TList"е

Откуда ты узнал? :))


 
Eraser ©   (2007-03-11 15:19) [121]

> [117] euru ©   (11.03.07 02:13)

это всё конечно хорошо, но главное приемущество записи в том, что её можно просто взять и скопировать или сохранить куда-то, без помощи каких-то специальных методов самой записи. Не знаю правда можно ли так поступать с object"ами, но думаю что нет, вряд ли объекты можно плодить простым копированием. А насчет того, где выделяется память - это уже второй вопрос, частенько и под записи (и осоенно массивы заисей) память приходится выделять через GetMem.


 
oxffff ©   (2007-03-11 16:02) [122]


> Теперь разработчики добавляют для типов record возможность
> определения в них методов обработки (конъюнктурное решение,
>  вызванное, я так понимаю, поддержкой в Delphi технологии
> .Net). Но раз уже использовалась такая возможность в типах
> object, почему бы не перенести всю функциональность object
> на record (раз уж они с таким упорством открещиваются от
> object), сделав record более гибким, чем в C#. А object
> могли бы обозвать синонимом record в целях обратной совместимости.
>


Object мог запутать.
Поскольку к нему можно было применить Typeof для получения VTB.
А виртульные методы в record не объявишь.


 
oxffff ©   (2007-03-11 16:07) [123]


> Eraser ©   (11.03.07 15:19) [121]
> > [117] euru ©   (11.03.07 02:13)
>
> это всё конечно хорошо, но главное приемущество записи в
> том, что её можно просто взять и скопировать или сохранить
> куда-то, без помощи каких-то специальных методов самой записи.
>  Не знаю правда можно ли так поступать с object"ами, но
> думаю что нет, вряд ли объекты можно плодить простым копированием.
>  А насчет того, где выделяется память - это уже второй вопрос,
>  частенько и под записи (и осоенно массивы заисей) память
> приходится выделять через GetMem.


В system.pas

Compiler magic

procedure       _ObjCopy;

Правда по коду явно не глубокое копирование, как прочем и у record.


 
euru ©   (2007-03-11 16:36) [124]


> Eraser ©   (11.03.07 15:19) [121]
> главное приемущество записи в том, что её можно просто взять
> и скопировать или сохранить куда-то, без помощи каких-то
> специальных методов самой записи. Не знаю правда можно ли
> так поступать с object"ами, но думаю что нет, вряд ли объекты
> можно плодить простым копированием.
Как раз object (в отличие от class) можно копировать так же, как и record.


 
jack128 ©   (2007-03-11 20:43) [125]

Опс. Пропустил ответ:
Игорь Шевченко ©   (09.03.07 17:04) [38]
Какие предки и потомки у helper"ов ? Каждый helper является равноправным.


Из хелпа Turbo Delphi
The syntax for declaring a class helper is:
type
  identifierName = class helper [(ancestor list)] for classTypeIdentifierName
    memberList
  end;
The ancestor list is optional.
A class helper type may not declare instance data, but class fields are allowed.


 
Игорь Шевченко ©   (2007-03-11 20:49) [126]

jack128 ©   (11.03.07 20:43) [125]

Во-первых, в твоем коде были равноправные хелперы.
Во-вторых, а не затруднит ли тебя объяснить физический смысл ancestor list в данном определении ?


 
vuk ©   (2007-03-11 20:56) [127]

Кстати. Почему они там написали именно "ancestor list" понять трудно. Наверное все-таки, как и у класса, должно быть "ancestorClass" А вот зачем хелперу предок - это понятно. Например, если есть желание расширить существующий хелпер...


 
Игорь Шевченко ©   (2007-03-11 21:00) [128]

vuk ©   (11.03.07 20:56) [127]


> Например, если есть желание расширить существующий хелпер.
> ..


Например каким образом ?


 
jack128 ©   (2007-03-11 21:03) [129]

Игорь Шевченко ©   (11.03.07 20:49) [126]
Во-первых, в твоем коде были равноправные хелперы.

Я потом исправился :-)
vuk ©   (11.03.07 20:56) [127]
Почему они там написали именно "ancestor list" понять трудно.

Ну например
vuk ©   (11.03.07 20:56) [127]
если есть желание расширить существующий хелперЫ...

;-)


 
vuk ©   (2007-03-11 21:04) [130]

to Игорь Шевченко ©   (11.03.07 21:00) [128]:
>Например каким образом ?
Издеваисся? :) Унаследовать хелпер от существующего и добавить нужную функциональность.


 
Игорь Шевченко ©   (2007-03-11 21:07) [131]

vuk ©   (11.03.07 21:04) [130]

Не вижу причины нафига это нужно.
Вот ей-богу, не вижу. Если хелпер содержит только набор методов и классовых свойств, нафига может потребоваться его расширять ?

Объясни бестолковому.


 
vuk ©   (2007-03-11 21:09) [132]

to jack128 ©   (11.03.07 21:03) [129]:
>Ну например
>vuk ©   (11.03.07 20:56) [127]
>если есть желание расширить существующий хелперЫ...
Дак у класса-то только один предок бывает... Хелпер-то, он тоже класс, хоть и специальный.


 
vuk ©   (2007-03-11 21:15) [133]

to Игорь Шевченко ©   (11.03.07 21:07) [131]:
>Если хелпер содержит только набор методов и классовых свойств, нафига
>может потребоваться его расширять ?
Ровно так же как с классами. Ну вот не хватило тебе функциональности в существующем хелпере. Не переписывать же хелпер с нуля только для того, чтобы добавить один-два метода?


 
jack128 ©   (2007-03-11 21:21) [134]

vuk ©   (11.03.07 21:09) [132]
Хелпер-то, он тоже класс, хоть и специальный.

Нет.  Он - не класс. Ну ни коем образом не класс. Хелпер - это просто сборник методов и ничего более.  Если те нужно объеденить 2 сборника в один - просто объявляешь наследника обоих..


 
Игорь Шевченко ©   (2007-03-11 21:24) [135]

vuk ©   (11.03.07 21:15) [133]

Э...а я разве существующим не смогу воспользоваться ? Зачем переписывать с нуля ?

Или это так же как с наследованием интерфейсов ?


 
jack128 ©   (2007-03-11 21:31) [136]

Игорь Шевченко ©   (11.03.07 21:24) [135]
Э...а я разве существующим не смогу воспользоваться ? Зачем переписывать с нуля ?


Например у тя есть helper для TStrings.  Он используется нескольких приложениях, в том числе и в консольных.
Терь те нужно сделать добавить в него метод, но этот метод требует модуля Forms.  ТО есть если ты добавить этот метод в уже существующий хелпер, то все твои консольные приложения потянут за собой Forms. Не очень хорошая ситуация, согласись ;-)

Кста, множественное наследование хелперов - не фига не работает :-)


 
oxffff ©   (2007-03-11 21:36) [137]


> Кста, множественное наследование хелперов - не фига не работает
> :-)


Приведи код


 
jack128 ©   (2007-03-11 21:37) [138]

type
 TObjectHelper1 = class helper for TObject
 public
   procedure Test;
 end;

 TObjectHelper2 = class helper for TObject
 public
   procedure Test2;
 end;

 TObjectHelper3 = class helper (TObjectHelper1, TObjectHelper2) for TObject
 public
   procedure Test3;
 end;

procedure TForm9.FormCreate(Sender: TObject);
begin

end;

{ TObjectHelper1 }

procedure TObjectHelper1.Test;
begin
 ShowMessage("TObjectHelper1.Test");
end;

{ TObjectHelper2 }

procedure TObjectHelper2.Test2;
begin
 ShowMessage("TObjectHelper2.Test");
end;

{ TObjectHelper3 }

procedure TObjectHelper3.Test3;
begin
 ShowMessage("TObjectHelper3.Test");
end;

end.


 
jack128 ©   (2007-03-11 21:38) [139]

jack128 ©   (11.03.07 21:37) [138]
TObjectHelper3 = class helper (TObjectHelper1, TObjectHelper2) for TObject

[Pascal Error] Unit9.pas(36): E2029 ")" expected but "," found


 
vuk ©   (2007-03-11 21:40) [140]

jack128 ©   (11.03.07 21:21) [134]:
>Хелпер - это просто сборник методов и ничего более.
Ага, а класс - не сборник. Или вот, например, интерфейс. Это что такое?

>Если те нужно объеденить 2 сборника в один - просто объявляешь
>наследника обоих..
Сам-то пробовал перед тем, как написать? ;)

to Игорь Шевченко ©   (11.03.07 21:24) [135]:
>Э...а я разве существующим не смогу воспользоваться ?
Ну да, в один конкретный момент доступен только один хелпер - ближайший по видимости. То есть если хотим свой использовать, то другие будут невидимы. Совместить функциональность можно только наследованием.


 
jack128 ©   (2007-03-11 21:44) [141]

vuk ©   (11.03.07 21:40) [140]
Или вот, например, интерфейс. Это что такое?

Интерфейсы - это именно сборники методов.   Они, кстати, множественное наследование поддерживают ;-)


 
Игорь Шевченко ©   (2007-03-11 21:46) [142]

jack128 ©   (11.03.07 21:31) [136]


> Например у тя есть helper для TStrings.  Он используется
> нескольких приложениях, в том числе и в консольных.
> Терь те нужно сделать добавить в него метод, но этот метод
> требует модуля Forms.  ТО есть если ты добавить этот метод
> в уже существующий хелпер, то все твои консольные приложения
> потянут за собой Forms.


Я могу написать несколько helper"ов для одного класса (для того же Tstrings)

Костыль на костыле получается. Suxx


 
Игорь Шевченко ©   (2007-03-11 21:48) [143]

vuk ©   (11.03.07 21:40) [140]


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


А явно имя квалифицировать не получится ?


 
oxffff ©   (2007-03-11 21:48) [144]


> >Если те нужно объеденить 2 сборника в один - просто объявляешь
>
> >наследника обоих..
> Сам-то пробовал перед тем, как написать? ;)


Никаких препятствий для этого нет.

Виртуальных методов нет (ну во всяком случае не работают), поля запрещены, классовые поля - не помеха те же глобальные переменные с ограниченным Scope.

Только судя по всему ancestor list - это опечатка  .


 
oxffff ©   (2007-03-11 21:56) [145]


> А явно имя квалифицировать не получится ?


Не работает.


 
Игорь Шевченко ©   (2007-03-11 22:01) [146]

oxffff ©   (11.03.07 21:56) [145]


> Не работает.


Ну и ладно. Делать надстройку над костылем - ну не понимаю я, нафига это надо, когда есть ясный и понятный механизм наследования.

И кроме того, простые процедуры тоже пока никто не отменял в Delphi для Win32.


 
oxffff ©   (2007-03-11 22:06) [147]


> И кроме того, простые процедуры тоже пока никто не отменял
> в Delphi для Win32.


Верно только когда в модуле множество "help" процедур и функций для различных классов. То class helper позволяет группировать их по функциональности. Поэтому с этой точки зрения удобно увидить их в нужном scope объекта.

Но лично я для себя вижу больше плюсов от record help.


 
oxffff ©   (2007-03-11 22:11) [148]

Естественно ноги растут из .NET struct c методами и интерфейсами. Только понятно, что в самой области памяти занимаемой структурой нет никаких сслылок аля всех тех которые по отрицательному смещению от VTB.
Да и не нужны они, поскольку нет наследования для структур. Поэтому тип известен на этапе компиляции и однозначно можно вызвать метод или получить интерфейс для этого типа.

И все это плюс. Хотя в плане scope


 
Игорь Шевченко ©   (2007-03-11 22:13) [149]

oxffff ©   (11.03.07 22:06) [147]


> Верно только когда в модуле множество "help" процедур и
> функций для различных классов. То class helper позволяет
> группировать их по функциональности. Поэтому с этой точки
> зрения удобно увидить их в нужном scope объекта.


Дизайн надо пересматривать, а не костыли городить. Фаулера читать.


 
oxffff ©   (2007-03-11 22:14) [150]


>
> Ну и ладно. Делать надстройку над костылем - ну не понимаю
> я, нафига это надо, когда есть ясный и понятный механизм
> наследования.


Что касаемо этого, то help очень однозначно определяет область их приминения


Class helpers provide a way to extend a class, but they should not be viewed as a design tool to be used when developing new code. They should be used solely for their intended purpose, which is language and platform RTL binding.



 
oxffff ©   (2007-03-11 22:15) [151]


> Дизайн надо пересматривать, а не костыли городить. Фаулера
> читать.


Ответ в [150]


 
Игорь Шевченко ©   (2007-03-11 22:19) [152]

oxffff ©   (11.03.07 22:14) [150]

Я читать умею, спасибо. И еще раз могу сказать, что для сопряжения System.Object из .Net Framework и TObject без особой потери совместимости со старым кодом helper"ы вполне уместно использовать, что в Borland и сделали. Но больше причины для их применения я не вижу. Даже в старом коде.


 
oxffff ©   (2007-03-11 22:19) [153]

Книги нужно читать и всегда думать.

Например Гамма, Хелм, Джонсон, Влисидесс
Тот же Буч
 тот же Ларман
используют в качестве примеров C++.

Но  заверяю вас, да и вы сами знаете.
В delphi есть языковые средства которые позволяют решить проблему проще и элегантнее.

Могу сказать, книги пора уже самим писать. :)


 
oxffff ©   (2007-03-11 22:22) [154]


> Даже в старом коде.


В своем безусловно.

А чужом, который нельзя модифицировать?


 
Игорь Шевченко ©   (2007-03-11 22:46) [155]

oxffff ©   (11.03.07 22:19) [153]


> В delphi есть языковые средства которые позволяют решить
> проблему проще и элегантнее.


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

oxffff ©   (11.03.07 22:22) [154]


> А чужом, который нельзя модифицировать?


И что ? Никто не запрещает наследоваться от классов в чужом коде, никто не запрещает писать процедуры вокруг классов чужого кода.
Главное, что объявив процедуру со своим именем, ты делаешь очевидным тот факт, что используется твое собственное расширение чужого кода, а написав helper и вызывая его метод у объекта, ты вносишь путаницу, потому что противоречишь интерфейсу чужого класса.


 
vuk ©   (2007-03-11 22:51) [156]

to jack128 ©   (11.03.07 21:44) [141]:
>Они, кстати, множественное наследование поддерживают ;-)
И давно? Нет, про множественную реализацию, это я в курсе. Но это не наследование и оно не у интерфейсов, а у классов.


 
ТЮзер (в нете через паяльник)   (2007-03-11 23:13) [157]

Читаю, читаю, .... Кто-нибудь может привести примитивный пример, что такое эти хелперы, и где они удобны? У меня семерка.


 
oxffff ©   (2007-03-11 23:17) [158]


> И что ? Никто не запрещает наследоваться от классов в чужом
> коде


Хорошо. Предположим. Мне нужно особую функциональность для объекта опеределенного типа стороннего разработчика.

Я определяю класс наследник. И привожу объект к наследнику. О чем я писал выше.

oxffff ©   (09.03.07 18:18) [73]
oxffff ©   (10.03.07 00:35) [104]

Да это решение. Но к сожалению нет способа запретить определение virtual, dynamic(message) методов. Да и привидение будет не безопасным.
Здесь сам разработчик берет на себя эти гарантии.
Другой после этого может и нарушить binary compatibility определив несколько виртуальных или динамических процедур у наследника.
Далее при приведнии будет не понятно.
Почему function ClassType: TClass; возвращает TBaseType вместо дочернего.

В этом решении тоже очень много невыразительности и противоречивости.
Но как костыль тоже подойдет.


> никто не запрещает писать процедуры вокруг классов чужого
> кода.


Классов может быть много и процедур тоже.
А вот иметь общий scope это удобно.


 
Игорь Шевченко ©   (2007-03-11 23:23) [159]

oxffff ©   (11.03.07 23:17) [158]


> Классов может быть много и процедур тоже.
> А вот иметь общий scope это удобно.


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

С чего началась дискуссия - с вызова Memo.Lines.DoWork. Я смотрю в help - у TStrings нету метода DoWork. Впадаю в ступор.


 
ТЮзер (в нете через паяльник)   (2007-03-11 23:26) [160]

А у хелпера есть DoWork? Или что-то еще там есть?



Страницы: 1 2 3 4 5 6 7 вся ветка

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

Наверх




Память: 0.85 MB
Время: 0.072 c
2-1175151426
VologdaBobR
2007-03-29 10:57
2007.04.22
Поиск и открытие документа Word


3-1170430978
s_t_d
2007-02-02 18:42
2007.04.22
QReport в Delphi 7. Как получить доступ к элементам?


10-1131429028
john_mag
2005-11-08 08:50
2007.04.22
работа с msword


10-1131373342
Gugle
2005-11-07 17:22
2007.04.22
Сортировка в Exel


2-1174992785
Riply
2007-03-27 14:53
2007.04.22
Определение разрыва связи с Pipe - клиентом.