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

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

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

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

Процедурное проектирование программы

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

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

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

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

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

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

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

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

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

Используя объекты в программах 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.

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

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

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

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

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

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

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

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

Сокращение сокращения

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

  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-файлов.

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

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

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

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

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

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

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

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

Похожие темы

Была ли эта тема полезной?