Создание программных приложений обычно включает разработку данных приложения и реализацию операций, выполняемых на этом данные. Процедурные программы передают данные функциям, которые выполняют необходимые операции на данных. Объектно-ориентированное программное обеспечение инкапсулирует данные и операции в объектах, которые взаимодействуют друг с другом через интерфейс объекта.
Язык MATLAB® позволяет вам создать программы с помощью и процедурных и объектно-ориентированных методов и использовать объекты и обычные функции вместе в программах.
В процедурном программировании ваш дизайн фокусируется на шагах, которые должны выполниться, чтобы достигнуть требуемого состояния. Как правило, вы представляете данные как отдельные переменные или поля структуры. Вы реализуете операции как функции, которые берут переменные в качестве аргументов. Программы обычно вызывают последовательность функций, каждая из которых является переданными данными, и затем возвращает измененные данные. Каждая функция выполняет операцию или много операций на данных.
Объектно-ориентированное проектирование программы включает:
Идентификация компонентов системы или приложения, которое вы хотите создать
Анализ и идентификация шаблонов, чтобы определить, какие компоненты неоднократно используются или совместно используют характеристики
Классификация компонентов на основе сходств и различий
После выполнения этого анализа вы задаете классы, которые описывают объекты ваше использование приложения.
Класс описывает набор объектов с общими характеристиками. Объекты являются определенными экземплярами класса. Значения, содержавшиеся в свойствах объекта, - то, что делает объект отличающимся от других объектов того же класса. Функции, определяемые классом (вызываемые методы) - то, какое поведение объекта реализации, которое характерно для всех объектов класса.
Язык MATLAB задает объекты, которые разработаны для использования в любом коде MATLAB. Например, рассмотрите построение программирования try/catch
.
Если код, выполняемый в блоке try
, генерирует ошибку, программное управление передает коду в блоке catch
. Это поведение позволяет вашей программе обеспечить специальную обработку ошибок, которая более соответствует вашему конкретному приложению. Однако у вас должно быть достаточно информации об ошибке принять соответствующие меры.
MATLAB предоставляет подробную информацию об ошибке путем передачи объекта MException
функциям, выполняющим блоки try/catch
.
Следующие блоки try/catch
отображают сообщение об ошибке, сохраненное в объекте MException
, когда вы вызываете функцию (surf
в этом случае) без необходимых аргументов:
try surf catch ME disp(ME.message) end
Not enough input arguments.
В этом коде ME
является объектом класса MException
, который оператор catch
создает, чтобы получить информацию об ошибке. Отображение значения свойства объекта message
возвращает сообщение об ошибке (Недостаточно входных параметров). Ваша программа может получить доступ к другим свойствам получить информацию об ошибке.
Перечислите все общественные собственности объекта с функцией properties
:
properties(ME);
Properties for class MException: identifier message cause stack
Свойства хранят информацию, возвращенную в объектах MException
. Сошлитесь на свойство с помощью записи через точку, как в ME.message
сообщение. Эта ссылка возвращает значение свойства. Например, присвойте значение свойства переменной.
msg = ME.message;
Свойство stack
содержит struct
MATLAB:
s = ME.stack
s = struct with fields: file: D:\myMATLAB\matlab\toolbox\matlab\graph3d\surf.m name: 'surf' line: 49
Можно обработать ME.stack
как структуру и сослаться на ее поля, не присваивая значение:
f = ME.stack.file; disp(f)
D:\myMATLAB\matlab\toolbox\matlab\graph3d\surf.m
Поле file
struct
, содержавшегося в свойстве stack
, является символьным массивом:
c = class(ME.stack.file); disp(c)
char
Вы могли, например, использовать ссылку свойства в выражениях MATLAB:
if ME.stack.name == 'surf' disp('Error in surf') end
Вы могли записать функцию, которая генерирует отчет от данных, возвращенных свойствами объектов MException
. Эта функция могла стать сложной, потому что она должна будет смочь обработать все возможные ошибки. Возможно, вы использовали бы различные функции для различных блоков try/catch
в вашей программе. Если бы данные, возвращенные ошибочным объектом, должны измениться, необходимо было бы обновить функции, чтобы использовать новые данные.
Объекты задают свои собственные операции как часть их интерфейса. Объект MException
может сгенерировать свой собственный отчет. Методы, которые реализуют операции объекта, являются частью определения объекта (то есть, заданный классом, который задает объект). Определение объекта может много раз изменяться, но интерфейс ваше использование программы не изменяется. Объекты изолируют ваш код от кода объекта.
Чтобы видеть, какие методы существуют для объектов MException
, используйте функцию methods
:
methods(ME)
Methods for class MException:
addCause getReport ne throw
eq isequal rethrow throwAsCaller
Static methods:
last
Можно использовать эти методы как любой другой оператор MATLAB, когда существует объект MException
в рабочей области. Например:
rpt = ME.getReport; disp(rpt)
Error using surf (line 49) Not enough input arguments.
Объекты часто имеют методы, что перегрузка (переопределил для конкретного класса объекта), функции MATLAB. Перегрузка позволяет вам использовать объекты точно так же, как другие значения. Например, объекты MException
имеют метод isequal
. Этот метод позволяет вам сравнить эти объекты таким же образом, вы сравнили бы переменные, содержащие числовые значения. Если ME1
и ME2
являются объектами MException
, можно сравнить их с этим оператором:
isequal(ME1,ME2)
Однако то, что действительно происходит, в этом случае MATLAB, вызывает метод isequal
MException
, потому что вы передали объекты MException
isequal
.
Точно так же метод eq
позволяет вам использовать оператор ==
с объектами MException
:
ME == ME2
Объекты должны поддержать только те методы, которые целесообразны. Например, это не было бы, вероятно, целесообразно умножать объекты MException
, таким образом, класс MException
не реализует методы, чтобы сделать так.
Можно реализовать простые задачи программирования как простые функции. Однако как значение и сложность вашего увеличения задач, функции становятся более комплексными и трудными справиться.
Когда функции становятся слишком большими, можно повредить их в меньшие функции и передать данные от одного, чтобы функционировать другому. Однако, когда количество функций становится большим, разработка, и управление, которое данные передали функциям, становится трудным и подверженным ошибкам. На данном этапе рассмотрите перемещение вашего MATLAB, программируя задачи к объектно-ориентированным проектам.
Взгляды с точки зрения объектов являются более простыми и более естественными для некоторых проблем. Думайте о существительных в своем проблемном операторе как объекты задать и глаголы как операции, чтобы выполнить.
Полагайте, что дизайн классов представляет денежные кредитные учреждения (банки, ипотечные компании, отдельные кредиторы, и так далее). Трудно представлять различные типы кредиторов как процедуры. Однако можно представлять каждого как объект, который выполняет определенные действия и содержит определенные данные. Процесс разработки объектов включает идентификацию характеристик кредитора, которые важны для вашего приложения.
Идентифицируйте Общности. Что делает все кредиторы имеют вместе? Все объекты MoneyLender
могут иметь метод loan
и свойство InterestRate
, например.
Идентифицируйте Различия. Как делает каждого кредитора, отличаются? Можно предоставить кредиты компаниям, в то время как другой предоставляет кредиты только людям. Поэтому операция loan
может должна быть отличаться для различных типов кредитных учреждений. Подклассы основного класса MoneyLender
могут специализировать версии подкласса метода loan
. У каждого кредитора может быть различное значение для его свойства InterestRate
.
Факторизуйте общности в суперкласс и реализуйте то, что характерно для каждого типа кредитора в подклассе.
Добавьте Только, Что Необходимо. Эти учреждения могут участвовать в действиях, которые не имеют интереса для вашего приложения. Во время стадии проектирования определите, какие операции и данные объект должен содержать на основе вашего проблемного определения.
Объекты обеспечивают несколько полезных функций, не доступных от структур и массивов ячеек. Например, объекты могут:
Ограничьте значения данных, присвоенные любому данному свойству
Вычислите значение свойства только, когда оно будет запрошено
Широковещательно передайте уведомления, когда любое значение свойства будет запрошено или изменено
Ограничьте доступ к свойствам и методам
Когда сложность вашей программы увеличивается, преимущества объектно-ориентированного дизайна становятся более очевидными. Например, предположите, что вы реализуете следующую процедуру как часть вашего приложения:
Проверьте входные параметры
Выполните вычисление на первом входном параметре
Преобразуйте результат шага 2 на основе второго входного параметра
Проверьте законность выходных параметров и возвращаемых значений
Можно реализовать эту процедуру как обычную функцию. Но предположите, что вы используете эту процедуру снова где-нибудь в вашем приложении, за исключением того, что шаг 2 должен выполнить различное вычисление. Вы могли скопировать и вставить первую реализацию, и затем переписать шаг 2. Или вы могли создать функцию, которая приняла опцию, указывающую который вычисление сделать и так далее. Однако эти опции приводят к более сложному коду.
Объектно-ориентированный дизайн может факторизовать общий код в то, что называется базовым классом. Базовый класс задал бы используемый алгоритм и реализовал бы то, что характерно для всех случаев, которые используют этот код. Шаг 2 мог быть задан синтаксически, но не реализован, оставив специализированную реализацию классам, которые вы затем выводите от этого базового класса.
Step 1 function checkInputs() % actual implementation end Step 2 function results = computeOnFirstArg() % specify syntax only end Step 3 function transformResults() % actual implementation end Step 4 function out = checkOutputs() % actual implementation end
Код в базовом классе не копируется или изменяется. Классы, которые вы выводите от базового класса, наследовали этот код. Наследование уменьшает объем кода, который будет протестирован и изолирует вашу программу от изменений до основной процедуры.
Использование класса как основание для подобных, но более специализированных классов является полезным методом в объектно-ориентированном программировании. Этот класс задает общий интерфейс. Слияние этого вида класса в ваше проектирование программы позволяет:
Идентифицируйте требования конкретной цели
Закодируйте требования в свою программу как интерфейсный класс
Объекты уменьшают сложность путем сокращения того, что необходимо знать, чтобы использовать компонент или систему:
Объекты обеспечивают интерфейс, который скрывает детали реализации.
Объекты осуществляют правила, которые управляют, как взаимодействуют объекты.
Чтобы проиллюстрировать эти преимущества, полагайте, что реализация структуры данных вызвала двунаправленный связанный список. Смотрите Класс, чтобы Реализовать Связанные списки для фактической реализации.
Вот схема трехэлементного списка:
Чтобы добавить узел к списку, отключите существующие узлы в списке, вставьте новый узел и повторно подключите узлы соответственно. Вот основные шаги:
Сначала отключите узлы:
Расцепите n2.Prev
от n1
Расцепите n1.Next
от n2
Теперь создайте новый узел, соедините его и перенумеруйте исходные узлы:
Соедините new.Prev
с n1
Соединитесь new.Next
к n3
(был n2
),
Соединитесь n1.Next
к new
(будет n2
),
Соединитесь n3.Prev
к new
(будет n2
),
Детали того, как методы выполняют эти шаги, инкапсулируются в дизайне класса. Каждый объект узла содержит функциональность, чтобы вставить себя в или удалить себя из списка.
Например, в этом классе, каждый объект узла имеет метод insertAfter
. Чтобы добавить узел к списку, создайте объект узла и затем вызовите его метод insertAfter
:
nnew = NodeConstructor; nnew.insertAfter(n1)
Поскольку класс узла задает код, который реализует эти операции, этот код:
Реализованный оптимальным способом автором класса
Всегда актуальный с текущей версией класса
Правильно протестированный
Может автоматически обновить старые версии объектов, когда они загружаются из MAT-файлов.
Методы объекта осуществляют правила для того, как узлы взаимодействуют. Этот дизайн удаляет ответственность за осуществление правил из приложений, которые используют объекты. Это также означает, что приложение, менее вероятно, сгенерирует ошибки в своей собственной реализации процесса.
Когда вы анализируете систему в объекты (автомобиль –> механизм –> топливная система –> кислородный датчик), вы формируете модули вокруг естественных контуров. Классы обеспечивают три уровня управления модульным принципом кода:
Общественность — Любой код может получить доступ к этому конкретному свойству или вызвать этот метод.
Защищенный — Только методы этого объекта и методы объекта вывели от класса этого объекта, может получить доступ к этому свойству или вызвать этот метод.
Частный — Только собственные методы объекта могут получить доступ к этому свойству или вызвать этот метод.
Когда вы задаете класс, можно перегрузить существующие функции MATLAB, чтобы работать с новым объектом. Например, класс последовательного порта MATLAB перегружает функцию fread
, чтобы считать данные из устройства, соединенного к порту, представленному этим объектом. Можно задать различные операции, такие как равенство (eq
) или сложение (plus
), для класса, который вы задали, чтобы представлять ваши данные.