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

Вниз

Итераторы в Delphi   Найти похожие ветки 

 
Джо ©   (2006-10-10 00:38) [40]

> [39] jack128 ©   (10.10.06 00:36)
> Ketmar ©   (10.10.06 0:31) [38]
> таки да. специально делали на цэ похожим -- чтобы народ
> переманивать было проще. %-(
>
> ну дык в дельфи же тоже можно писать:
> if (a = b)                                              
>                                       then
> c();
> но никто не говорит, что дельфя сишников переманивает :-
> D

А вот делфистов на Це переманить сложнее, ибо
if a = b then
 c;
писать там нельзя :)


 
Джо ©   (2006-10-10 00:39) [41]

А оператор for, который прямо то ли оператор, то ли функция, это всегда (у меня) вызывает маленький взрыв в голове :)


 
Германн ©   (2006-10-10 00:42) [42]


> if (лог_выражение)...
> Мы не в силах распознать лог_выражение и без скобок?
>

К великому моему сожалению знаю и паскаль-компиллятор такой :-)
Хотя он просто недоделанный, имхо. :-(


 
default ©   (2006-10-10 00:49) [43]

Джо ©   (10.10.06 00:39) [41]
сишный for это потенциально адская машина, только обычно она используется в "ангельском" режиме:)


 
Джо ©   (2006-10-10 01:00) [44]

> [43] default ©   (10.10.06 00:49)
> Джо ©   (10.10.06 00:39) [41]
> сишный for это потенциально адская машина, только обычно
> она используется в "ангельском" режиме:)

Это чертовски здорово сказано.


 
vuk ©   (2006-10-10 01:06) [45]

to Юрий Зотов ©   (09.10.06 23:11) [21]:
>Простейший цикл... простейший проход по массиву/списку/коллекции
>объектов... а как много "хвилософфии"...
Хвилософия, она иной раз полезная бывает. Имея итератор в качестве абстракции можно реализовать эффективный перебор коллекций (не имею в виду TCollection), устроенных совершенно по-разному, например масив и список(настоящий, а не TList). Структуры данных совершенно разные, методы доступа тоже, но итератор позволяет делать перебор в клиентском коде совершенно одинаково. Code Reuse, однако. :)


 
Ketmar ©   (2006-10-10 01:41) [46]

сишный фор -- это тяжёлое наследие макросов и комбайнов. %-)


 
Zeqfreed ©   (2006-10-10 07:23) [47]

> [46] Ketmar ©   (10.10.06 01:41)

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

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


 
Cyrax ©   (2006-10-10 08:30) [48]

Насчёт сишного оператора for. Реализован максимально гибко и качественно.
А вот "извраты", которые с ним можно сотворить - это всё на совести извращенцев. Нам же предоставляется гибкий инструмент, который не обязан быть урезанным (по современным меркам) только из-за того, что с ним можно извращаться.

