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

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

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

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

Похожие темы

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