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

Вниз

И снова хелперы :)   Найти похожие ветки 

 
euru ©   (2007-04-11 17:43) [40]


> _Аноним   (11.04.07 17:27) [38]
> Зачем спорить о том, чего нет? :-)
Но это может появиться в будущем.


 
oxffff ©   (2007-04-11 17:50) [41]


> euru ©   (11.04.07 17:06) [35]
>
> > Игорь Шевченко ©   (11.04.07 16:58) [32]
> > Значит и поправки недоступны, нес па ?
> При наследовании и делегировании недоступны. С хелперами
> это разрешимо.
> type
>   TAHelper = class helper for TA
>     . . .
>   end;
> Классы TВ и ТС автоматически получат дополнительную функциональность
> хелпера.


Только эти две функциональности соседствуют независимо друг от друга.
А ваши tricks по поводу модификации VMT и DMТ это только tricks.


 
euru ©   (2007-04-11 17:51) [42]


> Игорь Шевченко ©   (11.04.07 17:12) [36]
> пример в студию не затруднит ?
Какие примеры? Имеется .dcu-файл (например, Unit1.dcu), содержащий классы ТА, ТВ и ТС, к нему прилагается справка.
В программме объявляю uses Unit1, а дальше как в [35]. После чего могу в своей программе объявить, например, переменную С: ТС. И у неё будут возможности, добавленные хелпером к классу ТА.


 
oxffff ©   (2007-04-11 17:53) [43]


> euru ©   (11.04.07 17:51) [42]
>
> > Игорь Шевченко ©   (11.04.07 17:12) [36]
> > пример в студию не затруднит ?
> Какие примеры? Имеется .dcu-файл (например, Unit1.dcu),
> содержащий классы ТА, ТВ и ТС, к нему прилагается справка.
>  
> В программме объявляю uses Unit1, а дальше как в [35]. После
> чего могу в своей программе объявить, например, переменную
> С: ТС. И у неё будут возможности, добавленные хелпером к
> классу ТА.


Вы хотите лошади пределать колеса.
Ну а если лошадь не полиморфна, что делать?


 
euru ©   (2007-04-11 17:54) [44]


> oxffff ©   (11.04.07 17:50) [41]
> Только эти две функциональности соседствуют независимо друг
> от друга.
Не понял этой фразы. Можно поподробнее?


> А ваши tricks по поводу модификации VMT и DMТ это только
> tricks.
Tricks они до тех пор, пока не будут поддерживаться компилятором.


 
oxffff ©   (2007-04-11 17:54) [45]


> euru ©   (11.04.07 17:51) [42]
>
> > Игорь Шевченко ©   (11.04.07 17:12) [36]
> > пример в студию не затруднит ?
> Какие примеры? Имеется .dcu-файл (например, Unit1.dcu),
> содержащий классы ТА, ТВ и ТС, к нему прилагается справка.
>  
> В программме объявляю uses Unit1, а дальше как в [35]. После
> чего могу в своей программе объявить, например, переменную
> С: ТС. И у неё будут возможности, добавленные хелпером к
> классу ТА.


Наследуйте от класса.


 
euru ©   (2007-04-11 17:55) [46]


> oxffff ©   (11.04.07 17:53) [43]

> Вы хотите лошади пределать колеса.Ну а если лошадь не полиморфна,
>  что делать?
А наследование как с такой задачей справится?


 
euru ©   (2007-04-11 17:57) [47]


> oxffff ©   (11.04.07 17:54) [45]

> Наследуйте от класса.
Тогда мне нужно будет создать наследника для каждого потомка класса ТА


 
oldman ©   (2007-04-11 17:58) [48]

Почему нет надписи:

Перемещено в конференцию "Бред"

???


 
oxffff ©   (2007-04-11 17:59) [49]


> euru ©   (11.04.07 17:54) [44]
>
> > oxffff ©   (11.04.07 17:50) [41]
> > Только эти две функциональности соседствуют независимо
> друг
> > от друга.
> Не понял этой фразы. Можно поподробнее?


Одна функциональность расширяет и (не)использует другую, но не переопределяет ее.
Если она переопределяет ее это уже наследование.


 
oxffff ©   (2007-04-11 18:01) [50]


> А наследование как с такой задачей справится?


Никак. Но вы можете определить новый класс Лошадь на колесах.
И два агрегата, которым делегируется реализация этого класса.


 
Игорь Шевченко ©   (2007-04-11 18:13) [51]


