Организуйте данные о приложении Используя классы MATLAB

Как размер и сложность приложения увеличивается, это может затруднить, чтобы организовать и управлять кодом, чтобы выполнить вычисления, обработать данные и справиться со взаимодействием с пользователем в одном файле. В этом примере показано, как взять приложение, созданное полностью в App Designer, и реорганизовать код приложения в две части:

  • Код, который хранит ваши данные о приложении и алгоритмы, чтобы обработать те данные, реализованные как MATLAB® класс

  • Код, который отображает приложение и справляется со взаимодействием с пользователем, реализованным как приложение App Designer

Разделение данных и алгоритмов из приложения обладает несколькими преимуществами.

  • Масштабируемость — легче расширить функциональность приложения, когда код организован в несколько автономных фрагментов.

  • Возможность многократного использования — можно снова использовать данные и алгоритмы через несколько приложений с минимальным усилием.

  • Тестируемость — можно запустить и протестировать алгоритмы в MATLAB, независимо из приложения.

Этот пример использует PulseGenerator приложение, которое позволяет пользователям задать опции, чтобы сгенерировать импульс и визуализировать получившуюся форму волны. Цель примера состоит в том, чтобы реорганизовать код в исходном приложении путем выполнения этих шагов:

  1. Создайте Pulse класс, который хранит импульсные данные, такие как тип, частота, и длина импульса и алгоритм, используемый, чтобы взять те импульсные данные и сгенерировать получившуюся форму волны.

  2. Измените код в App Designer, чтобы использовать Pulse класс, чтобы выполнить вычисления и обновить отображение приложения.

В итоговом приложении, когда пользователь взаимодействует с управлениями приложениями, код в App Designer обновляет данные, хранимые в Pulse класс и вызовы метод класса сгенерировать данные о форме волны. App Designer затем обновляет отображение приложения с новой визуализацией формы волны.

How a user interaction is processed in the App Designer code and the Pulse class

Чтобы просмотреть и запустить итоговое приложение, см. Импульсное Приложение Генератора, Которое Хранит Данные в Классе.

Приложение Открытия App Designer

Запустите эту команду, чтобы открыть рабочую копию PulseGenerator приложение.

openExample('matlab/PulseGeneratorAppExample')
Используйте это приложение в качестве начальной точки, как вы изменяете и реорганизовываете код приложения.

Запишите класс MATLAB, чтобы управлять данными о приложении

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

  • Можно управлять большой суммой взаимозависимых данных с помощью объектно-ориентированного проекта.

  • Можно легко совместно использовать и обновить эти данные в рамках приложения App Designer.

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

Задайте класс

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

В импульсном приложении генератора данные о приложении состоят из импульса, который пользователь хочет визуализировать. Создайте новый файл с именем класса Pulse.m в той же папке как PulseGenerator.mlapp appfile . Задайте класс Handle под названием Pulse путем создания classdef блок.

classdef Pulse < handle
% ...
end

Храните свои данные о приложении и функции записи, чтобы реализовать ваши алгоритмы приложения в classdef блок.

Создайте свойства

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

В Pulse класс, создайте блок свойств, чтобы содержать данные, которые задают импульс, такой как импульсный тип и частота и длина импульса.

    properties
        Type
        Frequency
        Length
        Edge 
        Window
        Modulation
        LowPass
        HighPass
        Dispersion
    end

    properties (Constant)
        StartFrequency = 10;
        StopFrequency = 20;
    end

Для получения дополнительной информации об определении свойств в классе, см. Синтаксис свойств.

Создание функций

Задайте функции, которые работают с данными о приложении в methods блокируйтесь в определении класса.

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

