Создание программных приложений обычно включает разработку данных приложения и реализацию операций, выполняемых на тех данных. Процедурные программы передают данные функциям, которые выполняют необходимые операции на данных. Объектно-ориентированное программное обеспечение инкапсулирует данные и операции в объектах, которые взаимодействуют друг с другом через интерфейс объекта.
Язык MATLAB® позволяет вам создать программы с помощью и процедурных и объектно-ориентированных методов и использовать объекты и обычные функции вместе в программах.
В процедурном программировании ваш проект фокусируется на шагах, которые должны выполниться, чтобы достигнуть требуемого состояния. Как правило, вы представляете данные как отдельные переменные или поля структуры. Вы реализуете операции как функции, которые берут переменные в качестве аргументов. Программы обычно вызывают последовательность функций, каждая из которых является переданными данными, и затем возвращает измененные данные. Каждая функция выполняет операцию или много операций на данных.
Объектно-ориентированное проектирование программы включает:
Идентификация компонентов системы или приложения, которое вы хотите создать
Анализ и идентификация шаблонов, чтобы определить, какие компоненты неоднократно используются или совместно используют характеристики
Классификация компонентов на основе сходств и различий
После выполнения этого анализа вы задаете классы, которые описывают объекты ваше использование приложения.
Класс описывает набор объектов с общими характеристиками. Объекты являются определенными экземплярами класса. Значения, содержавшиеся в свойствах объекта, - то, что делает объект отличающимся от других объектов того же класса. Функции, определяемые классом (вызываемые методы) - то, какое поведение объекта реализации, которое характерно для всех объектов класса.
Можно реализовать простые задачи программирования как простые функции. Однако как значение и сложность вашего увеличения задач, функции становятся более комплексными и трудными справиться.
Когда функции становятся слишком большими, можно повредить их в меньшие функции и передать данные от одного, чтобы функционировать другому. Однако, когда количество функций становится большим, разработка, и управление, которое данные передали функциям, становится трудным и подверженным ошибкам. На данном этапе рассмотрите перемещение вашего 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
), для класса, который вы задали, чтобы представлять ваши данные.