Валидация значений свойств

Валидация свойств в определениях классов

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

Использование валидации свойств необязательно в определениях классов.

Дополнительная информация о валидации свойств

Для получения дополнительной информации о валидации свойств смотрите Валидации классов и размеров свойств, Функции валидации свойств и Интерфейс метаданных к Валидации свойств.

Синтаксис валидации

Выделенная область в следующем коде показывает синтаксис для валидации свойств.

Валидация свойств включает в себя любое из следующих:

  • Размер - Длина каждой размерности, заданная в виде положительного целого числа или двоеточия. Двоеточие указывает, что в этой размерности разрешена любая длина. Значение, присвоенное свойству, должно соответствовать указанному размеру или быть совместимым с указанным размером. Для получения дополнительной информации см. Раздел «Валидация размера свойств».

  • Класс - имя одного класса MATLAB. Значение, присвоенное свойству, должно быть заданным классом или преобразуемым в указанный класс. Используйте любой класс MATLAB или внешне определенный класс, который поддерживается MATLAB, кроме Java® и COM- классов. Для получения дополнительной информации см. раздел «Валидация классов свойств».

  • Функции - разделенный списками , разделенными запятыми имен функции валидации. MATLAB передает значение, присвоенное свойству, каждой функции валидации после применения любых возможных преобразований классов и размеров. Функции Validator выдают ошибки, если валидация не проходит, но не возвращают значения. Для получения дополнительной информации см. раздел Функции проверки свойств.

    Список функций валидации MATLAB см. в разделе Функции проверки свойств.

Использование валидации свойств

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

Если вы хотите ограничить значения свойств фиксированным набором идентификаторов, создайте класс перечисления для этих идентификаторов и ограничьте свойство этим классом. Для получения информации о классах перечисления смотрите Задать классы перечисления.

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

Чтобы гарантировать, что свойству может быть присвоено только определенный тип значения, ограничьте свойство типом, поддерживающим только требуемые преобразования типов, или используйте функцию валидации, чтобы задать точный класс, разрешенный для свойства, вместо определения типа свойства. MATLAB оценивает спецификацию типа перед выполнением каких-либо функций валидации. Для получения дополнительной информации смотрите Порядок валидации.

Задайте допустимое значение по умолчанию

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

Пример класса с использованием валидации свойств

The ValidateProps класс задает три свойства с валидацией.

classdef ValidateProps
   properties
      Location(1,3) double {mustBeReal, mustBeFinite}
      Label(1,:) char {mustBeMember(Label,{'High','Medium','Low'})} = 'Low'
      State(1,1) matlab.lang.OnOffSwitchState
   end
end
  • Location должен быть массивом класса 1 на 3 double значения которых являются вещественными, конечными числами.

  • Label должен быть char вектор, который либо 'High', 'Medium', или 'Low'.

  • State должен быть представителем перечисления matlab.lang.OnOffSwitchState класс (off или on).

Валидация в экземпляре

Создание объекта ValidateProps класс выполняет валидацию неявных и явных значений по умолчанию:

a = ValidateProps
a = 

  ValidateProps with properties:

    Location: [0 0 0]
       Label: 'Low'
       State: off

При создании объекта MATLAB:

  • Инициализирует Location значение свойства к [0 0 0] для удовлетворения требований к размеру и классу.

  • Устанавливает Label свойство своему значению по умолчанию, 'Low'. Значение по умолчанию должно быть представителем допустимого множества значений. Пустой char неявное значение по умолчанию приведет к ошибке.

  • Устанавливает State свойство для off представитель перечисления, заданный как matlab.lang.OnOffSwitchState класс.

Для получения информации о том, как MATLAB выбирает значения по умолчанию, смотрите Значения по умолчанию для размера и класса.

Порядок валидации

