Переключение на Главную Страницу Страницы: 1 [2] 3 4 5 ОтправитьПечать
Очень популярная тема (более 25 ответов) ИТ: время жизни итератора и текущей строки (число прочтений - 21400 )
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #15 - 04. Мая 2008 :: 08:48
Печать  
Залил в модуль icpp валидацию итераторов. В 2.5  пока не стану заливать (до релиза как минимум), а то может ещё боком выйти. Сделано тупенько, через поле Version в индексе.  Всё в общем-то нормально, тесты проходят. Кроме одного: тестСохранениеИтератора - после восстановления итератора у них получается конфликт версий, потому что фильтр менялся.  И что-то я не знаю, чего тут делать. Может, ну их нафик вообще, эти методы? В свете  CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex)?

Про  CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex).  Думаю, самым правильным будет добавить такой метод в сам итератор, а не исполнять акробатических трюков без страховки под куполом цирка.

CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex)  мальца поправил, тест прилагается.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #16 - 04. Мая 2008 :: 10:18
Печать  
ADirks писал(а) 04. Мая 2008 :: 08:48:
Залил в модуль icpp валидацию итераторов. В 2.5  пока не стану заливать (до релиза как минимум), а то может ещё боком выйти. Сделано тупенько, через поле Version в индексе.  Всё в общем-то нормально, тесты проходят. Кроме одного: тестСохранениеИтератора - после восстановления итератора у них получается конфликт версий, потому что фильтр менялся.  И что-то я не знаю, чего тут делать. Может, ну их нафик вообще, эти методы? В свете  CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex)?

Леша, а надо ли при установке фильтра вырубать существующие итераторы?

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

Цитата:
Про  CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex).  Думаю, самым правильным будет добавить такой метод в сам итератор, а не исполнять акробатических трюков без страховки под куполом цирка.

Да, полностью согласен, это плохие методы.
Но FindRow - это не замена.
Этот метод имеет сложность от log(N) до N, а нужна возможность использования нескольких независимых итераторов, причем с затратами 0 (ноль).

Цитата:
CVTExtProvider::FindRow(CVTExtIterator* pIterator, int nRowIndex)  мальца поправил, тест прилагается.

А где поправил, не нашел пока...
Или ты хотел сказать метод Last()?

Код
Выбрать все
	nCurrentRow = pCurrentNode->ID;
	if( pCurrentNode->ArrayEqualIDs )
		IndexInNode = pCurrentNode->ArrayEqualIDs->size();
	else
		IndexInNode = 0;
 


Леш, вот здесь, ты уверен, что nCurrentRow не должен сдвигаться на последнюю строку равных значений?
Т.е. точно должно отличаться от GoToNode_Backward()?

Прости мою дотошность, но нельзя ли небольшой ликбез? Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #17 - 04. Мая 2008 :: 10:48
Печать  
Цитата:
Леша, а надо ли при установке фильтра вырубать существующие итераторы?

Я понимаю, сейчас, в текущей организации ИТ, это имеет смысл.
Но если мыслить в терминах независимых итераторов /фильтров - то не нужно этого делать.
Завтра я захочу иметь несколько итераторов с разными фильтрами - у меня должна быть возможность их использования.
Да, я имел в виду именно текущую реализацию. Для отдельно живущих итераторов это ни к чему.

Цитата:
Но FindRow - это не замена.
Этот метод имеет сложность от log(N) до N, а нужна возможность использования нескольких независимых итераторов, причем с затратами 0 (ноль).
Если итераторы будут существовать как отдельные объекты, то такая операция и не потребуется.  Но! А как насчёт  CVTExtProvider::FindRow()? Подмигивание   Оно же как так и работает сейчас. Кстати, может всё-таки не по номеру строки позиционироваться, а по уникальному ключу, как провайдере для ODBC?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #18 - 04. Мая 2008 :: 11:00
Печать  
kms писал(а) 04. Мая 2008 :: 10:18:
Код
Выбрать все
	nCurrentRow = pCurrentNode->ID;
	if( pCurrentNode->ArrayEqualIDs )
		IndexInNode = pCurrentNode->ArrayEqualIDs->size();
	else
		IndexInNode = 0;
 


Леш, вот здесь, ты уверен, что nCurrentRow не должен сдвигаться на последнюю строку равных значений?
Т.е. точно должно отличаться от GoToNode_Backward()?

Прости мою дотошность, но нельзя ли небольшой ликбез? Улыбка

