Зачем использовать объектно-ориентированный проект

Подходы к написанию программ MATLAB

Создание программных обеспечений обычно включает разработку данных приложений и реализацию операций, выполненных с этими данными. Процедурные программы передают данные в функции, которые выполняют необходимые операции на данных. Объектно-ориентированное программное обеспечение инкапсулирует данные и операции в объекты, которые взаимодействуют друг с другом через интерфейс объекта.

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

Процедурная программа Проекта

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

Объектно-ориентированный проект программы

Объектно-ориентированный проект программы включает в себя:

  • Идентификация компонентов системы или приложения, которые вы хотите создать

  • Анализ и идентификация шаблонов для определения того, какие компоненты используются неоднократно или совместно используют характеристики

  • Классификация компонентов на основе сходств и различий

После выполнения этого анализа определяются классы, которые описывают объекты, используемые приложением.

Классы и объекты

Класс описывает набор объектов с общими характеристиками. Объекты являются конкретными образцами класса. Значения, содержащиеся в свойствах объекта, делают объект отличным от других объектов того же класса. Функции, заданные классом (называемыми методами), являются реализацией поведения объектов, которые являются общими для всех объектов класса.

Когда следует создавать объектно-ориентированные программы

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

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

Осмыслите проблему с точки зрения ее объектов

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

Рассмотрим проект классов, чтобы представлять учреждения кредитования денег (банки, ипотечные компании, индивидуальные кредиторы денег и так далее). Трудно представлять различные виды кредиторов в качестве процедур. Однако можно представлять каждый объект как объект, который выполняет определенные действия и содержит определенные данные. Процесс разработки объектов включает идентификацию признаков кредитора, важных для вашего приложения.

Идентифицируйте общие черты.  Что общего у всех кредиторов? Все MoneyLender объекты могут иметь loan метод и InterestRate свойство, для примера.

Идентифицируйте различия.  Чем отличается каждый денежный кредитор? Один может предоставлять кредиты предприятиям, другой - только индивидуумам. Поэтому loan операции, возможно, должны быть различными для различных типов кредитных учреждений. Подклассы основы MoneyLender класс может специализироваться на версиях подкласса loan способ. Каждый кредитор может иметь разное значение для своего InterestRate свойство.

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

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

Объекты управляют внутренним состоянием

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

  • Ограничьте значения данных, присвоенные любому заданному свойству

  • Вычислим значение свойства только при запросе

  • Широковещательные уведомления, когда любое значение свойства запрашивается или изменяется

  • Ограничение доступа к свойствам и методам

Уменьшение избыточности

Когда сложность вашей программы увеличивается, преимущества объектно-ориентированного проекта становятся более очевидными. Например, предположим, что вы реализуете следующую процедуру как часть вашего приложения:

  1. Проверяйте входы

  2. Выполните расчет по первому входному параметру

  3. Преобразуйте результат шага 2 на основе второго входного параметра

  4. Проверяйте валидность выходов и возвращаемых значений

Можно реализовать эту процедуру как обычную функцию. Но предположим, что вы снова используете эту процедуру где-то в вашем приложении, кроме того, что шаг 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

Код в базовом классе не копируется и не изменяется. Классы, производные от базового класса, наследуют этот код. Наследование уменьшает количество тестируемого кода и изолирует вашу программу от изменений базовой процедуры.

Определение последовательных интерфейсов

Использование класса в качестве базиса для аналогичных, но более специализированных классов является полезным методом в объектно-ориентированном программировании. Этот класс задает общий интерфейс. Включение этого вида класса в проект программы позволяет вам:

  • Идентифицируйте требования конкретной цели

  • Закодируйте требования в свою программу как класс интерфейса

Уменьшение сложности

Объекты уменьшают сложность, уменьшая то, что вы должны знать, чтобы использовать компонент или систему:

  • Объекты обеспечивают интерфейс, который скрывает детали реализации.

  • Объекты применяют правила, которые управляют взаимодействием объектов.

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

Вот схема трехэлементного списка:

Чтобы добавить узел в список, отсоедините существующие узлы в списке, вставьте новый узел и соедините узлы соответствующим образом. Вот основные шаги:

Сначала отсоедините узлы:

  1. Разблокируйте n2.Prev от n1

  2. Разблокируйте n1.Next от n2

Теперь создайте новый узел, соедините его и измените нумерацию исходных узлов:

  1. Ссылка на new.Prev на n1

  2. Ссылка на new.Next на n3 (был n2)

  3. Ссылка на n1.Next на new (будет n2)

  4. Ссылка на n3.Prev на new (будет n2)

Детали того, как методы выполняют эти шаги, инкапсулируются в проект класса. Каждый объект узла содержит функциональные возможности для вставки в список или удаления из него.

Для примера в этом классе каждый объект узла имеет insertAfter способ. Чтобы добавить узел в список, создайте объект узла, а затем вызовите его insertAfter метод:

nnew = NodeConstructor;
nnew.insertAfter(n1)

Поскольку класс узла определяет код, который реализует эти операции, этот код является:

  • Реализован оптимальным способом автором класса

  • Всегда в курсе текущей версии класса

  • Правильно протестирован

  • Может автоматически обновлять старые версии объектов, когда они загружаются из MAT-файлов.

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

Содействие модульности

Когда вы разлагаете систему на объекты (автомобиль - > двигатель - > топливная система - > кислородный датчик), вы формируете модули вокруг естественных контуров. Классы обеспечивают три уровня контроля модульности кода:

  • Открытый - Любой код может получить доступ к этому конкретному свойству или вызвать этот метод.

  • Protected - Только методы и методы объектов этого объекта, выведенные из класса этого объекта, могут получить доступ к этому свойству или вызвать этот метод.

  • Private - Только собственные методы объекта могут получить доступ к этому свойству или вызвать этот метод.

Перегруженные функции и операторы

Когда вы задаете класс, можно перегрузить существующие функции MATLAB, чтобы работать с новым объектом. Для примера класс последовательного порта MATLAB перегружает fread функция для чтения данных с устройства, подключенного к порту, представленному этим объектом. Можно задать различные операции, такие как равенство (eq) или сложение (plus), для класса, который вы определили, чтобы представлять ваши данные.

Похожие темы