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