В пособии также рассматриваются анонимные методы и процедурные ссылки.
- Оригинальный текст: Sébastien Doeraene. Copyright ©2008-2009.
- Перевод: Алексей Тимохин. Copyright ©2009.
- Дата публикации: 13 ноября 2008 года
- Дата перевода: 10 июля 2009 года.
Примечания к “переводу”
Словарь терминов
I. Введение
I-A. Предпосылки
I-B. Что такое дженерики?
Примечания к “переводу”
Переводить это пособие оказалось не самым приятным занятием. Причина в том, что оригинальный текст был написан на французском, потом кое-как переведён на английский самим автором.
Поэтому большая часть работы над переводом свелась к выяснению того, что же хотел сказать автор набором использованных слов.
Другая часть работы вызвавшая у меня трудности – это адекватный перевод терминов. Буду признателен за замечания и уточнения.
В некоторых местах я просто переписывал текст своими словами, иногда сокращая, иногда дополняя мысль. Так что, по сути, это не перевод, а скорее очень точный пересказ. Ссылки на франкоязычные статьи были заменены ссылками на аналогичные материалы на русском языке.
Словарь терминов
- generics - дженерики, генерики, параметризованные классы, шаблоны. Мне кажется, что наиболее подходящим для перевода словом в русском языке будет “обобщения”, но в переводе в основном использовал термин: дженерики;
- generic class – обобщённый класс;
- сast – приведение типа;
- anonymous routines - анонимные методы;
- routine references - процедурные ссылки;
- ordinal type – порядковый тип (данных);
- interface type – интерфейсный тип (данных);
- comparer – компаратор
- Prerequisites – предварительные условия
I. Введение
I-A. Предпосылки
Это учебное пособие предназначено для программистов с хорошим знанием языка Delphi и требует углублённого понимания принципов объектно-ориентированного программирования.
Для понимания этого пособия предварительные знания о дженериках необязательны. На эту тему уже написана масса статей по другим языкам и я не буду рассматривать в деталях вопросы типа: «Как правильно применять дженерики?». В следующей части читателю будет представлено краткое введение в дженерики, но наиболее полное понимание скорее всего придёт по мере чтения остальных частей пособия и изучения примеров.
Вот некоторые русскоязычные статьи раскрывающие тему дженериков в других языках/платформах. Суть везде одна и та же.
- Обобщённое программирование
- Generics в Java 1.5
- Обобщенное программирование под .NET
- Уроки по С++. Урок 29. Использование шаблонов функций
I-B. Что такое дженерики?
Дженерики ещё иногда называют обобщёнными параметрами. Это название чуть лучше раскрывает суть дженериков. В отличие от параметров функций (аргументы), которые имеют значения (values), обобщённые параметры являются типами. И они используются как параметры для классов, интерфейсов, записей или (реже) методов.
Чтобы стало понятнее, вот пример части класса TList<T>, который можно найти в модуле Generics.Collections.pas.
Да, в имени модулей разрешается использовать точки (кроме .pas, естественно). Это не имеет ничего общего с концепцией имен в. NET, как и с пакетами в Java. Точки - это то же самое, что и _ (символ подчёркивания): просто часть названия. |
type |
Может Вы уже обратили внимание на загадочность типа Т. Но действительно ли это тип? Нет, это обобщённый параметр. Если мне нужен список целых чисел (Integer), то имея такой класс в своем распоряжении, я буду использовать TList <Integer>, а не "обычный" TList, наряду с кучей приведений типов (casts) в коде!
Дженерики (generics) таким образом позволяют объявить набор (потенциальных) классов используя единственный исходный код, или, более официально, шаблон класса, который можно использовать с одним или несколькими типами-параметрами, по желанию. Каждый раз, когда инстанциируется новый фактический тип, вы как-будто создаёте отдельный класс, по его шаблону.
Как я сказал ранее, я не буду распространяться на темы того, почему и как работают генерики. Я сразу же перейду к повседневной работе с ними. Если Вам кажется, что у Вас всё ещё нет полного понимания того о чём я говорю, не беспокойтесь: все станет яснее в ближайшее время. Вы также можете прочитать(на французском языке) туториал Les génériques SOUS Delphi. NET, который написал Laurent Dardenne.
Права на оригинальный текст принадлежат Sébastien Doeraene. Copyright ©2008-2009.
Права на перевод принадлежат Алексею Тимохину. Copyright ©2009.
- Подробное оглавление
- Примечания к “переводу”
- I. Введение
- II. Повседневное использование на примере TList<T>
- III. Создание обобщённого класса.
- IV. Создание обобщённой записи
- V. Ограничения обобщённых типов
- VI. Использование в качестве параметра более чем одного типа
- VII. Другие типы дженериков
- VIII. Обобщённые методы
- IX. RTTI и дженерики
- Завершающе слово и ссылка на скачивание исходников (не переведено).
ааа....
ОтветитьУдалитьа дальше?!
Дальше - позже. =)
ОтветитьУдалитьЯ бы хотел учесть возможные терминологические поправки в последующих переводах.
Неплохо; не буквально; лучше, чем у меня ;)
ОтветитьУдалитьНесколько мелких замечаний: "Вы можете легко видеть таинственность типа Т" очень уж режет слух эта "таинственность", не кажется? Не программистское больно слово.
Лучше бы: "Вы уже сейчас можете видеть странность типа T".
"В отличие от параметров функций, которые имеют значения(аргументы), обобщённые параметры являются типами. И они используются как параметры для классов, интерфейсов, записей и методов (реже)." - аргументы после значений очень смущают. Не ясно, что подразумевается под значениями.
Лучше бы: "В отличие от параметров функций (аргументы), которые имеют значения (values), обобщённые параметры являются типами. И они используются как параметры для классов, интерфейсов, записей или (реже) методов.".
Кривость предложения: "Дженерики (generics) таким образом позволяют, объявить набор (потенциальных) классов используя один кодом".
Вариант: "Дженерики (generics) таким образом позволяют объявить набор (потенциальных) классов используя единственный исходный код".
И ещё: перед открывающейся круглой скобкой вообще-то ставятся пробелы ;)
По терминологии замечаний нет (хотя лично я предпочитаю "Генерики").
> Неплохо; не буквально; лучше, чем у меня ;)
ОтветитьУдалитьСпасибо, Саш. =))) На самом деле, у тебя замечательнейшие переводы. :)
Я и рад бы перевести буквально, но с этим текстом такое не пройдёт: из-за тройного перевода получается полная дребедень. :D
Отдельное спасибо за исправления. Эту часть я переводил самой первой, и ещё наивно пытался сохранить оригинальный стиль. =)
> И ещё: перед открывающейся круглой скобкой вообще-то ставятся пробелы ;)
Я был уверен, что пробел в этом случае не ставится. А сейчас погуглил и понял, что ошибался. Спасибо за замечание.
Ссылка на "Обобщенное программирование под .NET" немного кривоватая - не открывается.
ОтветитьУдалитьМне кажется что лучше бы было разместить всю статью полностью, а не разбрасывать по постам, довольно сложно отыскивать части информации. Ну или на крайний случай ссылки везде раставить на другие части.
А в общем перевод и статья хорошие, спасибо. ))
Валерий, спасибо. Ссылку о NET исправил, добавил ссылки на остальные части.
ОтветитьУдалитьЭх, как хотелось бы чего-нибудь вроде:
ОтветитьУдалитьtype
TMyEvent = procedure (const AParam: T) of object;
TMyClass = class
OnMyEvent: TMyEvent<{тут любой нужный тип}>
end;
Эх, как хотелось бы чего-нибудь вроде:
ОтветитьУдалитьКакие проблемы?
type
TMyEvent = procedure(AParam: T) of object;
type
ОтветитьУдалитьTMyEvent<T> = procedure(AParam: T) of object;