Проверка значений свойств

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

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

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

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

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

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

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

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

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

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

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

    Для списка функций валидации MATLAB см. Функции валидации MATLAB.

Используя валидацию свойства

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

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

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

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

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

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

Демонстрационный класс Используя валидацию свойства

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 передает результат класса и валидации размера к каждой функции валидации в левом к правильному порядку. Ошибка может произойти, прежде чем все функции валидации были вызваны, который заканчивает процесс валидации.

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

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

ValueProp класс использует размер, класс и функциональную валидацию, чтобы гарантировать что присвоение на 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.

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

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

Процесс валидации заканчивается первой ошибкой, с которой сталкиваются.

Абстрактная валидация свойства

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

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

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

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

При сохранении объекта в MAT файл, MATLAB сохраняет все значения свойств не по умолчанию с объектом. При загрузке объекта 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 метод или метод конвертера класса, который позволяет сохраненным значениям удовлетворить текущей валидации свойства.

Для получения дополнительной информации о сохранении и загружаемых объектах, смотрите, Сохраняют и Процесс Загрузки для Объектов.

Похожие темы