Форум: "Прочее";
Текущий архив: 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