(Кстати, подобное мнение есть и относительно C#: "Трудности новичков нельзя рассматривать когда мы говорим о профессиональных прграммистах, это похоже на принятие закона, что все велосипеды должны быть трехколесными, потому что маленьким детям трудно без них ездить". Доля правдя в этом есть. Есть и такое мнение: "Безусловно, победит подход C#. Это объективный процесс, который не остановить. Низкоуровневые оптимизации уходят из рабочего процесса программистов". И в этом есть доля правды, хотя предпочитаю переход на C#-подобные средства только после изучения этих "низкоуровневых оптимизаций".)

Что касается паскаля, то его for откровенно слаб в этом отношении (опять-таки по современным меркам)...


 
default ©   (2006-10-10 09:03) [49]

ну что ты

> Итераторы в Delphi
> Как их реализовать?

выполнил задуманное?


 
Cyrax ©   (2006-10-10 09:18) [50]

default ©   (10.10.06 09:03) [49]
выполнил задуманное?

Которое ето - да, то - ещё нет...


 
default ©   (2006-10-10 09:24) [51]

Cyrax ©   (10.10.06 09:18) [50]

> Которое ето - да, то - ещё нет...

я про которое ето
покажи что накодил(


 
Cyrax ©   (2006-10-10 09:27) [52]

Ето - совсем не итераторы. Итераторы я не кодил...
То - это уже что-то. Покажу, когда закончу...


 
Юрий Зотов ©   (2006-10-10 10:14) [53]

> vuk ©   (10.10.06 01:06) [45]

> Хвилософия, она иной раз полезная бывает.

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

> Имея итератор в качестве абстракции можно реализовать эффективный
> перебор коллекций (не имею в виду TCollection), устроенных совершенно
> по-разному, например масив и список(настоящий, а не TList). Структуры
> данных совершенно разные, методы доступа тоже, но итератор позволяет
> делать перебор в клиентском коде совершенно одинаково.

Леш, вот эти 2 строки дают ровно то же самое (использую синтаксис Delphi, но это не значит, что имеется в виду только она):
property Count: integer...
property Items[Index: integer]: TObject... ;


Ты прекрасно понимаешь, что на любом ОО-языке не представляет абсолютно никакой проблемы создать внутри любого класса-списка (массива, коллекции...) некий публичный подкласс-итератор, унаследованный от стандартного предка и имеющий стандартные методы (First, Last, Next, Prev, HasNext, HasPrev и т.д.).

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

Keep It Simple, понимаешь? Это значит, что не надо притягивать философию за уши и высасывать ее из пальца. Лучше оставить ее для более серьезных вещей, где она действительно нужна. Иначе она становится "хвилософфией".


 
vuk ©   (2006-10-10 10:33) [54]

to Cyrax ©   (10.10.06 08:30) [48]:
>Что касается паскаля, то его for откровенно слаб в этом отношении (опять-
>таки по современным меркам)...
В паскале for реализует цикл со счетчиком. Все. Никаких других функций и заморочек. Хочется другого - используется другой вид цикла.

to Юрий Зотов ©   (10.10.06 10:14) [53]:
>Но только тогда, когда она не из пальца высосана и не за уши притянута.
Бывает. Что лично я в данном конкретном случае делал бы, я уже писал в своем ответе автору ветки.

>Но... вот эти 2 две простейшие строчки дают ровно то же самое.
Оно конечно да. Только вот не для всех структур данных индексный метод доступа эффективен, я специально списочные структуры упоминал.


 
Sandman29 ©   (2006-10-10 10:49) [55]

Юрий Зотов

Даже ненависть к Java не поможет реализовать Iterator с помощью только Count и Items. В каких случаях? Сами догадайтесь, чтобы не пришлось читать LMD.

Вот Вам подсказка.
Interface Iterator<E>
boolean hasNext()        Returns true if the iteration has more elements. 
E next()           Returns the next element in the iteration. 
void remove()           Removes from the underlying collection the last element returned by the iterator (optional operation)


 
Игорь Шевченко ©   (2006-10-10 11:25) [56]

Юрий Зотов ©   (09.10.06 23:11) [21]


> После знакомства с Джавой не могу отделаться от ощущения,
>  что мир катится к ламеризму.


А мужики-то и не знают...Пишут себе. Потихоньку на C# с его скобками переползают, катятся туда же.

Дядьки там буржуйские всякие паттерны придумывают - нафига, спрашивается ?


 
pasha_golub ©   (2006-10-10 12:50) [57]

Хочу видеть пример итератора, аж кипятком писаю.


> Sandman29 ©   (10.10.06 10:49) [55]


> Даже ненависть к Java не поможет реализовать Iterator с
> помощью только Count и Items.

Я - ламер! Можно мне ответ на этот вопрос увидеть?


 
Sandman29 ©   (2006-10-10 12:52) [58]

pasha_golub ©   (10.10.06 12:50) [57]

Конечно, можно. Задайся вопросом - всегда ли известен Count.


 
pasha_golub ©   (2006-10-10 12:55) [59]


> Sandman29 ©   (10.10.06 12:52) [58]
>
> pasha_golub ©   (10.10.06 12:50) [57]
>
> Конечно, можно. Задайся вопросом - всегда ли известен Count.
>

При нормальной проектировке всегда. Ведь при добавлении итема, я могу увеличивать счетчик количества, а при удалении (будь-то даже стек или очередь) уменьшать.


 
Sandman29 ©   (2006-10-10 12:58) [60]

pasha_golub ©   (10.10.06 12:55) [59]

А при чем здесь очередь? Это же универсальный итератор.
Например, SELECT FIRST 20 FROM, зачем SELECT NEXT 20 и т.д. Заранее неизвестно, на каком селекте будет облом и сколько именно записей вернется.


 
default ©   (2006-10-10 13:08) [61]

+[60]
да взять хотя бы текстовый файл и его итерирование по строкам
чтобы узнать число строк надо прочитать весь файл, что ни в какие ворота не лезет


 
Игорь Шевченко ©   (2006-10-10 13:16) [62]

pasha_golub ©   (10.10.06 12:55) [59]

Не всегда. Например, при выборке из базы данных


 
pasha_golub ©   (2006-10-10 13:31) [63]

Значит я не понимаю сути итератора. :-)


 
Игорь Шевченко ©   (2006-10-10 13:32) [64]

pasha_golub ©   (10.10.06 13:31) [63]


> Значит я не понимаю сути итератора


Читай и воздастся тебе по чтению твоему.


 
pasha_golub ©   (2006-10-10 13:39) [65]


> Игорь Шевченко ©   (10.10.06 13:32) [64]


> Читай и воздастся тебе по чтению твоему.
>

В каком источнике мудрость сия?


 
default ©   (2006-10-10 13:41) [66]

pasha_golub ©   (10.10.06 13:31) [63]
что может быть непонятно?
если брать пример с текстовым файлов
пусть размер этого файла - 2 гига
а мне надо проитерировать(просмотреть) первые две строки файла
(возможно другое количество, короче это неизвестно на стадии разработки)
так вот ради этих двух строк если использовать вариант с Count придётся перешерстить все 2 гига для подсчёта количества строк притом для того чтобы перебрать каких-то две первые строчки файла
как?


 
default ©   (2006-10-10 13:44) [67]

вот простой интерфейс итератора

public interface IEnumerator
   {
// Interfaces are not serializable
       // Advances the enumerator to the next element of the enumeration and
       // returns a boolean indicating whether an element is available. Upon
       // creation, an enumerator is conceptually positioned before the first
       // element of the enumeration, and the first call to MoveNext
       // brings the first element of the enumeration into view.
       //
       bool MoveNext();
   
       // Returns the current element of the enumeration. The returned value is
       // undefined before the first call to MoveNext and following a
       // call to MoveNext that returned false. Multiple calls to
       // GetCurrent with no intervening calls to MoveNext
       // will return the same object.
       //
       Object Current {
           get;
       }
   
       // Resets the enumerator to the beginning of the enumeration, starting over.
       // The preferred behavior for Reset is to return the exact same enumeration.
       // This means if you modify the underlying collection then call Reset, your
       // IEnumerator will be invalid, just as it would have been if you had called
       // MoveNext or Current.
       //
       void Reset();
   }


 
Игорь Шевченко ©   (2006-10-10 13:46) [68]

pasha_golub ©   (10.10.06 13:39) [65]


> В каком источнике мудрость сия?


Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес
"Приемы объектно-ориентированного проектирования. Паттерны проектирования"


 
han_malign ©   (2006-10-10 13:49) [69]


> Заранее неизвестно, на каком селекте будет облом и сколько именно записей вернется.

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

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

> > Переводи в классы и списки классов.
> В данном случае это крайне неэффективно...


 
Игорь Шевченко ©   (2006-10-10 13:55) [70]

han_malign ©   (10.10.06 13:49) [69]


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


А думать надо не только о себе.


 
default ©   (2006-10-10 14:01) [71]

han_malign ©   (10.10.06 13:49) [69]
в универсальных методах обычно типичные входные данные обрабатывают оптимальным образом, а все остальные - не очень оптимальным, зато универсальным
типовая практика


 
vuk ©   (2006-10-10 15:11) [72]

to default ©   (10.10.06 14:01) [71]:
>а все остальные - не очень оптимальным, зато универсальным
Так вот как раз итераторы и позволяют универсальность с оптимальностью подружить.


 
Cyrax ©   (2006-10-14 01:45) [73]

default ©   (07.10.06 00:07) [14]
посмотри как сделаны итераторы в .NET, например, в класс Stack, ArrayList, Quene,...
итераторы там просто перебор элементов

Это частичная реализация итераторов в широком (и общепринятом) понимании. В Delphi, например, вообще не используется термин "итератор". Но это не значит, что их нет...

итератора дословно - перечислитель, ни о каком УПРАВЛЕНИИ речи не идёт

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

Джо ©   (07.10.06 02:27) [17]
Как раз наоборот, вроде. :) Перебор, собственно, и есть главная функция итераторов. А "управляем" мы и ими или нет — дело десятое...

Возможно так обстоит дело с C#. Но не с Python и C++...

Юрий Зотов ©   (09.10.06 23:11) [21]
Простейший цикл... простейший проход по массиву/списку/коллекции объектов... а как много "хвилософфии"...

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

После знакомства с Джавой не могу отделаться от ощущения, что мир катится к ламеризму.
Не стану утверждать, что это ощущение  безусловно верно, но все же плдтверждения тому есть.
Это еще одно?

Да, катится. И очень быстро...

isasa ©   (10.10.06 00:02) [30]
Долго крепился, но влезу.
Это от того, что при варианте
type *var;  // type var[];
type **var;  // type var[][];
с последующей
var = (type*)calloc(nSize, typeof(type));
...
Ну очень надо помнить nSize в дальнейшем. Что дико раздражает, когда сравниваешь с динамическими массивамив Дельфи. :)

Не хуже, чем статические массивы паскаля...
А для этих целей нужно использовать динамические массивы C++...

Юрий Зотов ©   (10.10.06 00:30) [37]
Даже и в языке - убивает хотя бы обилие скобок. Наследие C ?
if (лог_выражение)...
Мы не в силах распознать лог_выражение и без скобок?

И не в силах распознать блок операторов без then ?..
И вообще, в if может быть не только логическое выражение... и много чего ещё... Это всё в сторону гибкости и эффективности...

