Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Объект-итератор (https://javascript.ru/forum/offtopic/8945-obekt-iterator.html)

x-yuri 21.04.2010 21:21

Объект-итератор
 
имеется, например, журнал ошибок. Нужно написать объект-итератор, с помощью которого можно было бы последовательно просмотривать сообщения (от первого к последнему). При этом нельзя терять возвращаемые сообщения. Какой бы вы предложили интерфейс? Язык программирования - не имеет значения

почему нельзя терять сообщения: для некоторых сообщений используется krumo, который при первом вызове, кроме результата выводит css+js

B~Vladi 22.04.2010 20:40

Цитата:

Сообщение от x-yuri
Какой бы вы предложили интерфейс? Язык программирования - не имеет значения

Ну это смотря под какую среду пишешь. Или подразумевался веб?

x-yuri 22.04.2010 22:14

пока что не знаю, как среда может повлиять. Предложи несколько вариантов

т.е. вопрос в интерфейсе итератора с указанными ограничениями. Что конкретно он будет итерировать не так важно

B~Vladi 22.04.2010 23:15

Цитата:

Сообщение от x-yuri
пока что не знаю, как среда может повлиять.

Если сравнивать браузер и DirectX, то тут преимущества очевидны. Что касается DirectX, то это уже Си.:)

Gvozd 23.04.2010 01:38

искренне не понимаю ваш вопрос
[telepatemode]
в STL вам подошел бы любой контейнер последовательности, со свзанным с ним последовательным итератором
[/telepatemode]
[telepatemode=2]
в WEB-е, вам бы подошла база ВСЕХ сообщений, и хранение последнего просмотренного сообщения в сессии.
при это вы всегда можете вернутся к началу(как сессии, так и вообще всех сообщений), и начать вновь последовательный(по uid сообщений) просмотр их
[/telepatemode]

x-yuri 23.04.2010 03:00

вопрос был об интерфейсе класса
php way:
class Itertator {
    function valid(){ ... }   // проверяет, есть ли еще элементы
    function current(){ ... }   // возвращает текущий элемент
    function next(){ ... }   // переходим к следующему и возвращаем его
}

используем, например, так:
for( $i=new Iterator(); $i->valid(); $i->next() )
    ... $i->current() ...

но так теряются возвращаемые значения ($i->next() возвращает следующий). Поэтому я бы сделал, чтобы он возвращал текущий и переходил к следующему. А current сделал бы через next, т.е. созраняем состояние, получаем с помощью next текущий, и восстанавливаем состояние (позицию), чтобы не дублировать код

java way:
class Iterator {
    function hasNext(){ ... }   // проверяем, есть ли еще элементы
    function next(){ ... }   // переходим к следующему и возвращаем его
}

использование:
while( i.hasNext() )
    ... i.next() ...

по сравнению с php-вариантом, не теряются значения и не надо реализовывать current через next

как бы сделали вы? Или прочие другие мысли...

Gvozd 23.04.2010 03:23

что вам мешает организовать ваш JAVA-style, в PHP?

вы знакомы с итераторами в STL?
они спокойно позволяют работать способами схожими с обоими вашими способами.
думаю вам это поможет
Код:

vector<int> arr;
arr.push_back(3);//добавление элемента в конец
...
arr.push_back(5);//добавление элемента в конец

//способ 1
for(vector<int>::iterator i=arr.begin();i!=arr.end();i++)
        {
        cout<<*i;
        }
//способ 2
vector<int>::iterator i=arr.begin();
while(i!=arr.end())
        {
        cout<<*i;
        i++;
        }


x-yuri 23.04.2010 09:25

Цитата:

Сообщение от Gvozd
что вам мешает организовать ваш JAVA-style, в PHP?

ничего

Цитата:

Сообщение от Gvozd
вы знакомы с итераторами в STL?
они спокойно позволяют работать способами схожими с обоими вашими способами.

php-вариант - это по сути и есть STL-вариант

C++-вариант... Опять же по сути отличие в том, что итератор здесь - внешняя сущность, указатель. В остальном, это php-вариант. И это отличие никак не влияет на озвученные мной проблемы: потеря элементов "массива" и дублирование логики в current/next

подробнее о проблемах:
1) выводим журнал, но для некоторых сообщений используем внешнюю библиотеку, которая при первом использовании вместе с результатом возвращает немного css+js. Т.е. сообщения "на лету" преобразуются и надо не потерять первое преобразованное с помощью библиотеки сообщение
2) одно сообщение на страничке не равно одному сообщению в журнале и тем более одной строке в журнале (текстовый файл), т.е. переход к следующему сообщению это не i++, поэтому я бы предпочел реализовать переход к следующему и получение текущего значения в одном методе

p.s. наверное, плохо объяснил проблему... или это ни разу не проблема... :-?
p.p.s. после того как четко объяснил проблему, стало понятно, что java-вариант в данном случае лучше подходит. Хм, где-то читал, что пытаясь объяснить кому-то проблему, сам лучше ее понимаешь

x-yuri 30.04.2010 12:48

p.p.p.s. если вынести вывод информации из итератора, первая проблема исчезает


Часовой пояс GMT +3, время: 22:19.