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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.83 MB
Время: 0.077 c
2-1175235619
vegarulez
2007-03-30 10:20
2007.04.22
Подскажите про DBGridKeyPress.


2-1175161127
Alex7
2007-03-29 13:38
2007.04.22
Как взять данные DataSet в Clipbord, чтобы вставить в Excel


2-1175614931
Kostafey
2007-04-03 19:42
2007.04.22
В продолжении конкурса на самый тупой вопрос


3-1170747668
RomanH
2007-02-06 10:41
2007.04.22
SQL-запрос


1-1172073940
DelphiLexx
2007-02-21 19:05
2007.04.22
Плоский ScrollBar





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский