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

Вниз

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

 
Суслик ©   (2007-04-11 00:57) [0]

Уважаемые, противники нововведний в дельфи.

Почитайте http://timokhov.blogspot.com/2007/04/blog-post.html
См. ссылку в посте.

ИМХО неплохо можно использовать новые фишки в языке. Разве нет?


 
_Аноним   (2007-04-11 10:17) [1]

Это в 2007 будет?


 
Игорь Шевченко ©   (2007-04-11 10:35) [2]


> См. ссылку в посте.


Нет, чтоб перевести на понятный язык


 
Чапаев ©   (2007-04-11 10:36) [3]

Капец... Давать ссылку на ссылку...


 
_Аноним   (2007-04-11 10:38) [4]


> Чапаев ©  

Чтобы довести ситуацию до абсурда, можно знакомым давать эту ссылку:
http://delphimaster.net/view/15-1176238641/
"посмотрите, какие нововведения в delphi"
:-)


 
Суслик ©   (2007-04-11 10:47) [5]


>  [2] Игорь Шевченко ©   (11.04.07 10:35)
> > См. ссылку в посте.
> Нет, чтоб перевести на понятный язык


Ты про то, чтобы перевести?
Я подумаю об этом :)


>  [1] _Аноним   (11.04.07 10:17)
> Это в 2007 будет?


Вообще это все должно быть и БДС2006 (многое из описанного я использую в БДС2006). Другой вопрос, что в Д2007 это может постабильней работать. Это я точно не знаю, т.к. качеством работы итераторов доволен и в БДС2006. Как минимум ни одной ошибки не видел.


 
Суслик ©   (2007-04-11 10:48) [6]


> [3] Чапаев ©   (11.04.07 10:36)
> Капец... Давать ссылку на ссылку...

ну себя тоже хочется попиарить :)


 
Чапаев ©   (2007-04-11 10:49) [7]

> [6] Суслик ©   (11.04.07 10:48)
Тю... Так написал бы: подробности смотри в моём блоге по адресу "...". А то поди догадайся, что timokhov -- это ты... %-)


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


> Суслик ©  

Пищи еще)
Я с каждого раза что-то новое узнаЮ  :-)
вот про for in узнал
точнее, для перечислимых типов уже знал, а то что и по стринг листу работает - это новость

А читать "what"s new" при выходе новой версии - это не по нашему)


 
Суслик ©   (2007-04-11 10:54) [9]


> А читать "what"s new" при выходе новой версии - это не по
> нашему)

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

правда, до указанного извращения я сам не додумался пока.

в what news можно только базовые новости почитать.

имхо


 
euru ©   (2007-04-11 12:54) [10]

Ну да. Как только в хелпере понадобилось хранить состояние класса, а в самом классе "лишних" полей не нашлось, пришлось городить интерфейс и реализующий его класс. Хотя с этим вполне мог бы справиться сам компилятор.

Гипотетический пример:
TStringsEnumerator = class helper for TStrings
private
  FIndex: Integer;
  function GetCurrent(): string;
public
  function GetEnumerator(): TStrings;
  function MoveNext(): Boolean;
  property Current: string read GetString;
end;

function TStringsEnumerator.GetCurrent(): string;
begin
  Result := Items[FIndex];
end;

function TStringsEnumerator.GetEnumerator(): TStrings;
begin;
  FIndex := -1;
  Result := Self;
end;
 
functions TStringsEnumerator.MoveNext(): Boolean;
begin
  inc(FIndex);
  Result := FIndex < Count;
end;


Неужели компилятор не смог бы, встретив такой код, сделать корректную компиляцию?


 
Суслик ©   (2007-04-11 13:24) [11]


>  [10] euru ©   (11.04.07 12:54

ты все о своем :)


 
MBo ©   (2007-04-11 13:37) [12]

>euru
Где хранится дополнительное поле?


 
euru ©   (2007-04-11 15:03) [13]


> Суслик ©   (11.04.07 13:24) [11]
> ты все о своем :)
Ну так видно же невооружённым глазом недоделанность хелперов. А в статье виден результат этой недоделанности. Весь код, который там нагромоздили только для того, чтобы сохранить текущую итерацию, мог бы с успехом сделать компилятор, и сделать это, я думаю, гораздо эффективнее.

