Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


суббота, 11 июля 2009 г.

Обобщённое программирование(generics) в Delphi 2009 для Win32. Часть 1. Введение.

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


Примечания к “переводу”
Словарь терминов
I. Введение
I-A. Предпосылки
I-B. Что такое дженерики?


Примечания к “переводу”

Переводить это пособие оказалось не самым приятным занятием. Причина в том, что оригинальный текст был написан на французском, потом кое-как переведён на английский самим автором.

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

Другая часть работы вызвавшая у меня трудности – это адекватный перевод терминов. Буду признателен за замечания и уточнения.

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

Словарь терминов

  • generics - дженерики, генерики, параметризованные классы, шаблоны. Мне кажется, что наиболее подходящим для перевода словом в русском языке будет “обобщения”, но в переводе в основном использовал термин: дженерики;
  • generic class – обобщённый класс;
  • сast – приведение типа;
  • anonymous routines - анонимные методы;
  • routine references - процедурные ссылки;
  • ordinal type – порядковый тип (данных);
  • interface type – интерфейсный тип (данных);
  • comparer – компаратор
  • Prerequisites – предварительные условия

I. Введение

I-A. Предпосылки

Это учебное пособие предназначено для программистов с хорошим знанием языка Delphi и требует углублённого понимания принципов объектно-ориентированного программирования.

Для понимания этого пособия предварительные знания о дженериках необязательны. На эту тему уже написана масса статей по другим языкам и я не буду рассматривать в деталях вопросы типа: «Как правильно применять дженерики?». В следующей части читателю будет представлено краткое введение в дженерики, но наиболее полное понимание скорее всего придёт по мере чтения остальных частей пособия и изучения примеров.

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

I-B. Что такое дженерики?

Дженерики ещё иногда называют обобщёнными параметрами. Это название чуть лучше раскрывает суть дженериков. В отличие от параметров функций (аргументы), которые имеют значения (values), обобщённые параметры являются типами. И они используются как параметры для классов, интерфейсов, записей или (реже) методов.

Чтобы стало понятнее, вот пример части класса TList<T>, который можно найти в модуле Generics.Collections.pas.

info Да, в имени модулей разрешается использовать точки (кроме .pas, естественно). Это не имеет ничего общего с концепцией имен в. NET, как и с пакетами в Java. Точки - это то же самое, что и _ (символ подчёркивания): просто часть названия.

type
   TList<T> = class(TEnumerable<T>)
// ...  
public    
// ...
    function Add(const Value: T): Integer;
     procedure Insert(Index: Integer; const Value: T);
     function Remove(const Value: T): Integer;
     procedure Delete(Index: Integer);
     procedure DeleteRange(AIndex, ACount: Integer);
     function Extract(const Value: T): T;
     procedure Clear;
     property Count: Integer read FCount write SetCount;
     property Items[Index: Integer]: T read GetItem write SetItem; default;
   end;

Может Вы уже обратили внимание на загадочность типа Т. Но действительно ли это тип? Нет, это обобщённый параметр. Если мне нужен список целых чисел (Integer), то имея такой класс в своем распоряжении, я буду использовать TList <Integer>, а не "обычный" TList, наряду с кучей приведений типов (casts) в коде!

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

Как я сказал ранее, я не буду распространяться на темы того, почему и как работают генерики. Я сразу же перейду к повседневной работе с ними. Если Вам кажется, что у Вас всё ещё нет полного понимания того о чём я говорю, не беспокойтесь: все станет яснее в ближайшее время. Вы также можете прочитать(на французском языке) туториал Les génériques SOUS Delphi. NET, который написал Laurent Dardenne.


Права на оригинальный текст принадлежат Sébastien Doeraene. Copyright ©2008-2009.

Права на перевод принадлежат Алексею Тимохину. Copyright ©2009.


9 комментариев:

  1. Анонимный11 июля 2009 г., 20:44

    ааа....
    а дальше?!

    ОтветитьУдалить
  2. Дальше - позже. =)

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

    ОтветитьУдалить
  3. Неплохо; не буквально; лучше, чем у меня ;)

    Несколько мелких замечаний: "Вы можете легко видеть таинственность типа Т" очень уж режет слух эта "таинственность", не кажется? Не программистское больно слово.
    Лучше бы: "Вы уже сейчас можете видеть странность типа T".

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

    Кривость предложения: "Дженерики (generics) таким образом позволяют, объявить набор (потенциальных) классов используя один кодом".
    Вариант: "Дженерики (generics) таким образом позволяют объявить набор (потенциальных) классов используя единственный исходный код".

    И ещё: перед открывающейся круглой скобкой вообще-то ставятся пробелы ;)

    По терминологии замечаний нет (хотя лично я предпочитаю "Генерики").

    ОтветитьУдалить
  4. > Неплохо; не буквально; лучше, чем у меня ;)
    Спасибо, Саш. =))) На самом деле, у тебя замечательнейшие переводы. :)

    Я и рад бы перевести буквально, но с этим текстом такое не пройдёт: из-за тройного перевода получается полная дребедень. :D

    Отдельное спасибо за исправления. Эту часть я переводил самой первой, и ещё наивно пытался сохранить оригинальный стиль. =)

    > И ещё: перед открывающейся круглой скобкой вообще-то ставятся пробелы ;)
    Я был уверен, что пробел в этом случае не ставится. А сейчас погуглил и понял, что ошибался. Спасибо за замечание.

    ОтветитьУдалить
  5. Ссылка на "Обобщенное программирование под .NET" немного кривоватая - не открывается.

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

    А в общем перевод и статья хорошие, спасибо. ))

    ОтветитьУдалить
  6. Валерий, спасибо. Ссылку о NET исправил, добавил ссылки на остальные части.

    ОтветитьУдалить
  7. Эх, как хотелось бы чего-нибудь вроде:
    type
    TMyEvent = procedure (const AParam: T) of object;

    TMyClass = class
    OnMyEvent: TMyEvent<{тут любой нужный тип}>
    end;

    ОтветитьУдалить
  8. Эх, как хотелось бы чего-нибудь вроде:
    Какие проблемы?
    type
    TMyEvent = procedure(AParam: T) of object;

    ОтветитьУдалить
  9. type
    TMyEvent<T> = procedure(AParam: T) of object;

    ОтветитьУдалить

Постоянные читатели