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

Вниз

Delphi 2007. Нас опять не слышат.   Найти похожие ветки 

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

Sergey Masloff   (07.03.07 23:34) [76]


> А про обертки из Бакнелла (я так понимаю) в чем упрощение
> по сравнению с обобщенным классом?


Не, не из Бакнелла. Из Фаулера, про рефакторинг. Там у него хорошая мысль есть, что незачем делать классы, которые ничего не делают - это мусор, а не классы.

просто так   (07.03.07 23:36) [79]


> тлист, вид с боку. принципиальная разница - куча наследников
> или куча инкапсуляторов


Разница вообще-то есть, мне в наследниках не требуется возможность вызывать методы TList"а Exchange, Delete и еще кучу.


 
Суслик ©   (2007-03-07 23:53) [81]

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

(удалит же пост злыдеть какой-нить :(  )


 
просто так   (2007-03-07 23:55) [82]

>>Разница вообще-то есть, мне в наследниках не требуется возможность вызывать методы TList"а Exchange, Delete и еще кучу.
я понимаю, разницы нет в размерах копипаста.
а вот я нипонимаю почему рутинный копипаст не переложить на компилятор? и почему увидев в исходнике конструкцию "generic" он сразу становится непонятным. гораздо проще просмотреть 10 "почти" одинаковых  исходников, и выругаться найдя таки тот в котором мы "+" забыли исправить на "-", при контекстной замене


 
Суслик ©   (2007-03-07 23:56) [83]


> просто так   (07.03.07 23:55) [82]

ну что ты так убиваешься (только СВОЕ время впустую тратишь)  - это же религия: никогда не отказываться от своего первоначального высказывания.


 
oxffff ©   (2007-03-07 23:57) [84]


> фигня а не топик.
> один уперся как скала в первоначальное свое высказываение,
>  другие пытаются сдвинуть скалу
>
> (удалит же пост злыдеть какой-нить :(  )


Вы утверждали выше что и макросы будут.
А множественное наследование тоже?

Истина?


 
oxffff ©   (2007-03-08 00:01) [85]

>Суслик ©   (07.03.07 14:07) [50]
>и макросы будут, множественное наследие тоже будет

Это пост истина или шутка?


 
Celades ©   (2007-03-08 00:11) [86]

А можно вопрос? А зачем тогда такой делфи, если есть уже такой С++ или С#?


 
Игорь Шевченко ©   (2007-03-08 00:20) [87]

просто так   (07.03.07 23:55) [82]


> а вот я нипонимаю почему рутинный копипаст не переложить
> на компилятор? и почему увидев в исходнике конструкцию "generic"
> он сразу становится непонятным. гораздо проще просмотреть
> 10 "почти" одинаковых  исходников, и выругаться найдя таки
> тот в котором мы "+" забыли исправить на "-", при контекстной
> замене


Я, собственно с этими generics в шарпе нахлебался достаточно, не говоря уже о С++, любую хорошую идею обычно умудряются довести до состояния полностью неочевидного кода и главное, чтобы в итоге что-то написать полезное для работы с классами или интерфейсами (в C#), прихоится выполнять массу работы по склейке этих вот...параметризованных типов.
Время жалко, если честно.


 
oxffff ©   (2007-03-08 00:26) [88]


> Я, собственно с этими generics в шарпе нахлебался достаточно,
>  не говоря уже о С++, любую хорошую идею обычно умудряются
> довести до состояния полностью неочевидного кода и главное,
>  чтобы в итоге что-то написать полезное для работы с классами
> или интерфейсами (в C#), прихоится выполнять массу работы
> по склейке этих вот...параметризованных типов.
> Время жалко, если честно.


Подождите.
Сделать можно даже то, о чем я спрашивал
oxffff ©   (07.03.07 23:36) [77].

Кстати C++ этого не может.

The MakeGenericType method allows you to write code that assigns specific types to the type parameters of a generic type definition, thus creating a Type object that represents a particular constructed type. You can use this Type object to create run-time instances of the constructed type.

Вот это метапрограммирование.


 
просто так   (2007-03-08 00:26) [89]

>>Время жалко, если честно.
ок.


 
Игорь Шевченко ©   (2007-03-08 00:32) [90]

oxffff ©   (08.03.07 00:26) [88]


> Вот это метапрограммирование.


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


 
oxffff ©   (2007-03-08 00:45) [91]


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


Я с вами полностью согласен.
Все это так запутает, что элегантность может превратиться в ужасную
невыразительность.
Почему я спросил, просто интересно внутреннее устройство.
Точнее как именно MSIL хранит generic, как инстанцирует.
Как это делает в run time.
Хотя это очень просто посмотреть под отладчиком IL.
Найти бы время на это.


 
Игорь Шевченко ©   (2007-03-08 00:50) [92]

oxffff ©   (08.03.07 00:45) [91]

Можно еще и MONO посмотреть, проект с исходниками. Я, честно говоря, не помню, сделали они уже generics или нет.


 
oxffff ©   (2007-03-08 01:29) [93]


> Игорь Шевченко ©   (08.03.07 00:50) [92]
> oxffff ©   (08.03.07 00:45) [91]
>
> Можно еще и MONO посмотреть, проект с исходниками. Я, честно
> говоря, не помню, сделали они уже generics или нет.


Да я кажется расскатал слишком губу. Я думал что этот код работает

public class GenericSample<T>
{
   public GenericSample()
   {
       
   }
   public void InvokeUnknown(T x)
   {
   x.Someproc();
   }
}

Попытка вызвать у  неизвестного типа метод.
Думал, как это сделали.
Первое решение через invoke методов через Reflection.
Но это медленно. Потом возможно первый вызов через Reflection, а следующие напрямую.

Но этот код не работает

Error 1 T" does not contain a definition for "Someproc"

Как оказалось generics то, совсем не generics.

Что касаемо run type инстанцирования их. То не думаю, что это не решаемо.

То ли дело С++ и template. Но там препроцессор.
Да и программирование там одно сплошное - Макропрограммирование.


 
Celades ©   (2007-03-08 01:33) [94]


> То ли дело С++ и template. Но там препроцессор.

шаблоны там обрабатываются компилятором.


 
oxffff ©   (2007-03-08 01:46) [95]


> Celades ©   (08.03.07 01:33) [94]
>
> > То ли дело С++ и template. Но там препроцессор.
>
> шаблоны там обрабатываются компилятором.


А вы уверены?
Открываем книгу Альфред Ахо "Компиляторы принципы, технологии иструменты", MSDN и google.

Из google

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

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

Так что вы ошибаетесь.
Но не суть важно.

Важно что С++ делает это complite Time


 
oxffff ©   (2007-03-08 01:49) [96]

http://www.realcoding.net/article/view/4265


 
Celades ©   (2007-03-08 02:19) [97]


> А вы уверены?

абсолютно

>  С++ этy функцию выполняет препроцессор

нет. В С++ препроцессор С, поэтому о шаблонах он ничего не знает, как и отипах и т.д.

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

нет. Вы сами не понимаете, что такое шаблоны в С++. Они обрабатываются компилятором. Поэтому в частности возможны вывод типов и epression templates. Например:

template< typename T >
T min( T& a, T& b )
{
  return a < b ? a : b;
}
//...
int a = min( 234, 25 );


 
Celades ©   (2007-03-08 02:42) [98]


> http://www.realcoding.net/article/view/4265

бред


 
jack128 ©   (2007-03-08 03:08) [99]

Celades ©   (08.03.07 2:19) [97]
Они обрабатываются компилятором

это понятно, но смысл от этого не менчется. В С++ - шаблоны - суть макросы. В отличии от C#.


 
Celades ©   (2007-03-08 03:13) [100]


> это понятно, но смысл от этого не менчется. В С++ - шаблоны
> - суть макросы. В отличии от C#.

да. продвинутые "макросы"


 
oxffff ©   (2007-03-09 11:16) [101]


> > А вы уверены?
>
> абсолютно
>
> >  С++ этy функцию выполняет препроцессор
>
> нет. В С++ препроцессор С, поэтому о шаблонах он ничего
> не знает, как и отипах и т.д.


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


> jack128 ©   (08.03.07 03:08) [99]
> Celades ©   (08.03.07 2:19) [97]
> Они обрабатываются компилятором
> это понятно, но смысл от этого не менчется. В С++ - шаблоны
> - суть макросы. В отличии от C#.


Constraint  Description  
where T: struct
The type argument must be a value type. Any value type except Nullable can be specified. See Using Nullable Types (C# Programming Guide) for more information.

where T : class
The type argument must be a reference type, including any class, interface, delegate, or array type.

where T : new()
The type argument must have a public parameterless constructor. When used in conjunction with other constraints, the new() constraint must be specified last.

where T : <base class name>
The type argument must be or derive from the specified base class.

where T : <interface name>
The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also be generic.

where T : U
The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.

....
By constraining the type parameter, you increase the number of allowable operations and method calls to those supported by the constraining type and all types in its inheritance hierarchy. Therefore, when designing generic classes or methods, if you will be performing any operation on the generic members beyond simple assignment or calling any methods not supported by System.Object, you will need to apply constraints to the type parameter.

When applying the where T : class constraint, it is recommended that you do not use the == and != operators on the type parameter because these operators will test for reference identity only, not for value equality. This is the case even if these operators are overloaded in a type used as an argument. The following code illustrates this point; the output is false even though the String class overloads the == operator.

Весьма сомнительные шаблоны. Поскольку для "нормальной работы", кроме assign operation, мы должны использовать constraints, фактически сокращая generalization, т.е указывая базовый тип, мы расширяем набор операций.

Нужны ли нам такие псевдошаблоны? (кроме assign operation)


 
pasha_golub ©   (2007-03-09 13:01) [102]


> Игорь Шевченко ©   (07.03.07 23:28) [73]


>
> Раньше писал. Потом прочитал умную книжку и перестал писать
> только затем, чтобы там хранились экземпляры определенного
> типа, а стал добавлять дополнительное поведение и классы
> перестали быть потомками TList, а стали список в себе инкапсулировать.
>
>

А можно пример, пожалуйста? Вот у меня сейчас около 10 классов, и соответственно 10 списков на каждый. Нехилое загромождение. Как это победить по умному?


 
Sapersky   (2007-03-09 14:37) [103]

Есть такой трюк, который можно применять и со стандартным TList, и со своими контейнерами, хотя его наверняка посчитают "небезопасным":

Type
 PPointerListRef = ^PPointerList; // ну не PPPointerList же :)

 TListEx = class(TList) // или ObjectList
 private
   FRef : PPointerListRef;
 protected
   procedure Grow; override; // begin Inherited; FRef^ := List; end;
 public
   constructor Create(ARef : PPointerListRef); // begin FRef := ARef; end;
   // ещё можно Clear переопределить
 end;

При использовании:
Type
   PMyClassList = ^TMyClassList;
   TMyClassList = array[0..MaxListSize - 1] of TMyClass;

Var
 List : TListEx;
 Items : PMyClassList;
List := TListEx.Create(@Items);

Далее, если нужен доступ к элементам, обращаемся к Items.
Объявления типов всё равно требуются, но т.к. это не классы, они не маячат в Code Explorer и не раздражают :)


 
oxffff ©   (2007-03-09 14:46) [104]

>Нужны ли нам такие псевдошаблоны? (кроме assign operation)

Все же отвечу сам на свой вопрос. Польза будет.
Только вот очень интересна реализация для Win32.

В этом может оказать содействие Дмитрий Тимохов.

Давайте у него и спросим.

Уважаемый Дмитрий.
Как они собираются их реализовать?


 
Суслик ©   (2007-03-09 14:58) [105]

Не знаю (честно)


 
Игорь Шевченко ©   (2007-03-09 15:29) [106]

pasha_golub ©   (09.03.07 13:01) [102]


> А можно пример, пожалуйста? Вот у меня сейчас около 10 классов,
>  и соответственно 10 списков на каждый. Нехилое загромождение.
>  Как это победить по умному?


Пример можно посмотреть в классе TDataSet - списком являются Fields, но, как ты понимаешь, TDataSet не наследуется от списка, а содержит список полей в себе, наряду с другими полезными методами и свойствами. Хотя мог бы и наследоваться от списка...


 
oxffff ©   (2007-03-09 16:54) [107]


> Не знаю (честно)


А они то сами знают?
Хотят их ввести аж c delphi 1.0 (Где то читал).


 
Суслик ©   (2007-03-09 17:28) [108]


> А они то сами знают?
> Хотят их ввести аж c delphi 1.0 (Где то читал).

вообще репорт недавно открыли. номер точно не помню.


 
oxffff ©   (2007-03-09 17:45) [109]


> Суслик ©   (09.03.07 17:28) [108]
>
> > А они то сами знают?
> > Хотят их ввести аж c delphi 1.0 (Где то читал).
>
> вообще репорт недавно открыли. номер точно не помню.


Регулярно посейшая этот репорт.
Только странно.
Голосов месяц назад было 130. А сейчас 125.

Думаю это показательно. Результат с нововедения из .NET налицо.
Людям не нравиться.


 
Суслик ©   (2007-03-09 17:46) [110]

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


 
Celades ©   (2007-03-09 20:09) [111]


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

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


 
Игорь Шевченко ©   (2007-03-09 21:37) [112]


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


Это везде


 
oxffff ©   (2007-03-09 23:08) [113]


> Celades ©   (09.03.07 20:09) [111]
>
> > Собственно у меня нет желания вам что то доказывать.
> > Вы даже внимательно не хотите прочитать.
>
> прочитать что, тут статью которыю ты привел, то там ни один
> код не компиляруется, т.к. в С++ нет просто таких констоукций,
>  которые там приведены. и автор явно не в себе.

Вы правы.
A class template is first specialized and then instantiated by the compiler.

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


Спасибо за комплимент.



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

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

Наверх





Память: 0.69 MB
Время: 0.039 c
2-1173121140
Riply
2007-03-05 21:59
2007.04.01
Сравнение строк.


15-1173528716
Тим
2007-03-10 15:11
2007.04.01
Java для Opera 9.10


2-1173162070
Ш-К
2007-03-06 09:21
2007.04.01
Анализ массива элементов


5-1149830586
DimaBr
2006-06-09 09:23
2007.04.01
Нотационный список.


6-1161170836
wolchonok29
2006-10-18 15:27
2007.04.01
Передача группы файлов по сети





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