Создайте methods блокируйте и скопируйте generatePulse функциональное определение в блок. Чтобы сохранить определение класса независимым от приложения, обновите ссылки на значения компонента пользовательского интерфейса в приложении, чтобы вместо этого запросить значения Pulse свойства объектов с помощью obj синтаксиса. Property. Начало вашего функционального определения должно выглядеть так:

    methods
        function result = generatePulse(obj)
            
            type = obj.Type;
            frequency = obj.Frequency;
            signalLength = obj.Length;
            edge = obj.Edge;
            window = obj.Window;
            modulation = obj.Modulation;
            lowpass = obj.LowPass;
            highpass = obj.HighPass;
            dispersion = obj.Dispersion;
            
            startFrequency = obj.StartFrequency;
            stopFrequency = obj.StopFrequency;
            
            t = -signalLength/2:1/frequency:signalLength/2;
            sig = (signalLength/(8*edge))^2;
            
            switch type
               % The rest of the code is the same as the original
               % function in the PulseGenerator app.
               % ...
        end
    end

Чтобы просмотреть полный функциональный код, см. Импульсное Приложение Генератора, Которое Хранит Данные в Классе.

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

Алгоритм проверок

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

Например, создайте Pulse объект и набор его свойства в Командном окне.

p = Pulse;
p.Type = 'gaussian';
p.Frequency = 500;
p.Length = 2;
p.Edge = 1;
p.Window = 0;
p.Modulation = 0;
p.LowPass = 0.4;
p.HighPass = 0;
p.Dispersion = 0;

Вызовите generatePulse метод Pulse объект p. Визуализируйте импульс в графике.

step = 1/p.Frequency;
xlim = p.Length/2;
x = -xlim:step:xlim;
y = generatePulse(p);
plot(x,y);

Plot of a Gaussian pulse

Можно также протестировать алгоритм с помощью среды тестирования. Для получения дополнительной информации смотрите Способы Записать Модульные тесты.

Осуществляйте обмен данными с приложением

Чтобы получить доступ к объекту данных из App Designer, создайте экземпляр класса в вашем коде App Designer и сохраните его в свойстве вашего приложения. Можно установить и запросить свойства объектов, которые хранят данные и вызывают функции класса, чтобы обработать данные в ответ на взаимодействие с пользователем.

В PulseGenerator приложение в App Designer, создайте новую частную собственность путем нажатия кнопки Property во вкладке Editor. Добавьте частную собственность под названием PulseObject содержать Pulse объект.

Затем в StartupFcn для приложения создайте Pulse объект путем добавления этого кода в верхнюю часть функционального определения.

app.PulseObject = Pulse;

Чтобы сгенерировать импульс для визуализации, когда пользователь будет взаимодействовать с одними из средств управления в приложении, измените updatePlot функция. Эта функция вызвана в нескольких функциях обратного вызова PulseGenerator приложение, каждый раз, когда пользователь взаимодействует с одними из средств управления в приложении.

В updatePlot функция, сначала устанавливает свойства app.Pulse объект с помощью значений управлений приложениями путем добавления этого кода в верхнюю часть функции.

app.PulseObject.Type = app.TypeDropDown.Value;
app.PulseObject.Frequency = app.FrequencyEditField.Value;
app.PulseObject.Length = app.SignalLengthsEditField.Value;
app.PulseObject.Edge = app.EdgeKnob.Value;
app.PulseObject.Window = app.WindowKnob.Value;  
app.PulseObject.Modulation = str2double(app.ModulationKnob.Value);
app.PulseObject.LowPass = app.LowPassKnob.Value;
app.PulseObject.HighPass = app.HighPassKnob.Value;
app.PulseObject.Dispersion = str2double(app.DispersionKnob.Value);

Затем обновите вызов generatePulse функция, заменяя входной параметр на app.PulseObject.

p = generatePulse(app.PulseObject);

Наконец, гарантируйте, что приложение вызывает недавно заданный generatePulse функция в Pulse класс путем удаления generatePulse функция, которая задана в App Designer.

Чтобы просмотреть код законченного приложения, см. Импульсное Приложение Генератора, Которое Хранит Данные в Классе.

Импульсное приложение генератора, которое хранит данные в классе

Этот пример показывает итоговый PulseGenerator приложение, с данными о приложении и алгоритмами, реализованными отдельно в Pulse класс. Запустите пример путем щелкания по кнопке Run в App Designer.

Похожие темы