> Какие примеры? Имеется .dcu-файл (например, Unit1.dcu),
> содержащий классы ТА, ТВ и ТС, к нему прилагается справка.
>  
> В программме объявляю uses Unit1, а дальше как в [35]. После
> чего могу в своей программе объявить, например, переменную
> С: ТС. И у неё будут возможности, добавленные хелпером к
> классу ТА.


Я конечно все понимаю, но не проще функцию объявить, которая будет делать ту недостающую функциональность, чем напрягать программиста, увидевшего вызовы методов, напрочь отсутствующих в справке ?

Или опять фича ради фичи ?


 
_Аноним   (2007-04-11 18:19) [52]


> Я конечно все понимаю, но не проще функцию объявить, которая
> будет делать ту недостающую функциональность, чем напрягать
> программиста, увидевшего вызовы методов, напрочь отсутствующих
> в справке ?


Это решается путем Ctrl+Click


 
Игорь Шевченко ©   (2007-04-11 18:41) [53]


> Это решается путем Ctrl+Click


Это если у тебя времени много


 
_Аноним   (2007-04-11 19:21) [54]


> Игорь Шевченко ©

А функция (та, которая вместо хелпера) разве присутствует в справке?

> Это если у тебя времени много

Ctrl+Click быстрее работает, чем F1


 
euru ©   (2007-04-12 02:50) [55]


> oxffff ©   (11.04.07 17:59) [49]
> Одна функциональность расширяет и (не)использует другую,
>  но не переопределяет ее.Если она переопределяет ее это
> уже наследование.
Странно. Насколько я знаю, в результате наследования появляется новый класс. Применение хелперов новые классы не порождает. С чего же тогда здесь должно быт наследование?


> Игорь Шевченко ©   (11.04.07 18:13) [51]
> Я конечно все понимаю, но не проще функцию объявить,
Ну да. Десяток функций, заменяющих хелпер. Плюс ещё где-то нужно хранить структуру с дополнительными полями несостоявшегося хелпера. Плюс ещё помнить, что эта структура принадлежит конкретному классу. Плюс ещё продублировать все функции для потомков класса либо в оригинальных функциях case для каждого потомка класса прописывать и не забывать обновлять эту функцию при очередном наследовании.


 
oxffff ©   (2007-04-12 09:38) [56]


> euru ©   (12.04.07 02:50) [55]
>
> > oxffff ©   (11.04.07 17:59) [49]
> > Одна функциональность расширяет и (не)использует другую,
>
> >  но не переопределяет ее.Если она переопределяет ее это
>
> > уже наследование.
> Странно. Насколько я знаю, в результате наследования появляется
> новый класс. Применение хелперов новые классы не порождает.
>  С чего же тогда здесь должно быт наследование?


(Хелпер с полями + перекрытие методов класса)
грубо = наследование.


 
Alkid ©   (2007-04-12 10:06) [57]

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

Цитата:
"A class helper simply introduces a wider scope for the compiler to use when resolving identifiers"


 
_Аноним   (2007-04-12 10:29) [58]


> Alkid ©


А мы тут обсуждаем гипотетическую возможность того, что в след. версии уже можно будет и поля определять.

По сабжу.
Игорь, ты ведь их не используешь, хелперы, правильно?
Не используешь.
И ты теоретически предполагаешь ,что при их использовании возможны засады - программисты запутаются и начнется бардак.
А мы используем, на практике. Ну нет от них никакой путаницы, нету, как бы не казалось, что она может бьть.
Наоборот, структура модулей заметно упорядочилась.
Это практика, она главнее :-)


 
Alkid ©   (2007-04-12 10:35) [59]


> А мы тут обсуждаем гипотетическую возможность того, что
> в след. версии уже можно будет и поля определять.

Вряд ли такое случится.


 
oxffff ©   (2007-04-12 11:02) [60]


> Alkid ©   (12.04.07 10:35) [59]
>
> > А мы тут обсуждаем гипотетическую возможность того, что
>
> > в след. версии уже можно будет и поля определять.
>
> Вряд ли такое случится.


Для такого события должны быть причины.
На сегодняшний момент таких причин нет.

Загляну в будущее и скажу больше "Их и там не будет"


 
oxffff ©   (2007-04-12 11:12) [61]


