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

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

Лекция №1

Модуль 2

Программное обеспечение (ПО) СУ. Классификация ПО. Технологии разработки программного обеспечения систем управления.

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

· автоматизация управления технологическими процессами (АСУ ТП);

· взаимодействие системы с диспетчером (оператором);

· автоматизированный контроль и измерения (мониторинг);

· обеспечение безопасности;

· дистанционное управление, измерение, сигнализация (задачи телемеханики).

История развития программных средств автоматизации показала, что все особенности отдельных применений можно учесть путем настройки нескольких универсальных программ на выполнение конкретной задачи. К таким универсальным программам относятся:

· OPC сервер;

· средства МЭК-программирования контроллеров;

· SCADA-пакеты.

Для систем автоматизации, не связанных с АСУ ТП, используются программы LabVIEW, MatLab, HP-VEE и др., ориентированные на автоматизацию эксперимента, измерений или математическую обработку их результатов. Для простых задач или широко тиражируемых приложений бывает экономически эффективно использовать заказное программирование на С++ или Visual Basic с применением покупных ActiveX элементов, снижающих трудоемкость разработки.

Под технологией программирования понимается путь от задачи до ее воплощения в программе. Первой законченной технологией программирования является структурное программирование. Создателем структурного подхода считается Э. Дейкстра. По своему подходу этот метод соответствует к третьему поколению языков программирования высокого уровня. Ранее он очень широко применялся в практическом программировании и по сей день не потерял своего значения для определенного класса задач. Структурный подход базируется на двух основополагающих принципах: первый - это использование процедурного стиля программирования, второй - это последовательная декомпозиция алгоритма решения задачи сверху вниз. Задача решается применением последовательности действий. Первоначально задача формулируется в терминах входа-выхода. Это означает что на вход программы подаются некоторые данные. Программа работает и выдает ответ. После этого начинается последовательное разложение всей задачи на более простые действия. Например, если нам необходимо написать программу поиска телефона в телефонной книге, то вначале мы ее запишем следующим образом:

Прочитать фамилию

Сверить фамилию с имеющимися в телефонной книге. Если фамилия есть в телефонной книге, напечатать номер телефона. В противном случае напечатать «Телефона нет»

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

Program phone;

Var

Name: tName;

Phone: tPhone;

Begin

ReadName(Name);

If (CheckDatabase(Name, Phone))

Then Writeln(Phone)

Else Writeln(‘Телефона нет’);

End.

Эта программа использует процедуру ReadName для чтения фамилии и процедуру CheckDatabase для поиска номера телефона в базе данных. Теперь мы можем продолжить процесс составления программы для процедур следующего уровня: чтения фамилии и поиска номера телефона. Они в свою очередь также могут включать в себя процедуры следующего уровня вложенности.

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

Каждый из прямоугольников соответствует объекту реального мира, обладает своим поведением, своим состоянием и идентичностью, т.е. его можно однозначно выделить из окружающего. Например объект - склад. Его можно отделять от всего прочего - идентичность Он может выдавать и принимать заготовки - поведение. Он хранит некоторое количество заготовок - состояние. Станки способны обрабатывать заготовки за конечное время, и это время является их характеристикой - т.е. состоянием. В процессе обработки часть заготовок превратил в детали, часть будет испорчена и станет браком - поведение объекта «станок». При разработке программы, моделирующей подобный производственный участок структурный подход применим очень плохо. Необходим другой подход - а именно объектно-ориентированный. В его основе лежит представление о том, что программу необходимо рассматривать как совокупность взаимодействующих друг с другом объектов. Этот подход соответствует четвертому - новейшему поколению языков программирования высокого уровня. В настоящее время используются оба подхода и структурированный н объектно-ориентированный. То, какой именно применять зависит от решаемой задачи. Рассмотрим пример - программа моделирующая следующую систему: на спутнике установлена камера, она снимает поверхность земли и передает на землю изображение.

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

С другой стороны каждый из этих блоков можно рассматривать как объект, обладающий идентичностью, состоянием и поведением. Например «шумы радиолинии» - это модель физического процесса. Этот блок может быть однозначно отделен от прочих - т.е. обладает идентичностью. Его поведение - получать информацию, искажать ее в зависимости от заложенных характеристик и выдавать дальше. Его состояние - это характеристики искажения. «Компрессия» и «Декомпрессия» - это объекты, описывающие виртуальные машины, выполняющие некоторые преобразования. Поведение - выполнить преобразование. Состояния - параметры алгоритмов преобразования. Общие рекомендации относительно того, какую технологию выбрать, заключаются в следующем: сначала выбирается объектно-ориентированный подход а далее, если делается вывод что он явно избыточен, может быть выбран структурный.

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

· Функциональную точку зрения трудно развивать.

· Реальные системы трудно охарактеризовать функционально.

· Фокусирование на функциональности теряет из виду данные.

· Функциональная ориентация производит код, менее пригодный для многократного использования.

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

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

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

Объектно-ориентированное проектирование - конструирование программных систем как структурных коллекций, реализующих абстрактные типы данных.

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

Объектно-ориентированные методы лучше потому что:

· Они работают на более высоком уровне абстракции.

· Нет "прыжков" между фазами.

· Они поддерживают данные, которые имеют тенденцию, к большей стабильности, чем функции.

· Они поощряют и поддерживают классические достоинства хорошего программирования и проектирования.

· Они сопровождаются инструментами, обеспечивающими поддержку повторного использование кода.

Объектно-ориентированный подход имеет два аспекта:

· объектно-ориентированная разработка программного обеспечения;

· объектно-ориентированная реализация программного обеспечения.

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

· объектно-ориентированные технологии разработки программных систем;

· инструментальные средства, поддерживающие эти технологии.

Объектно-ориентированная разработка может начаться на самом первом этапе жизненного цикла; она не связана с языком программирования, на котором предполагается реализовать разрабатываемую программную систему: этот язык может и не быть объектно-ориентированным.

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

Различные объектно-ориентированные методологии разработки программного обеспечения:

· RUP (Rational Unified Process)

· OMT (Object Modeling Technique)

· SA/SD (Structured Analysis/Structured Design);

· JSD (Jackson Structured Development);

· OSA (Object-Oriented System Analysis)