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