Использование объектов для повышения производительности
При вызове интерфейсов API, возвращающих объекты, всегда лучше сохранить объект в локальной переменной, чем выполнять несколько вызовов интерфейса API. Также лучше вызывать один интерфейс API, чтобы получить все необходимое, вместо вызова более базового интерфейса API для получения одной вещи каждый раз. В зависимости от конфигурации сервера интерфейсам API могут требоваться циклические переходы от сервера к другим ресурсам.
Пример. Получение информации об аспекте свойства
В этом примере загружаются сведения об аспектах для каждого свойства вещи. Чтобы сделать это, мы получаем информацию вещи в виде объекта JSON, а затем выбираем информацию из определения свойства. Поэтому приходится делать два вызова API.
Things[thingName] проводит поиск требуемой вещи по наименованию.
Чтобы построить информацию JSON для вещи, GetMetadataAsJSON() проходит по иерархии сущностей вещи.
Неправильный способ:
В этом примере каждый раз выполняется поиск вещи и строится представление JSON при каждом вызове свойства.
var propertyNames = ["p1", "p2"]
for (var i = 0; i < propertyNames.length; i++)
logger.warn("Property [" + propertyNames[i] + "] cacheTime: " + Things[me.name].GetMetadataAsJSON().propertyDefinitions[propertyNames[i]].aspects.cacheTime)
}
Правильный способ:
В этом примере мы проводим поиск вещи один раз, один раз создаем объект JSON, а затем получаем значения из определений свойств для каждого свойства. При выполнении нескольких операций с вещью можно создать переменную вещи из Things[thingName]. В этом случае требуются только определения свойств, поэтому мы сохраняем именно их.
var propertyNames = ["p1", "p2"]
var propertyDefinitions = Things[me.name].GetMetadataAsJSON().propertyDefinitions
for (var i = 0; i < propertyNames.length; i++)
logger.warn("Property [" + propertyNames[i] + "] cacheTime: " + propertyDefinitions[propertyNames[i]].aspects.cacheTime)
}
Пример. Получение наименований свойств
В этом примере мы создаем список наименований свойств, получая определения свойств из вещи и создавая список имен. Мы делаем два вызова API.
Things[thingName] проводит поиск требуемой вещи по наименованию.
GetPropertyDefinitions() вызывает вещь и выполняет обход иерархии для построения списка определений свойств.
Неправильный способ:
Это плохой пример, в который API вызывается для получения числа свойств, а затем вызывает определения, чтобы каждый раз получить наименование и описание. Поиск вещи и определение свойства вызываются как минимум дважды для каждого свойства.
for (var i = 0; i < Things["MyThing"].GetPropertyDefinitions().length; i++) {
var newEntry = new Object();
newEntry.name = Things["MyThing"].GetPropertyDefinitions().rows[i].name;
newEntry.description = Things["MyThing"].GetPropertyDefinitions().rows[i].description;
result.AddRow(newEntry);
}
Правильный способ:
В этом примере только один раз вызываются вещь и API определения свойств для всех свойств.
var propDefs = Things["MyThing"].GetPropertyDefinitions();
for (var i = 0; i < propDefs.length; i++) {
var newEntry = new Object();
newEntry.name = propDefs.rows[i].name;
newEntry.description = propDefs.rows[i].description;
result.AddRow(newEntry);
}
Было ли это полезно?