obj.func()
Мы не в силах отличить метод от поля и без скобок?

Удобочитаемость кода. Не думаю, что поставить две скобки сложнее, чем написать begin, end, then и т.п.

Юрий Зотов ©   (10.10.06 10:14) [53]
> vuk ©   (10.10.06 01:06) [45]
> Хвилософия, она иной раз полезная бывает.
Бывает, Леш. Но только тогда, когда она не из пальца высосана и не за уши притянута. Иными словами, когда она введена для дела, а не выпендрежа лишь ради - такое тоже бывает.
Keep It Simple, понимаешь? Это значит, что не надо притягивать философию за уши и высасывать ее из пальца. Лучше оставить ее для более серьезных вещей, где она действительно нужна. Иначе она становится "хвилософфией".

Думаю, это не относится к текущей ветке...

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

В C++ никаких классов посредников для этих целей (я об итераторах) не используется... Кроме того, итераторы в C++ реализованы на уровне стандарта, что сильно облегчает жизнь ~трудящихся~...

vuk ©   (10.10.06 10:33) [54]
to Cyrax ©   (10.10.06 08:30) [48]:
>Что касается паскаля, то его for откровенно слаб в этом отношении (опять-
>таки по современным меркам)...
В паскале for реализует цикл со счетчиком. Все. Никаких других функций и заморочек. Хочется другого - используется другой вид цикла.

А вот "другое" потребует лишних "заморочек" (и не малых) в других циклах. Банальная потребность в указании шага - и придётся задействовать while или repeat, где уже теряется лаконичность, удобочитаемость и эффективность кода...

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

Всё номёками да номёками... про кокую философию речь-то идёт ?

Игорь Шевченко ©   (10.10.06 11:25) [56]
Дядьки там буржуйские всякие паттерны придумывают - нафига, спрашивается ?

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


 
Anatoly Podgoretsky ©   (2006-10-14 12:11) [74]

Ketmar ©   (10.10.06 01:41) [46]
Не называй это FOR это просто слова похожие, это вообще то WHILE


 
Ketmar ©   (2006-10-15 18:10) [75]

>[74] Anatoly Podgoretsky(c) 14-Oct-2006, 12:11
>Не называй это FOR это просто слова похожие, это вообще то
>WHILE
ну так я и говорю -- комбайн. а фором его Керниган с Ричи назвали. %-)


 
Cyrax ©   (2006-10-15 19:58) [76]

vuk ©   (07.10.06 11:45) [18]
to Cyrax:
Возьмите книжку какую-нибудь, ну хотя бы Буча...

Можно сцылку. А то скачал одну - но не ту...



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

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

Наверх




Память: 0.64 MB
Время: 0.054 c
3-1157410788
Strech
2006-09-05 02:59
2006.11.05
фильтр по датам в Access


2-1161578461
X_ksandr_X
2006-10-23 08:41
2006.11.05
Корректное завершение программ


3-1157487661
Itonix
2006-09-06 00:21
2006.11.05
Decision Cube


2-1161336424
Батя
2006-10-20 13:27
2006.11.05
Господа, как в Imagelist программно добоылять bmp-шки.


3-1157636310
SergP.
2006-09-07 17:38
2006.11.05
Неравномерность скорости выборки из базы...





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