Pull to refresh

Comments 11

Метод saveItemData может быть переработан с использованием стандартного механизма десериализации json<->bin.

$$$THROWONERROR(st##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(ListColumnsJSON ,,.listColumns ,1)) преобразует ListColumnsJSON в экземпляр класса %Library.ListOfObjects.
Да, действительно может. Но в таком случае у нас получится список объектов класса Front.Helpers.ListColumn, а не %Library.ArrayOfDataTypes.
Нам необходимо будет немного переделать код в тех местах, где он использует методы для работы с массивом.

for {
        set listColumn=listColumns.GetNext(.idx)  //получаем один из объектов списка типа Front.Helpers.ListColumn
        quit:idx=""         
        set fieldName = listColumn.Field   //обращаемся к свойству класса напрямую, в fieldName запишется его значение         
        if (fieldName '= "ID") {
            set $PROPERTY(obj,fieldName) =$PROPERTY(itemData,fieldName)  //устанавливаем в свойство нашего объекта значение полученное из данных вкладки по имени поля
        }
    }     


Естественно, я так набросала быстренько, но ведь это еще не все.
Если пользоваться дебагером, что в нашем случае оказалось вполне реально(я вообще со студийным дебаггером немного в контрах), то можно увидеть ошибку при попытке использования стандартного(встроенного) конвертора как раз из-за отсутствия передаваемых параметров, ну и исправить ее. Чтобы стандартный метода заработал, нужно изменить сигнатуру метода %OnNew() в классе Front.Helpers.ListColumn. Сделать возможным, чтобы он принимал пустые строки.
Пожалуй, это хороший альтернативный вариант для данного случая.

Но вообще мне для работы с JSON и REST приложениями нравится Utils.JSON. В общем-то достаточно удобная вещь. С ее помощью можно формировать сложные структуры. Например JSON для объекта, имеющего внутри и списки и массивы данных, делать вложенные структуры. Наименовать JSON на выходе не только «childrens», но как-нибудь по другому=)
>на выходе не только «childrens», но как-нибудь по другомy
Можно с помощью класса %ZEN.proxyObject — подробнее в спойлере.
Генерация json
ClassMethod json()
{
 
set obj=##class(%ZEN.proxyObject).%New()
 
set obj.property "value" 
 
set obj.objproperty ##class(%ZEN.proxyObject).%New()
 
set obj.objproperty.simpleproperty="value"
 
set obj.arrayofdt ##class(%ListOfDataTypes).%New()
 
do obj.arrayofdt.Insert(1)
 
do obj.arrayofdt.Insert("string")
 
set obj.arrayofobj ##class(%ListOfObjects).%New()
 
 
set obj2=##class(%ZEN.proxyObject).%New()
 
set obj2.property "value"
  
 
do obj.arrayofobj.Insert(obj2)
 
do obj.arrayofobj.Insert(obj2)
 
 
do obj.%ToJSON() //object root
 
 ////////////////////////////////////////////////
 
 
set arrayofdt ##class(%ListOfDataTypes).%New()
 
do arrayofdt.Insert(1)
 
do arrayofdt.Insert("string")
 
do ##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(arrayofdt//array root, %ListOfObjects is pretty much the same
 
 ////////////////////////////////////////////////
 
 
set array(1) = $lb("Sam","M",20)
 
set array(2) = $lb("John","M",25)
 
set array(3) = $lb("Kate","F",30)
 
 
do ##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON($lb("name","sex","age"),.array)
}

а давайте сделаем предположение, что одно из полей с типом %Date ;)
Спасибо за комментарий. Я Вам отвечу, как только снова доберусь до компьютера!
Я могла бы, конечно, сказать, что это же демо, я не все случаи рассматриваю. Но я с Вами соглашусь — это упущение, забыть про %Date! ;)
Дело не в полноте примера, а в скорее в том, что он, возможно, не совсем подходит.
Приведенный вами пример, можно, и, имхо, нужно реализовывать с помощью «стандартного» ООП — инкапсуляция, наследование, полиморфизм и т.д.
В том ключе, в котором вы описываете рефлексию, в качестве примера можно было бы привести систему класса " а у нас пользователь всё может настроить сам, без программирования ", с созданием новых типов данных, свойств и т.д.
Да, я думала об этом.
Мне не хотелось просто рассказывать как работают перечисленные выше функции, это есть и в документации.
А как бы Вы сделали?
говорится, что она (рефлексия) обычно используется программами, которые требуют проверки или изменения поведения приложения во время исполнения кода.

можно было бы привести систему класса " а у нас пользователь всё может настроить сам, без программирования", с созданием новых типов данных, свойств и т.д.
Да, точно, Вы же написали выше.
Соглашусь, было бы очень интересно.
Не знаю почему, но сразу за рефлексией в Cache, я почему-то подумал про телепортацию в масло. А вы? :)
Sign up to leave a comment.