> _Аноним   (12.04.07 10:29) [58]
>
> > Alkid ©
>
>
> А мы тут обсуждаем гипотетическую возможность того, что
> в след. версии уже можно будет и поля определять.


Если эту версию выпустит euru ©.
:)

Если серьезно, то

Class helpers
сlass helper is a
construct that extends a class with all fields from the helper class. It allows
you to extend existing class without actually modifying it or inheriting from it.

The reason why this feature was included in Delphi was to make VCL portable
to .NET.


 
Игорь Шевченко ©   (2007-04-12 11:37) [62]

_Аноним   (12.04.07 10:29) [58]


> Игорь, ты ведь их не используешь, хелперы, правильно?
> Не используешь.
> И ты теоретически предполагаешь ,что при их использовании
> возможны засады - программисты запутаются и начнется бардак.
>


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


> А мы используем, на практике. Ну нет от них никакой путаницы,
>  нету, как бы не казалось, что она может бьть.
> Наоборот, структура модулей заметно упорядочилась.


Вы тоже VCL с .Net скрещиваете ? :)

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


 
euru ©   (2007-04-12 12:17) [63]


> oxffff ©   (12.04.07 09:38) [56]
> (Хелпер с полями + перекрытие методов класса) грубо = наследование.

Возьму пример с лошадью, только с полиморфной.
Допустим, имеется следующая иерархия.

type
  TAnimal = class
  public
    procedure Draw(); virtual;
  end;

  THorse = class(TAnimal)
  public
    procedure Draw(); override;
  end;

  TDog = class(TAnimal)
  public
    procedure Draw(); override;
  end;

var
  H: THorse;
  D: TDog;

begin
  H := THorse.Create();
  D := TDog.Create();
  H.Draw();
  D.Draw();
end;


Необходимо добавить возможность рисования колёс для потомков класса TAnimal.

Наследование.

type
  TWheelHorse = class(THorse)
  private
    FWheelParams: TWheelParams;
  public
    procedure Draw(); override;
  end;

  TWheelDog = class(TDog)
  private
    FWheelParams: TWheelParams;
  public
    procedure Draw(); override;
  end;

  // Функция, умеющая рисовать колёса потомкам класса TAnimal
  procedure DrawWheels(Animal: TAnimal; Params: TWheelParams);

procedure TWheelHorse.Draw();
begin
  inherited Draw();
  DrawWheels(Self, FWheelParams);
end;

procedure TWheelDog.Draw();
begin
  inherited Draw();
  DrawWheels(Self, FWheelParams);
end;

Ещё нужно не забыть переписать создание объектов, чтобы учесть изменения.
begin
  H := TWheelHorse.Create();
  D := TWheelDog.Create();
  H.Draw();
  D.Draw();
end;


Хелперы

type
  TAnimalHelper = class helper for TAnimal
  private
    FWheelParams: TWheelParams;
    private DrawWheels();
  public
    procedure Draw(); override;
  end;

procedure TAnimalHelper.Draw();
begin
  inherited;
  DrawWheels();
end;

При создании объектов классов THorse и TDog автоматически учтётся расширение их предка хелпером.


 
_Аноним   (2007-04-12 12:24) [64]


> Игорь Шевченко ©  


> Вы тоже VCL с .Net скрещиваете ? :)
>
> Ты б хоть пример тогда реальный привел, раз вы их используете
> вовсю.


нет, не скрещиваем, у нас чистый win32

Используются они у нас в двух случаях:
1.
Некий набор утилит общего назначения - дополнение к классам VCL
Структура модулей с хелперами повторяет структуру модулей VCL
то есть у нас например есть модули типа
MyLib.Helpers.Classes
MyLib.Helpers.StdCtrls
MyLib.Helpers.ComCtrls
MyLib.Helpers.Forms

Пример хелпера общего назначения:

 TStringsHelper = class Helper for TStrings
 public
   function AddObjectFmt(const s: string; const Args: array of const; Obj: TObject): Integer;
   function AddFmt(const s: string; const Args: array of const): Integer;

2. В конкретный местах, где требуется расширение фунцкиональности базовой иерархии начиная с предка - конктерно для использовании в конкретном модуле проекта (не библиотеке)
(сорри за тавтологию)

В базовых иерархиях мы хелперы не используем.


 
Игорь Шевченко ©   (2007-04-12 12:26) [65]


>  TStringsHelper = class Helper for TStrings
>  public
>    function AddObjectFmt(const s: string; const Args: array
> of const; Obj: TObject): Integer;
>    function AddFmt(const s: string; const Args: array of
> const): Integer;


Ну да, а функцию завести вам точно Коран не велит. 18-ая сура.

Так хорошо написать MyFooList.AddFmt вместо AddFmt(MyFooList)


 
_Аноним   (2007-04-12 12:34) [66]


> Игорь Шевченко ©  


Да понятно, что можно и функцией.
Но так красивее :-)


> Коран не велит. 18-ая сура.


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


 
Игорь Шевченко ©   (2007-04-12 12:40) [67]

_Аноним   (12.04.07 12:34) [66]


> Но так красивее :-)


Красота - убойная сила. Но мне предпочительнее понятность, потому как видя вызов функции я без Ctrl+Mouse пойму, что это изобретение программиста, а не фирмы Borland к примеру, или фирмы-поставщика стороннего класса.


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


Пляшущим :)


 
oxffff ©   (2007-04-12 12:47) [68]


> Хелперы
>
> type
>   TAnimalHelper = class helper for TAnimal
>   private
>     FWheelParams: TWheelParams;
>     private DrawWheels();
>   public
>     procedure Draw(); override;
>   end;
>
> procedure TAnimalHelper.Draw();
> begin
>   inherited;
>   DrawWheels();
> end;
> При создании объектов классов THorse и TDog автоматически
> учтётся расширение их предка хелпером.


Во первых у вас все животные будут с колесами.

:)

А во вторых

procedure TAnimalHelper.Draw(); override;

заменит entry VMT в классе.

Во вашим словам helpers могут расширять TAnimal.
Их может быть много.
Скажите если я позже захочу еще и крылья рисовать, то есть и колеса и крылья, то как вы это собрались override?


 
euru ©   (2007-04-12 14:03) [69]


> Игорь Шевченко ©   (12.04.07 12:40) [67]

>  Но мне предпочительнее понятность, потому как видя вызов
> функции я без Ctrl+Mouse пойму, что это изобретение программиста,
>  а не фирмы Borland к примеру, или фирмы-поставщика стороннего
> класса.
Допустим, встречается внутри метода класса вызов
AddFmt(MyFooList)
Как определить, что это:
1. вызов глобальной функции;
2. вызов метода из того же класса или его предка;
3. вызов метода из делегированного интерфейса.


 
clickmaker ©   (2007-04-12 14:05) [70]


> [67] Игорь Шевченко ©   (12.04.07 12:40)
> > В народе ходил слух, что ты являешься дервишом суфийского
>
> > ордена Кадерия.
> > Неужели правда? :-)
>
>
> Пляшущим :)

с бубном? :)


 
euru ©   (2007-04-12 14:22) [71]


> oxffff ©   (12.04.07 12:47) [68]
> Во первых у вас все животные будут с колесами.
Не важно. Целью было показать разницу между наследованием и хелперами.


> заменит entry VMT в классе.
А что в этом криминального?


> Скажите если я позже захочу еще и крылья рисовать, то есть
> и колеса и крылья, то как вы это собрались override?
Например, так
type
  TWingsAnimalHelper = class helper(TAnimalHelper) for TAnimal
  private
    FWingsParams: TWingsParams;
  public
    procedure Draw(); override;
  end;


 
Игорь Шевченко ©   (2007-04-12 14:29) [72]

euru ©   (12.04.07 14:03) [69]


> Допустим, встречается внутри метода класса вызов



> Как определить, что это:


А сейчас ты как определяешь ?


 
oxffff ©   (2007-04-12 14:42) [73]


> euru ©   (12.04.07 14:22) [71]
>
> > oxffff ©   (12.04.07 12:47) [68]
> > Во первых у вас все животные будут с колесами.
> Не важно. Целью было показать разницу между наследованием
> и хелперами.
>
>
> > заменит entry VMT в классе.
> А что в этом криминального?
>
>
> > Скажите если я позже захочу еще и крылья рисовать, то
> есть
> > и колеса и крылья, то как вы это собрались override?
> Например, так
> type
>   TWingsAnimalHelper = class helper(TAnimalHelper) for TAnimal
>   private
>     FWingsParams: TWingsParams;
>   public
>     procedure Draw(); override;
>   end;


Чем это отличается наследования?


 
oxffff ©   (2007-04-12 14:45) [74]

to euru

> > > Во первых у вас все животные будут с колесами.
> > Не важно. Целью было показать разницу между наследованием
>
> > и хелперами.
> >


По моему в вашем понимании это одно и тоже (в смысле результат)


 
euru ©   (2007-04-12 14:46) [75]


> Игорь Шевченко ©   (12.04.07 14:29) [72]
> А сейчас ты как определяешь ?
Я уже года два никак это не определяю :)
А раньше Ctrl+LeftClick. Но, насколько я понял, у тебя есть методика, как обойтись такого способа. Вот мне и интересно стало.


 
euru ©   (2007-04-12 15:08) [76]


> euru ©   (12.04.07 14:46) [75]
как обойтись такого способа = как обойтись без такого способа


 
Игорь Шевченко ©   (2007-04-12 15:39) [77]

euru ©   (12.04.07 14:46) [75]

Есть методика - глаза.exe называется. До сих пор оправдывала. Для стандратных (читай - VCL, RTL) классов список их методов в голове находится, поэтому определить, что AddFmt с параметром Tstrings и дополнительными явно является функцией или методом класса, отличного от TStrings, труда не составляет. А вот увидев у экземпляра класса TStrings вызов метода AddFmt скорость распознавания текста сильно замедляется, до ступора.


 
Alkid ©   (2007-04-12 16:33) [78]


> Например, так
> type
>   TWingsAnimalHelper = class helper(TAnimalHelper) for TAnimal
>   private
>     FWingsParams: TWingsParams;
>   public
>     procedure Draw(); override;
>   end;

Замечательно. Есть у меня класс TAnimal и наследники. Есть хелпер TWheeledAnimal и есть хелпер TWingedAnimal. Я создаю экземпляр THorse и вызываю у него Draw. У меня какой конь нарисуется - с колёсами или с крыльями?

А вообще то, что предлагается - это бред с точки зрения классического ООП, ибо поведение класса меняется извне этого класса, что напрямую противоречит парадигме ООП.


 
oxffff ©   (2007-04-12 17:16) [79]


> Замечательно. Есть у меня класс TAnimal и наследники. Есть
> хелпер TWheeledAnimal и есть хелпер TWingedAnimal. Я создаю
> экземпляр THorse и вызываю у него Draw. У меня какой конь
> нарисуется - с колёсами или с крыльями?


Я его тоже к этому пытался подвести.
Но конь будет с тем, что объявлено последним.
Скорее с хвостом. :)

>А вообще то, что предлагается - это бред с точки зрения классического >ООП, ибо поведение класса меняется извне этого класса, что напрямую >противоречит парадигме ООП.

Скорее дублирует уже существующую функциональность.


 
Alkid ©   (2007-04-12 17:21) [80]


> Я его тоже к этому пытался подвести.
> Но конь будет с тем, что объявлено последним.
> Скорее с хвостом. :)

Да нет, это будет крылато-колесатый конь :)


> Скорее дублирует уже существующую функциональность.

Не дулирует.  Это прямое нарушение.
Предположим: есть базовый класс А со стандартизованным описанием и интерфейсов. От этого класса пронаследовались другие классы. Теперь появляется третья сторона, которая получает возможность вмешатьяс в интерфейс и поведение класса А, каскадно изменив тем самым поведением всех остальных классов. Это прямое нарушение принципов инкапсуляции и прекрасная возможность создания себе проблем :-)

Собственно говоря, если возникает необходимость таким экзотическим образом менять способ отрисовки целой иерархии классов, то значит иерархия была спроектирована неправильно, способ отрисовки должен быть выделен в стратегию и т.п.



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

Форум: "Прочее";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.66 MB
Время: 0.05 c
3-1173133245
Mr. D.
2007-03-06 01:20
2007.05.20
Невозможность снять привелегии с SYSDBA в IBExpert


2-1177516188
Romm
2007-04-25 19:49
2007.05.20
делаем ShareWare прогу


15-1176963653
Anton_La
2007-04-19 10:20
2007.05.20
Записать в цикле.


2-1177506224
Abcdef123
2007-04-25 17:03
2007.05.20
Прошу прокомментировать, и дать совет, как сделать лучше


2-1178258752
Marat
2007-05-04 10:05
2007.05.20
Округлить число в запросе





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