exponenta event banner

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

Подходы к написанию программ 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-файлов.

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

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

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

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

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

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

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

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

Связанные темы