Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Итераторы в 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;
Скачать: CL | DM;

Наверх




Память: 0.65 MB
Время: 0.039 c
2-1161156631
Kray
2006-10-18 11:30
2006.11.05
onShow не работает


15-1160597254
iZEN
2006-10-12 00:07
2006.11.05
Ищу песни.


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


1-1158977686
nsvi
2006-09-23 06:14
2006.11.05
Проблемы с Word.Basic


2-1160819011
T54
2006-10-14 13:43
2006.11.05
ООП