Да, ступил. Исправился.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #19 - 04. Мая 2008 :: 17:29
Печать  
ADirks писал(а) 04. Мая 2008 :: 10:48:
Да, я имел в виду именно текущую реализацию. Для отдельно живущих итераторов это ни к чему.

Леш, а давай все-таки вытащим итераторы (и, видимо, фильтры) в виде пользовательских объектов.
Это тема благодарная, точно говорю.

Цитата:
Если итераторы будут существовать как отдельные объекты, то такая операция и не потребуется.  Но! А как насчёт  CVTExtProvider::FindRow()? Подмигивание   Оно же как так и работает сейчас. Кстати, может всё-таки не по номеру строки позиционироваться, а по уникальному ключу, как провайдере для ODBC?

Ну, поскольку сейчас ты сделал проверку валидности итератора, я могу хранить итератор в строках ТП, отказавшись для большинства случаев от позиционирования по номеру строки.
Но в случае инвалидации итератора, все равно нужен FindRow();

Позиционирование по номеру строки сделано по соображениям компромисса между эффективностью и гибкостью.
Я решил разрешить использование неуникальных индексов - и предоставить разработчику возможность самому управлять сложностью алгоритма позиционирования.
Для уникальных индексов сложность O(n), для простого неиндексировнного индекса сложность const, для неуникальных индексов - от O(n) до N.

Была еще идея вместо номеров строк использовать значения уже строго уникального опорного индекса - пока обдумываю, надо ли.
Там сложность позиционирования выше, чем при позиционирование на номер строки, но по другому будет работать восстановление итератора после удаления строк.
Но все равно все сводится к определению номеру строки по опорному индексу и FindRow() на эту строку.

Т.е. FindRow() это такая довольно универсальная и полезная штука.

Цитата:
Да, ступил. Исправился.

Уф. Все, теперь я спокоен. Улыбка В двух словах ты описал суть процесса разработки.  Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #20 - 04. Мая 2008 :: 20:22
Печать  
kms писал(а) 04. Мая 2008 :: 17:29:
Леш, а давай все-таки вытащим итераторы (и, видимо, фильтры) в виде пользовательских объектов.
Это тема благодарная, точно говорю.
Скорее всего, если это именно то, как я понял, то очень благодарная  Очень довольный

Kms
приведи пожалуйста пример как они могут использоваться!?
Вроде так, к одному ИТ можно будет прицепить итераторы и фильтры от другой ИТ?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #21 - 05. Мая 2008 :: 08:09
Печать  
PVR писал(а) 04. Мая 2008 :: 20:22:
приведи пожалуйста пример как они могут использоваться!?
Вроде так, к одному ИТ можно будет прицепить итераторы и фильтры от другой ИТ?

Не, к одному индексу в одной ИТ можно будет прицепить несколько независимых итераторов.

Это просто необходимо в некоторых рекурсивных алгоритмах.
Например, есть индекс "контрагент,номенклатура, день" и показатель "количество".
Если мы сами подсчитать итоги, мы должны
Код
Выбрать все
0. Построить индекс "Контрагент,Номенклатура"
1. Выбрать уникальных контрагентов
2. Для каждого контрагента из п.1 зафиксировать подмножество ("Контрагент")
3. Для каждого подмножества из п.2 выбрать уникальную номенклатуру
  4. Для каждой номенклатуры из п.3 зафиксировать подмножество ("Контрагент, Номенклатура")
  5. Для каждого подмножества из п.4 подсчитать Итог("Количество")
6. Для каждого подмножества из п.2 подсчитать Итог("Количество") (здесь можно считать только групповые итоги из п.5)
 


Здесь нужно 2 итератора с разными фильтрами по одному индексу.
Конечно, в таких случаях можно строить несколько индексов, но это лишние затраты, без которых можно обойтись.

Ну и в самом языке удобнее (и быстрее) было бы использование итераторов.
Код
Выбрать все
_ит =_т.СоздатьИтератор("Контрагенты"); // итератор по индексу
_ит.ВНачало();
Пока _ит.СледующаяСтрока() // нет необходимости повторно ресолвить индекс по имени + меньше возможностей для ошибки
    Сообщить(_ит.Контрагент); // нет понятия "текущая строка" для всей таблицы, есть понятие "независимая текущая позиция" для итератора
КонецЦикла;
 


И т.д. Улыбка
  

De quelle planète es-tu?
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #22 - 05. Мая 2008 :: 09:06
Печать  
Маленький вопрос:

а будет ли в Итераторе методы наподобие

remove() - удалить запись из Итератора (но не из ИТЗ)
hasNext()

Улыбка
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
PVR
God Member
*****
Отсутствует



Сообщений: 622
Зарегистрирован: 19. Ноября 2007
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #23 - 05. Мая 2008 :: 09:33
Печать  
kms
Спасибо, за объяснения , хотим-хотим-хотим  Очень довольный
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #24 - 05. Мая 2008 :: 09:39
Печать  
lustin писал(а) 05. Мая 2008 :: 09:06:
Маленький вопрос:

а будет ли в Итераторе методы наподобие

remove() - удалить запись из Итератора (но не из ИТЗ)
hasNext()

Улыбка

remove() - точно не будет, потому что этого можно достичь только изменяя индексное дерево, что повлияет сразу на все итераторы.

HasNext() в принципе реально, но не хотелось бы.  А зачем это может понадобиться?
  
Наверх
 
IP записан
 
ADirks
1c++ developer
1c++ moderator
Отсутствует


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #25 - 05. Мая 2008 :: 09:42
Печать  
kms писал(а) 04. Мая 2008 :: 17:29:
ADirks писал(а) 04. Мая 2008 :: 10:48:
Да, я имел в виду именно текущую реализацию. Для отдельно живущих итераторов это ни к чему.

Леш, а давай все-таки вытащим итераторы (и, видимо, фильтры) в виде пользовательских объектов.
Это тема благодарная, точно говорю.

Дык! Вытащим конечно! Я сам был бы сильно благодарен этой теме  Улыбка
  
Наверх
 
IP записан
 
lustin
1c++ power user
Отсутствует


1C *.*, ROR, Java - на
этом остановимся

Сообщений: 907
Местоположение: Москва
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: ИТ: время жизни итератора и текущей строки
Ответ #26 - 05. Мая 2008 :: 09:53
Печать  
ADirks писал(а) 05. Мая 2008 :: 09:39:
lustin писал(а) 05. Мая 2008 :: 09:06:
Маленький вопрос:

а будет ли в Итераторе методы наподобие

remove() - удалить запись из Итератора (но не из ИТЗ)
hasNext()

Улыбка

remove() - точно не будет, потому что этого можно достичь только изменяя индексное дерево, что повлияет сразу на все итераторы.

HasNext() в принципе реально, но не хотелось бы.  А зачем это может понадобиться?


удалением из итератора хотел заменить работу с набором данных - у меня сейчас реализовано через ИТЗ.Выгрузить(...)
я вообще думал что Итератор будет отдельной коллекцией не связанной с ИТЗ

а насчет метода hasNext()
у меня почему сложилось мысль что Итераторы должны обладать двумя методами
next() - возвращает сдедующий элемент Итератора
hasNext() - возвращает 1 если Итератор имеет еще элементы

видимо это Java въелась в мой мозг  Круглые глаза
  

бизнес-процесс как техническое задание прекрасно, только у бизнеса нет процессов; у бизнеса есть желание выжить
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #27 - 05. Мая 2008 :: 18:40
Печать  
lustin

remove() - невозможно (в твоей интерпретации), не нужно (в смысле удаления строки из ИТ)
hasNext() - не нужно; если потребуется, реализуется через Next() /Previous() без проблем

Вообще, итератор - это по сути просто указатель на строку ИТ, со своей логикой обхода ИТ по соответствующему индексу.

Итератор ИТ - двунаправленный, который также с малыми затратами может быть спозиционирован на первую и на последнюю строку выборки.
Скорее всего, будет добавлена возможность позиционирования на произвольный номер строки, но это не превращает итератор в итератор с произвольным доступом, ибо как я уже выше отметил, обеспечить const время доступа к произвольной строке он не может.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #28 - 05. Мая 2008 :: 18:44
Печать  
ADirks писал(а) 05. Мая 2008 :: 09:42:
Дык! Вытащим конечно! Я сам был бы сильно благодарен этой теме  

Правда? Ура!  Улыбка

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

P.S.
Единственно, я тебе очередной прикол приготовил (спасибо PVR).
http://www.1cpp.ru/bugs/show_bug.cgi?id=3811
« Последняя редакция: 05. Мая 2008 :: 21:12 - kms »  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ИТ: время жизни итератора и текущей строки
Ответ #29 - 05. Мая 2008 :: 21:12
Печать  
ADirks писал(а) 05. Мая 2008 :: 09:42:
Единственно, я тебе очередной прикол приготовил (спасибо PVR).
http://www.1cpp.ru/bugs/show_bug.cgi?id=3811

Исправил, но как же тяжко такие проблемы диагностировать!
Намного тяжелее, кстати, чем простое повторное освобождение памяти, например. Плачущий
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 3 4 5
ОтправитьПечать