Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Универсальные интерфейсы загрузки/выгрузки данных (число прочтений - 28916 )
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #30 - 25. Июля 2008 :: 06:13
Печать  
artbear писал(а) 24. Июля 2008 :: 11:57:
ИМХО удобна была бы фича - методы Выгрузить(Приемник, ....) должны возвращать значение Приемника, а не абстрактные числа и т.д.
В этом случае становится удобным писать код типа Вектор.Выгрузить(ТЗ).Показать или что-то более сложное и удобное.

Наверное к концу недели я становлюсь излишне ортодоксален.
Но нет, не убедил.
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #31 - 25. Июля 2008 :: 09:11
Печать  
Нарисовался баг Печаль http://www.1cpp.ru/bugs/show_bug.cgi?id=4019

Цитата:
Оказывается, что универсальный интерфейс загрузки -
универсальный метод Выгрузить не умеет работать с
КОП-наследниками от СписокЗначений/ТаблицаЗначений

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

В то же время выгрузка в наследники от Вектора/АссоцВектора
работает.
Т.е. Вектор.Выгрузить(НаследникОтВектор) работает.

А Вектор.Выгрузить(НаследникОтСписокЗначений) не работает, дает
исключение.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #32 - 25. Июля 2008 :: 09:22
Печать  
Есть несколько вариантов исправления.
Нужно выбрать лучший Улыбка

1. Просто перебираем в объекте-КОП всех наследников и ищем первого предка, что реализует универсальный интерфейс загрузки

2. Научить класс CComponentClass для самостоятельной реализации интерфейс загрузки.
Но в этом случае неясная ситуация с классом, у которого нет предков с реализованным интерфейсом загрузки. Единственный выход - это выдавать ошибку в методе интерфейса ldrInit

Зато в этом случае КОП может четко узнать о загрузке данных в его предка. Например, можно сделать 2 метода-события, вызываемых до загрузки и после загрузки.

3. Или пойти еще дальше и делегировать в сам объект КОП интерфейс загрузки, чтобы КОП мог также служить приемником выгрузки.

Например, если в КОП-е есть методы
Число РеализуемИнтерфейсЗагрузки() - или это лишний метод в этом случае?
Число СобытиеЗагрузки_НачалоЗагрузки(КолвоКолонок, КолвоСтрок)
Число СобытиеЗагрузки_ДобавитьКолонку(...)
Число СобытиеЗагрузки_ДобавитьДанные(Контейнер) - сюда передавать какой-нибудь контейнер, проще всего Вектор.
Число СобытиеЗагрузки_ОкончаниеЗагрузки(КолвоКолонок, КолвоСтрок)

Если же этих методов нет или РеализуемИнтерфейсЗагрузки возвращает 0, тогда используем п.2

Мне лично п.3 очень нравится Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #33 - 25. Июля 2008 :: 09:50
Печать  
Ну, раз нравится п.3 - так почему бы и нет.
И для загрузки можно такое же изобразить будет.

А если класс не реализует интерфейсы загрузки - тогда искать среди родителей.
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #34 - 25. Июля 2008 :: 10:00
Печать  
kms писал(а) 25. Июля 2008 :: 09:50:
Ну, раз нравится п.3 - так почему бы и нет.
И для загрузки можно такое же изобразить будет.

А если класс не реализует интерфейсы загрузки - тогда искать среди родителей.

Да, для загрузки само собой.
"если класс не реализует интерфейсы загрузки" будем определять как?
наличием в классе всех 4-х обработчиков "СобытиеЗагрузки_" ?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #35 - 25. Июля 2008 :: 10:22
Печать  
artbear писал(а) 25. Июля 2008 :: 10:00:
"если класс не реализует интерфейсы загрузки" будем определять как?
наличием в классе всех 4-х обработчиков "СобытиеЗагрузки_" ?

Ну не знаю... придумай что-нибудь. Улыбка
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #36 - 25. Июля 2008 :: 10:44
Печать  
Для универсальности завел еще один интерфейс IQueryInterface_Loader_Unloader c методами
BOOL IsLoader() и BOOL IsUnloader()
типа если классу нужна вариативность с поддержкой интерфейсами загрузки/выгрузки (как у КОП), то он реализует данный интерфейс и обязан реализовать соответствующие интерфейсы загрузки или выгрузки.
Если вариативности не нужно, все остается как сейчас.

ЗЫ интерфейсы рулят Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #37 - 25. Июля 2008 :: 10:53
Печать  
artbear писал(а) 25. Июля 2008 :: 10:44:
Для универсальности завел еще один интерфейс IQueryInterface_Loader_Unloader c методами
BOOL IsLoader() и BOOL IsUnloader()