А если учесть и другие несуразности, возникшие с вводом в язык новых понятий (о них я писал в [41] в http://delphimaster.net/view/15-1176238641/), то у меня возникают вопросы о квалифицированности разработчиков языка либо об их отношению к языку.


> MBo ©   (11.04.07 13:37) [12]
> Где хранится дополнительное поле?
Там же, где и остальные поля класса. Компилятор-то во время компиляции обладает информацией о наличии у класса хелперов и, соответственно, может учесть при выделении памяти имеющиеся в хелпере поля.


 
oxffff ©   (2007-04-11 15:18) [14]


> euru ©   (11.04.07 15:03) [13]
>
> > Суслик ©   (11.04.07 13:24) [11]
> > ты все о своем :)
> Ну так видно же невооружённым глазом недоделанность хелперов.
>  А в статье виден результат этой недоделанности. Весь код,
>  который там нагромоздили только для того, чтобы сохранить
> текущую итерацию, мог бы с успехом сделать компилятор, и
> сделать это, я думаю, гораздо эффективнее.


Вы предлагаете ввести поля в хелперы.
Объясните нам тогда разницу по вашему между
 наследованием и HelperEx(с полями).
Покажите на примере, что можно сделать с использованием того и другого.
А чего нельзя. И что это даст.


 
Суслик ©   (2007-04-11 15:20) [15]


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

я думаю ты не прав :)
есть ощущение, что ты не до конца догоняешь (честное слово) хелперы.

хорошо, дабы не быть голословным

есть пакет А, в нем класс КлассА.
есть пакет Б, используется пакет А, в пакете Б есть ХелперБ.

И что? Кто должен учитывать доп. место? Пакет А ничего не знает о пакете Б. При этом пакет А может создавать объект.

Убедил?


 
oldman ©   (2007-04-11 15:20) [16]


> Суслик ©   (11.04.07 00:57)  
> Уважаемые, противники нововведний в дельфи.
> ИМХО неплохо можно использовать новые фишки в языке. Разве
> нет?


Нет.
Это будет уже другой язык.

(Кстати, а кто тебе сказал, что Дельфи - это язык программирования???)


 
oxffff ©   (2007-04-11 15:21) [17]


> (Кстати, а кто тебе сказал, что Дельфи - это язык программирования?
> ??)


А что на нем уже разговаривают?


 
Суслик ©   (2007-04-11 15:23) [18]


>  [16] oldman ©   (11.04.07 15:20)


> (Кстати, а кто тебе сказал, что Дельфи - это язык программирования???)

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

-----
в одном могу согласится с общественностью - это уже тянет не другой язык с неизвестным будущем :)


 
oldman ©   (2007-04-11 15:45) [19]


> oxffff ©   (11.04.07 15:21) [17]


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

А то как наш бухгалтер:
"Сергей, мы купили новый компьютер, поставьте нам какую-нибудь программу. Ну, хотя-бы, Виндоуз..." :)


 
euru ©   (2007-04-11 15:47) [20]


> oxffff ©   (11.04.07 15:18) [14]
Наследование - это экстенсивный путь развития класса. Расширение функциональности класса производится за счёт создания его потомков.

Хелперы - это интенсивный путь развития класса. Расширение производится за счёт непосредственного встраивания в класс новой функциональности.

Примеры я повторю из одного из своих предыдущих сообщений.

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

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

Примеры (названия классов и полей пишу по памяти, так что могу и ошибиться).
1. Поле PasswordChar в классе TEdit. Очень редко используемое поле. С хелперами можно было бы добавлять только к тем объектам TEdit, которым оно действительно нужно.

2. Свойство Dockable у класса TControl. Тоже не для всех контролов и не во всех проектах используется. Можно вынести в отдельный хелпер и подключать по мере необходимости.

3. Дублирование обычных контролов и DB-контролов. С хелперами можно было бы создать обычные контролы, а возможность работы с БД получалась бы подключением DB-хелпера.


 
homm ©   (2007-04-11 15:50) [21]

> Вообще-то (имхо) Дельфи является средой программирования,
> использующую ObjectPascal, который и является языком программирования...

Здесь не может быть «имхо», имхо. :) Начяная с версии 7 язык называется Delphi.


 
homm ©   (2007-04-11 15:51) [22]