Когда свойству присваивается значение, включая значения по умолчанию, заданные в определении класса, MATLAB выполняет валидацию в следующем порядке:

  • Валидация класса - эта валидация может привести к преобразованию в другой класс, такой как преобразование char на string. Назначение свойствам выполняется в соответствии с правилами преобразования MATLAB для массивов.

  • Валидация размера - эта валидация может вызвать преобразование размера, такое как скалярное расширение или преобразование вектора-столбца в вектор-строку. Назначение свойству, которое задает валидацию размера, ведет себя так же, как назначение любому массиву MATLAB. Дополнительные сведения об индексированном назначении см. в разделе Индексация массивов.

  • Функции валидатора - MATLAB передает результат проверки класса и размера каждой функции валидации в порядке слева направо. Перед вызовом всех функций валидации может возникнуть ошибка, которая завершает процесс валидации.

  • Метод Set - MATLAB выполняет валидацию свойств перед вызовом метода набора свойств, если он определен для этого свойства. Назначение свойству в наборе свойств или методе get не применяет валидацию снова. Часто можно заменить методы набора свойств с помощью валидации свойств.

Ошибки валидации свойств

The ValueProp класс использует size, class и валидацию функции, чтобы гарантировать, что назначение Value свойство является двойным скаляром, который не отрицателен.

classdef ValueProp
   properties
      Value(1,1) double {mustBeNonnegative} = 0
   end
end

Этот оператор пытается назначить массив ячеек свойству. Это назначение нарушает валидацию класса.

a.Value = {10,20};
Error setting property 'Value' of class 'ValueProp':
Invalid data type. Value must be double or be convertible to double.

Этот оператор пытается назначить свойству двойной массив 1 на 2. Это назначение нарушает валидацию размера.

a.Value = [10 20];
Error setting property 'Value' of class 'ValueProp':
Size of value must be scalar.

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

a.Value = -10;
Error setting property 'Value' of class 'ValueProp':
Value must be nonnegative.

Процесс проверки заканчивается первой обнаруженной ошибкой.

Абстрактные Валидации свойств

Можно задать валидацию свойств для абстрактных свойств. Это валидация применяется ко всем подклассам, которые реализуют свойство. Однако подклассы не могут использовать какую-либо валидацию при реализации свойства. При наследовании валидации для свойства из нескольких классов только одно свойство Abstract в одном суперклассе может задать валидацию. Ни один из суперклассов не может задать свойство как nonAbstract.

Объекты, не обновляемые при изменении валидации

Если вы изменяете валидацию свойств, пока существуют объекты класса, MATLAB не пытается применить новую валидацию к существующим значениям свойств. Однако MATLAB применяет новую валидацию при назначении свойств существующих объектов.

Валидация во время операции загрузки

При сохранении объекта в MAT Файл сохраняет все значения свойств nondefault вместе с объектом. При загрузке объекта MATLAB восстанавливает эти значения свойств во вновь созданном объекте.

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

Чтобы проиллюстрировать это поведение, этот пример создает, сохраняет и загружает объект MonthTemp класс. Этот класс ограничивает AveTemp свойство массиву ячеек.

classdef MonthTemp
   properties
      AveTemp cell 
   end
end

Создайте MonthTemp и присвойте значение AveTemp свойство.

a = MonthTemp;
a.AveTemp = {'May',70};

Сохраните объект используя save.

save TemperatureFile a

Измените определение свойства, чтобы изменить класс валидации для AveTemp свойство из массива ячеек в containers.Map.

classdef MonthTemp
   properties
      AveTemp containers.Map
   end
end

Загрузите сохраненный объект с новым определением класса в путь MATLAB. MATLAB не может назначить сохраненное значение AveTemp свойство, поскольку массив ячеек, {'May',70}, несовместимо с текущим требованием, чтобы значение свойства было containers.Map объект. MATLAB не может преобразовать массив ячеек в containers.Map.

Чтобы решить проблему несовместимости, MATLAB устанавливает AveTemp свойство загруженного объекта к текущему значению по умолчанию, которое является пустым containers.Map объект.

load TemperatureFile a
 a.AveTemp

ans = 

  Map with properties:

        Count: 0
      KeyType: char
    ValueType: any

Загруженному объекту назначено другое значение AveTemp свойство, поскольку сохраненное значение теперь недопустимо. Однако процесс загрузки подавляет ошибку валидации.

Чтобы предотвратить потерю данных при изменении определений классов и перезагрузке объектов, реализуйте loadobj метод или метод преобразования классов, который позволяет сохраненным значениям удовлетворять текущей валидации свойства.

Дополнительные сведения о сохранении и загрузке объектов см. в разделе Сохранение и загрузка процесса для объектов.

Похожие темы