А зачем это нужно?
Разве того факта, что класс реализует данные интерфейсы недостаточно, чтобы определить, что он IsLoader или IsUnloader?
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #38 - 25. Июля 2008 :: 10:59
Печать  
А как я для CComponentClass должен поступить - когда КОП может реализовывать интерфейс, а может, не реализовывать, т.е. проверка на этапе выполнения
А CComponentClass должен на этапе компиляции показать реализацию унив.интерфейса загрузки.

Я потому и спрашивал ранее, может быть, в ldrInit тупо возвращать код ошибки ?
ИМХО иначе без спец.интерфейса подтверждения реализации унив.интерфейса загрузки/выгрузки не обойтись Печаль

ЧТо скажешь?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #39 - 25. Июля 2008 :: 11:12
Печать  
Я думаю, не нужен такой общий интерфейс.

Лучше сделать более интеллектуальное преобразование CComponentClass в интерфейс загрузки.
Например, в процессе преобразования типа Type2ResultLoader опрашивать сам CComponentClass, действительно ли он поддерживает интерфейс загрузки/выгрузки, или только делает вид.

Если "делает вид" - то продолжать поиск среди родителей.

P.S.
В любом случае, ты столкнешься с проблемой, когда попробуешь выгрузить в класс 1С++ что-то из 1sqlite, например.
Но это уже другой вопрос. Улыбка
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #40 - 25. Июля 2008 :: 11:16
Печать  
kms писал(а) 25. Июля 2008 :: 11:12:
Лучше сделать более интеллектуальное преобразование CComponentClass в интерфейс загрузки.
Например, в процессе преобразования типа Type2ResultLoader опрашивать сам CComponentClass, действительно ли он поддерживает интерфейс загрузки/выгрузки, или только делает вид.

Если "делает вид" - то продолжать поиск среди родителей.

P.S.
В любом случае, ты столкнешься с проблемой, когда попробуешь выгрузить в класс 1С++ что-то из 1sqlite, например.
Но это уже другой вопрос. Улыбка

Как раз чтобы универсально опрашивать любой объект Улыбка и нужен подобный интерфейс Улыбка
Не хочется, как всегда, вставлять блоки типа if(type)

Почему будут проблемы при 1sqlite ?
1. у нас пока что интерфейсы все-таки разные Улыбка
2. как интерфейсы совпадут, проблемы быть не должно при нормальной реализации интерфейса.
Пример - ПоставщикТП в виде класса 1С++ Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #41 - 25. Июля 2008 :: 11:21
Печать  
Когда интерфейсы совпадут, окажется, что для CComponentClass невозможно получить интерфейс простым преобразованием rtti.
Типа dynamic_cast<IGeneralResultLoader*>(CComponentClass*).
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #42 - 25. Июля 2008 :: 11:29
Печать  
Ну, в принципе, если тебе надо помоделировать - то не вопрос.
Только не заставляй меня в векторах (например) поддерживать еще и интерфейс IsLoader_Unloader. Подмигивание
Лучше поколдуй над CComponentClass, а если что, подумаем, не надо ли чего улучшить.
  

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


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #43 - 25. Июля 2008 :: 11:34
Печать  
artbear писал(а) 25. Июля 2008 :: 10:44:
Для универсальности завел еще один интерфейс IQueryInterface_Loader_Unloader c методами
BOOL IsLoader() и BOOL IsUnloader()
типа если классу нужна вариативность с поддержкой интерфейсами загрузки/выгрузки (как у КОП), то он реализует данный интерфейс и обязан реализовать соответствующие интерфейсы загрузки или выгрузки.
Если вариативности не нужно, все остается как сейчас.

ЗЫ интерфейсы рулят Улыбка


Т.е. для классов, которые просто и без затей реализуют текущий унив.интерфейс загрузки, ничего И НЕ меняется Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Универсальные интерфейсы загрузки/выгрузки дан
Ответ #44 - 25. Июля 2008 :: 11:35
Печать  
kms писал(а) 25. Июля 2008 :: 11:21:
Когда интерфейсы совпадут, окажется, что для CComponentClass невозможно получить интерфейс простым преобразованием rtti.
Типа dynamic_cast<IGeneralResultLoader*>(CComponentClass*).

Правильно, так это и сейчас нельзя сделать Печаль
Т.к. CComponentClass должен знать о попытке его преобразования к IGeneralResultLoader, иначе косяк Улыбка
В общем, схема нарисовалась, получается очень универсально.
Почти сделал уже Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать