Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Динамические свойства - что делать ?.... (число прочтений - 7466 )
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Динамические свойства - что делать ?....
03. Декабря 2009 :: 04:50
Печать  
всем добрый день Улыбка

большие респекты и спасибо разработчикам 1с++ , спасибо что проект живет и развивается.  Улыбка

решил перейти на 1с++ 3.х с версии 2.0.3.3  и столкнулся с такой проблемой.  Озадачен

перестали привычно работать методы _onReadProperty/_onWriteProperty .

т.е. раньше была возможность "перехватить" в классе чтение/запись несуществующего свойства класса, и динамически управлять процессом.
в частности, мой класс "Структура" позволял "вольности" типа такого :


 p = СоздатьОбъект("СStruc") ;
 p.property_1 = 1 ;
 n = p.property_2 ;


при этом, чтение/запись свойcтв как раз определяется в документированных методах _onReadProperty/_onWriteProperty ...

как и что исправить - и возможно ли в новой версии - не нашел.
перерыл всю документацию и форум  . Смущённый

или ткните носом где читать или подскажите как быть ?

заранее - big thanx Улыбка  
  
Наверх
 
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Динамические свойства - что делать ?....
Ответ #1 - 03. Декабря 2009 :: 08:38
Печать  
  
Наверх
 
IP записан
 
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #2 - 03. Декабря 2009 :: 12:19
Печать  
shmalevoz писал(а) 03. Декабря 2009 :: 08:38:


я читал этот топик.
насколько я понял, то убрали саму возможность присваивать напрямую (через точку) динамическим свойствам класса значения ?

проблема в том, что для того, чтобы перейти на новую версию, придется перелопатить горы кода...
и скорее всего - все равно останутся неуловимые "хвосты", потому что описанный класс CStruc у меня, к примеру, используется
везде.

думаю, что аналогичная проблема возникла у многих разработчиков. получается, что вариантов "безболезненного" перехода не существует ?  Ужас

  
Наверх
 
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Динамические свойства - что делать ?....
Ответ #3 - 03. Декабря 2009 :: 14:27
Печать  
denil писал(а) 03. Декабря 2009 :: 12:19:
насколько я понял, то убрали саму возможность присваивать напрямую (через точку) динамическим свойствам класса значения ?


Отчего же ? Просто стало необходимо прямо объявлять динамические свойства перед их использованием. Делается это методом я().ДобавитьДинамическоеСвойство(Ид).
  
Наверх
 
IP записан
 
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #4 - 03. Декабря 2009 :: 16:52
Печать  
shmalevoz писал(а) 03. Декабря 2009 :: 14:27:
denil писал(а) 03. Декабря 2009 :: 12:19:
насколько я понял, то убрали саму возможность присваивать напрямую (через точку) динамическим свойствам класса значения ?


Отчего же ? Просто стало необходимо прямо объявлять динамические свойства перед их использованием. Делается это методом я().ДобавитьДинамическоеСвойство(Ид).


ндя.... это не совсем удобно .
кроме того - загромождает код.

это видно даже на простом фрагменте :

запись вида
p.property_1 = 1 ;

гораздо компактнее, чем

p.ДобавитьДинамическоеСвойство("property_1") ;
p.property_1 = 1 ;

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

у меня вопрос к разработчикам :

а есть ли возможность как-то вернуть/добавить прежний функционал , хотя бы на уровне динамических свойств класса. ?

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

к примеру : в новом варианте , при записи в свойство [property_1 ] сейчас получим исключение и останов.
а если бы была возможность  отловить и обработать в классе этот момент каким нибудь предопределенным методом , как-то можно было бы выкрутиться.

или - попробовать через Перехватчик как-то решить проблему ?
хотелось бы хотя бы как то получить переменную и значение в случае исключения.

просто - необходимость движения в сторону в новой версии есть полная, но только переписать тонны кода - просто нереально будет....  Нерешительный  Печаль
имхо - но наверняка с подобной проблемой выбора сталкивалось достаточное количество разработчиков, кто начинал еще с OXY .
  
Наверх
 
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Динамические свойства - что делать ?....
Ответ #5 - 03. Декабря 2009 :: 20:47
Печать  
Конечно ИМХО, но объект должен знать о составе своих атрибутов. Для остального можно, наверное, пользоваться списком значений и т.д. А для исключения повторного использования кода можно выделить его (код динамических свойств) в отдельный класс и наследовать от него. Соответственно в конструкторах наследников определять добавляемые атрибуты.
  
Наверх
 
IP записан
 
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #6 - 03. Декабря 2009 :: 23:11
Печать  
shmalevoz писал(а) 03. Декабря 2009 :: 20:47:
Конечно ИМХО, но объект должен знать о составе своих атрибутов. Для остального можно, наверное, пользоваться списком значений и т.д. А для исключения повторного использования кода можно выделить его (код динамических свойств) в отдельный класс и наследовать от него. Соответственно в конструкторах наследников определять добавляемые атрибуты.


не всегда возможен такой подход.
имхо.

вот , порыл по сусекам - нашел старую ссылку, когда-то юзал вместо структуры.  Улыбка

[ http://www.erp-volga.com/hare/add-in/addin.eproc.html ]

там есть объект [ AddIn.List ]
простой как грабли.
но весьма эффективный.
вот именно что-то такое нам всем нужно.  Круглые глаза // судя по аналогичным постам на форуме

либо - добавить в [Структуру] эту полезность  Класс

цитата :
Синтаксис:
<Переменная>
Назначение:
Значение элемента списка.
Замечание:
Позволяет устанавливать (Лист.Переменная = 10) и получать (ЗначПер = Лист.Переменная) значения через точку. При первом обращении к переменной (либо установка, либо получение) запоминается ее наименование, резервируется место и заносится значение.


попробую вывернуться через нее.
// кажется DynaWrapper (?   Озадачен)
// позволяет создавать алиасы объектов,
// а базовые методы, вроде совпадают... -
// не придется лопатить весь код в классах....

кстати.
а можно ли как-то наследовать классы от объектов компонент ?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #7 - 04. Декабря 2009 :: 07:17
Печать  
denil писал(а) 03. Декабря 2009 :: 23:11:
а можно ли как-то наследовать классы от объектов компонент ?

Можно наследовать, если объект ВК можно напрямую создать в 1С.
Т.е. если в 1С работает код
Объект = СоздатьОбъект("Addin.Object");
то можно наследовать
класс Наследник: Addin.Object
{}
  

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: Динамические свойства - что делать ?....
Ответ #8 - 04. Декабря 2009 :: 07:20
Печать  
Напиши, плиз, простой тест.
в нем должен быть
1. 1 класс для работы с динамическими свойствами - т.е. упрости свой CSruct, убрав лишние детали
2. обработка с кодом, который должен сработать.
Объект = СоздатьОбъект("нужныйКласс");
Объект.НовоеСвойство = 1;

После получения теста смогу посмотреть более детально и подсказать решение.
  

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: Динамические свойства - что делать ?....
Ответ #9 - 04. Декабря 2009 :: 07:23
Печать  
denil писал(а) 03. Декабря 2009 :: 04:50:
перестали привычно работать методы _onReadProperty/_onWriteProperty .

т.е. раньше была возможность "перехватить" в классе чтение/запись несуществующего свойства класса, и динамически управлять процессом.
в частности, мой класс "Структура" позволял "вольности" типа такого :

 p = СоздатьОбъект("СStruc") ;
 p.property_1 = 1 ; // !! п. 1 !
 n = p.property_2 ; // !! п. 2 !!

п.1 понятен,
а в п.2 какое значение должно попасть в n ? или это просто опечатка и нужно читать как n = p.property_1 ?
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #10 - 04. Декабря 2009 :: 21:53
Печать  
artbear писал(а) 04. Декабря 2009 :: 07:17:
denil писал(а) 03. Декабря 2009 :: 23:11:
а можно ли как-то наследовать классы от объектов компонент ?

Можно наследовать, если объект ВК можно напрямую создать в 1С.
Т.е. если в 1С работает код
Объект = СоздатьОбъект("Addin.Object");
то можно наследовать
класс Наследник: Addin.Object
{}



отлично !  Улыбка

очередные ВАМ всем grand-респекты !  Круглые глаза
  
Наверх
 
IP записан
 
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #11 - 04. Декабря 2009 :: 22:08
Печать  
artbear писал(а) 04. Декабря 2009 :: 07:23:
denil писал(а) 03. Декабря 2009 :: 04:50:
перестали привычно работать методы _onReadProperty/_onWriteProperty .

т.е. раньше была возможность "перехватить" в классе чтение/запись несуществующего свойства класса, и динамически управлять процессом.
в частности, мой класс "Структура" позволял "вольности" типа такого :

 p = СоздатьОбъект("СStruc") ;
 p.property_1 = 1 ; // !! п. 1 !
 n = p.property_2 ; // !! п. 2 !!

п.1 понятен,
а в п.2 какое значение должно попасть в n ? или это просто опечатка и нужно читать как n = p.property_1 ?



n = p.property_2 ;

опечатки нет.
здесь CStruc вернет  GetEmptyValue()
т.к. свойство структуры неопределено было ранее , т..е ранее , мы не делали присваивания этому реквизиту

т.е. базовая логика проста :

при первой записи в свойство :
* проверяем есть ли свойство, если есть - перезаписываем его
* если нет, создаем и записываем

при чтении ствойства :
* если есть свойство - вернем его значение
* если нет такого свойства - вернем GetEmptyValue() // в терминах 1с

вообще же, нормальная [i.e. объектная ] (имхо)
логика поведения структуры описана в этих предложениях
(опять же - имхо).

аналогичное поведение класса реализовано и в приведенном объекте Addin.LIst и в моем [CStruc]

резюмируя :

нужно добавить в класс [Структура] отработку чтения undefined свойства ( здесь, просто вернем EmptyValue() ) ,
и простое добавление свойства , при первой же записи в него , если его нет.
при обращении к любому  свойству класса [Структурачерез точку .

думаю, что предлагаемые дополнения  в класс Структура абсолютно не повлияют на вертикальную соместимость  уже написанного кода ,
зато значительно повысят эффективность работы, за счет сокращения писанины  , к примеру, на  try {} catch {} except ;
кроме того, такая структура становится весьма мощным агрегатом для работы.

Улыбка

вот это будет - real COOL  Улыбка
имха.  Класс

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Динамические свойства - что делать ?....
Ответ #12 - 05. Декабря 2009 :: 09:58
Печать  
Ты правда думаешь, что если я по запарке напишу
Код
Выбрать все
а= объект.Сувойство1 

вместо
Код
Выбрать все
а= объект.Свойство1 

, а код будет выполнятся вместо вылета по ошибке "Свойство не найдено" - это будет круто?
  
Наверх
 
IP записан
 
shmalevoz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 55
Зарегистрирован: 23. Апреля 2009
Re: Динамические свойства - что делать ?....
Ответ #13 - 05. Декабря 2009 :: 10:56
Печать  
Интересна смысловая нагрузка такой неопределенности. Возможно более корректен типа такой вариант
Код
Выбрать все
Если Объект.АтрибутСуществует("Свойство1") = 1 Тогда
  Объект.Свойство1 = 1;
КонецЕсли;
н = -1;
Если Объект.АтрибутСуществует("Свойство2") = 1 Тогда
  н = Объект.Свойство2;
КонецЕсли;
 


?
  
Наверх
 
IP записан
 
denil
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #14 - 05. Декабря 2009 :: 19:03
Печать  
orefkov писал(а) 05. Декабря 2009 :: 09:58:
Ты правда думаешь, что если я по запарке напишу
Код
Выбрать все
а= объект.Сувойство1 

вместо
Код
Выбрать все
а= объект.Свойство1 

, а код будет выполнятся вместо вылета по ошибке "Свойство не найдено" - это будет круто?


* в случае с произвольным классом - однозначно не скажу.
тут я с тобой согласен.
еще раз обдумав реализованную сейчас логику динамических свойств - даже в чем-то согласен с введенными ограничениями
(не проверял еще наследование , т.к. в ранней реализации получалось или/или) .

* в частном случае со Структурой - в большинстве случаев - (имхо) да.  
такое поведение логично, если вернется EmptyValue

есть целый класс практических задач , где такое поведение допустимо .

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

ps: кстати,  в тестовой прикрутил Addon.List  .
погонял.
вроде - все нормуль.
но весь феншуй ломается в одной точке - регистрозависимость....  Печаль
списался с автором - пока нет ответа (работа 2002 года)..
// подожду еще пару-тройку дней. не ответит - в свою компоненту воткну тогда фунцкионал. но это уже нефеншуйно будет....  Нерешительный

в итоге, остается открытым вопрос :

возможно ли добавить в класс Структура  следующий функционал :

при первой записи в свойство :
* проверяем есть ли свойство, если есть - перезаписываем его // сейчас так и есть
* если нет, создаем и записываем // ++

при чтении ствойства :
* если есть свойство - вернем его значение // сейчас так и есть
* если нет такого свойства - вернем GetEmptyValue() // в терминах 1с // ++

здесь возможен компромиссный вариант - добавление метода , включающего такую логику.
создать производный класс, в конструкторе переводящий Структуру в такое положение труда не составит.  Круглые глаза
имхо.

?
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #15 - 06. Декабря 2009 :: 06:48
Печать  
artbear писал(а) 04. Декабря 2009 :: 07:20:
Напиши, плиз, простой тест.
в нем должен быть
1. 1 класс для работы с динамическими свойствами - т.е. упрости свой CSruct, убрав лишние детали
2. обработка с кодом, который должен сработать.
Объект = СоздатьОбъект("нужныйКласс");
Объект.НовоеСвойство = 1;

После получения теста смогу посмотреть более детально и подсказать решение.

Повторюсь.

ЗЫ в Структуру подобные изменения наверняка вносится не будут Улыбка
Жду тест.
  

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


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 13. Июля 2006
Re: Динамические свойства - что делать ?....
Ответ #16 - 06. Декабря 2009 :: 08:49
Печать  
artbear писал(а) 06. Декабря 2009 :: 06:48:
artbear писал(а) 04. Декабря 2009 :: 07:20:
Напиши, плиз, простой тест.
в нем должен быть
1. 1 класс для работы с динамическими свойствами - т.е. упрости свой CSruct, убрав лишние детали
2. обработка с кодом, который должен сработать.
Объект = СоздатьОбъект("нужныйКласс");
Объект.НовоеСвойство = 1;

После получения теста смогу посмотреть более детально и подсказать решение.

Повторюсь.

ЗЫ в Структуру подобные изменения наверняка вносится не будут Улыбка
Жду тест.


ок. тогда сейчас перекомпоную немного тестовую.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #17 - 07. Декабря 2009 :: 11:50
Печать  
denil писал(а) 05. Декабря 2009 :: 19:03:
при первой записи в свойство :
* проверяем есть ли свойство, если есть - перезаписываем его // сейчас так и есть
* если нет, создаем и записываем // ++

при чтении ствойства :
* если есть свойство - вернем его значение // сейчас так и есть
* если нет такого свойства - вернем GetEmptyValue() // в терминах 1с // ++


Мне одному кажется, что этот функционал вполне можно реализовать самостоятельно с помощью Попытки?
  
Наверх
www  
IP записан
 
avgreen
Senior Member
****
Отсутствует



Сообщений: 254
Местоположение: Украина, Кривой Рог
Зарегистрирован: 20. Октября 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #18 - 16. Декабря 2009 :: 06:23
Печать  
fez писал(а) 07. Декабря 2009 :: 11:50:
denil писал(а) 05. Декабря 2009 :: 19:03:
при первой записи в свойство :
* проверяем есть ли свойство, если есть - перезаписываем его // сейчас так и есть
* если нет, создаем и записываем // ++

при чтении ствойства :
* если есть свойство - вернем его значение // сейчас так и есть
* если нет такого свойства - вернем GetEmptyValue() // в терминах 1с // ++


Мне одному кажется, что этот функционал вполне можно реализовать самостоятельно с помощью Попытки?


Да оно то можно, но IMHO это можно сделать только в месте вызова а не в самом классе.... а в таком случае легче уж все места вызова поправить на использование функции/метода а не реквизита/свойства чем городить попытку

Хотя нет! В данном случае таки можно - через наследование класса, но когда это твой собственный класс, городить "наследника" только ради Попытки/Исключения - это уже лишнее
  
Наверх
ICQ  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #19 - 16. Декабря 2009 :: 16:01
Печать  
avgreen писал(а) 16. Декабря 2009 :: 06:23:
Хотя нет! В данном случае таки можно - через наследование класса, но когда это твой собственный класс, городить "наследника" только ради Попытки/Исключения - это уже лишнее

Почему лишнее?

Попробуй зайти с другой сторны: ты "городишь свой класс" ради того, чтобы самостоятельно решить свою проблему, а не ждать помощи "от дяди".
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Динамические свойства - что делать ?....
Ответ #20 - 18. Декабря 2009 :: 07:30
Печать  
fez писал(а) 16. Декабря 2009 :: 16:01:
avgreen писал(а) 16. Декабря 2009 :: 06:23:
Хотя нет! В данном случае таки можно - через наследование класса, но когда это твой собственный класс, городить "наследника" только ради Попытки/Исключения - это уже лишнее

Почему лишнее?

Попробуй зайти с другой сторны: ты "городишь свой класс" ради того, чтобы самостоятельно решить свою проблему, а не ждать помощи "от дяди".

Если данный вариант сработает, считаю его вполне удобным для реализации, т.к. требования автора совсем не стандартны.
  

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] 
ОтправитьПечать