Люди, вообще, учитесь отличать imho от afaik, а то суете не к месту и путаете вечно :(


 
oxffff ©   (2007-04-11 15:51) [23]


> oldman ©   (11.04.07 15:45) [19]
>
> > oxffff ©   (11.04.07 15:21) [17]
>
>
> Вообще-то (имхо) Дельфи является средой программирования,
>  использующую ObjectPascal, который и является языком программирования.
> ..
>
> А то как наш бухгалтер:
> "Сергей, мы купили новый компьютер, поставьте нам какую-
> нибудь программу. Ну, хотя-бы, Виндоуз..." :)


http://ru.wikipedia.org/wiki/Delphi_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Delphi — результат развития языка Турбо Паскаль, который, в свою очередь, развился из языка Паскаль. Паскаль был полностью процедурным языком, Турбо Паскаль начиная с версии 5.5 добавил в Паскаль объектно-ориентированные свойства, а Delphi — объектно-ориентированный язык программирования с возможностью доступа к метаданным классов (то есть к описанию классов и их членов) в компилируемом коде, также называемом интроспекцией. Так как все классы наследуют функции базового класса TObject, то любой указатель на объект можно преобразовать к нему, и воспользоваться методом ClassType и функцией TypeInfo, которые и обеспечат интроспекцию. Также отличительным свойством Дельфи от С++ является отсутствие возможности располагать объекты в стеке (объекты, унаследованные из Турбо Паскаля, располагаться в стеке могут) — все объекты попадают в динамически выделяемую область (кучу).

Де-факто Object Pascal, а затем и язык Delphi являются функциональными наращиваниями Turbo Pascal. Об этом говорят обозначения версий компилятора. Так, в Delphi 7 компилятор имеет номер версии 15.0 (Последняя версия Borland Pascal / Turbo Pascal обозначалась 7.0, в Delphi 1 компилятор имеет версию 8.0, в Delphi 2 — 9.0, и т. д. Номер версии 11.0 носит компилятор Pascal, входивший в состав среды C++Builder).


 
oldman ©   (2007-04-11 15:57) [24]


> homm ©   (11.04.07 15:50) [21]
> Начяная с версии 7 язык называется Delphi.


Как работал на 5, так и работаю... :)))


 
Игорь Шевченко ©   (2007-04-11 16:00) [25]

А что, неплохая иллюстрация к моим размышлениям о helper"ах - фича ради фичи


 
oxffff ©   (2007-04-11 16:01) [26]


> euru ©   (11.04.07 15:47) [20]
>
> > oxffff ©   (11.04.07 15:18) [14]
> Наследование - это экстенсивный путь развития класса. Расширение
> функциональности класса производится за счёт создания его
> потомков.
>
> Хелперы - это интенсивный путь развития класса. Расширение
> производится за счёт непосредственного встраивания в класс
> новой функциональности.


Если вы встраиваете новую функциональность, то это уже другой класс.

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

Это делаете наследованием или делегированием реализации.

>Примеры (названия классов и полей пишу по памяти, так что могу и >ошибиться).
>1. Поле PasswordChar в классе TEdit. Очень редко используемое поле. С >хелперами можно было бы добавлять только к тем объектам TEdit, которым >оно действительно нужно.

>2. Свойство Dockable у класса TControl. Тоже не для всех контролов и не >во всех проектах используется. Можно вынести в отдельный хелпер и >подключать по мере необходимости.

>3. Дублирование обычных контролов и DB-контролов. С хелперами можно >было бы создать обычные контролы, а возможность работы с БД получалась >бы подключением DB-хелпера.

Просто так вы не встроите поле.
Вам нужно менять функциональность класса.
Куда вы это страиваете для новой функциональности, если это не предусмотрено заранее


 
oldman ©   (2007-04-11 16:04) [27]


> Игорь Шевченко ©   (11.04.07 16:00) [25]
> А что, неплохая иллюстрация к моим размышлениям о helper"ах
> - фича ради фичи


Вообще, наводит на размышления перевод слова "helper"...
Это типа Шойгу - фича ради фичи.
:)))


 
euru ©   (2007-04-11 16:24) [28]


> Суслик ©   (11.04.07 15:20) [15]
> есть пакет А, в нем класс КлассА.есть пакет Б, используется
> пакет А, в пакете Б есть ХелперБ.И что? Кто должен учитывать
> доп. место? Пакет А ничего не знает о пакете Б. При этом
> пакет А может создавать объект.
В пакете А вызывается конструктор класса КлассА. При вызове конструктора происходит обращение к RTTI этого класса. RTTI знает о наличии хелперов у класса, а также о размере выделяемой для класса памяти с учётом всех имеющихся хелперов. На основе этой информации выделится требуемое количество памяти. Методам класса из пакета А будут доступны только поля класса (про остальные поля они просто не знают). Методам хелпера из пакета Б будут доступны задекларированные в них поля.


 
oxffff ©   (2007-04-11 16:33) [29]


> В пакете А вызывается конструктор класса КлассА. При вызове
> конструктора происходит обращение к RTTI этого класса. RTTI
> знает о наличии хелперов у класса, а также о размере выделяемой
> для класса памяти с учётом всех имеющихся хелперов.


Скажите как будет производится доступ к полям хелпера.
Offset уже могут быть разные?
через RTTI?


 
euru ©   (2007-04-11 16:47) [30]


> oxffff ©   (11.04.07 16:01) [26]
> Если вы встраиваете новую функциональность, то это уже другой класс.
Это почему? Я как объявлял TStringList, так и буду продолжать. О наличии хелпера TStringsEnumerator будет заботится компилятор.


> Это делаете наследованием или делегированием реализации.
Допустим, у нас имеется следующая иерархия классов:
type
  TA = class
    . . .
  end;

  TB = class(TA)
     . . .
  end;

  TC = class(TA)
    . . .
  end;

Через некоторое время оказалось, что у классов ТВ и ТС имеется общая функциональность, которая не была учтена в классе ТА. Исходные коды для внесения поправок недоступны. Как это будет реализовано с использованием наследования или делегирования?


> Просто так вы не встроите поле.
> Вам нужно менять функциональность класса.
Конечно. Кроме описания полей нужно ещё будет перекрыть виртуальные методы класса.


 
Игорь Шевченко ©   (2007-04-11 16:57) [31]


> RTTI знает о наличии хелперов у класса


А нафига тогда helper"ы вообще ?


 
Игорь Шевченко ©   (2007-04-11 16:58) [32]


> Через некоторое время оказалось, что у классов ТВ и ТС имеется
> общая функциональность, которая не была учтена в классе
> ТА. Исходные коды для внесения поправок недоступны.


Значит и поправки недоступны, нес па ?


 
oxffff ©   (2007-04-11 17:02) [33]


> Через некоторое время оказалось, что у классов ТВ и ТС имеется
> общая функциональность, которая не была учтена в классе
> ТА. Исходные коды для внесения поправок недоступны. Как
> это будет реализовано с использованием наследования или
> делегирования?


Кем не учтена? Вами? Автором?

> Просто так вы не встроите поле.
> Вам нужно менять функциональность класса.
Конечно. Кроме описания полей нужно ещё будет перекрыть виртуальные методы класса.

Модифицируемые методы могут быть не виртуальные(не динамические).


Самое главное, то что изменяется VTB и DMT класса.
А это уже другой класс.


Скажите как будет производится доступ к полям хелпера.
Offset уже могут быть разные?
через RTTI?


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

VTB = VMT


 
euru ©   (2007-04-11 17:06) [35]


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

Классы и ТС автоматически получат дополнительную функциональность хелпера.


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


> Через некоторое время оказалось, что у классов ТВ и ТС имеется
> общая функциональность, которая не была учтена в классе
> ТА. Исходные коды для внесения поправок недоступны



> При наследовании и делегировании недоступны. С хелперами
> это разрешимо.
> type
>   TAHelper = class helper for TA
>     . . .
>   end;
> Классы TВ и ТС автоматически получат дополнительную функциональность
> хелпера


пример в студию не затруднит ?
исходные тексты TA, TB, TC недоступны


 
euru ©   (2007-04-11 17:16) [37]


> oxffff ©   (11.04.07 17:02) [33]
> Кем не учтена? Вами? Автором?
Не учтена тем, кто создавал эту иерархию. А последующие разработчики по различным причинам (в том числе и юридическим) не могут/не имеют права вносить коррективы.


> Модифицируемые методы могут быть не виртуальные(не динамические).
Точно такая же проблема есть и при наследовании, однако она почему-то не приводит к отказу от этой парадигмы.


> Самое главное, то что изменяется VTB и DMT класса. А это
> уже другой класс.
Для компилятора, возможно, и другой. Для разработчика останется тем же.


> Скажите как будет производится доступ к полям хелпера.
> через RTTI?
А почему бы и нет?


 
_Аноним   (2007-04-11 17:27) [38]

Зачем спорить о том, чего нет? :-)


 
oldman ©   (2007-04-11 17:36) [39]


> _Аноним   (11.04.07 17:27) [38]
> Зачем спорить о том, чего нет? :-)


А мало тут было веток про НЛО, барабашек, пиво за 2.20???


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


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



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

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

Наверх




Память: 0.59 MB
Время: 0.057 c
9-1150618621
ors_archangel
2006-06-18 12:17
2007.05.20
Сихнронизация компов игры


2-1175851104
TIF
2007-04-06 13:18
2007.05.20
PageContol + WebBrowser


2-1177570386
Ega23
2007-04-26 10:53
2007.05.20
property в interface


1-1174826542
Midnighter
2007-03-25 16:42
2007.05.20
Получить указатель на объект из интерфейса


1-1174985012
Amateur
2007-03-27 12:43
2007.05.20
Преобразование TBlobStream в TStream





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