Лекция 21
Под методом проектирования понимают выбор того или иного метода и технологии разработки программных средств, обеспечивающего создание готового программного продукта. Это подразумевает как проектирование системы и ее реализацию на каком-либо языке программирования, так и компоновку сложно программной системы из отдельных блоков. Существует несколько способов конструирования программ на основе общепризнанных подходов, к которым относятся: структурный подход; модульное проектирование; объектно-ориентированное проектирование; проектирование с использованием CASE - средств, а также групповые методы разработки программного обеспечения. Рассмотрим кратко основы каждого из подходов.
Структурный подход. В основу структурного программирования положены следующие положения:
1. Алгоритм и программа должны составляться поэтапно (по шагам).
2. Сложная задача должна разбиваться на достаточно простые подзадачи, каждая из которых имеет только один вход и один выход.
3. Логика алгоритма и программы должны опираться на минимальное число простых базовых управляющих структур.
4. Соответствующее представление данных с использованием большого числа разнообразных типов.
Первые два положения будут подробно рассмотрены в следующем параграфе. Здесь более детально остановимся на третьем положении.
Фундаментом структурного программирования является теорема о структурировании, утверждающая, что как бы сложна ни была задача, схема программы всегда может быть представлена с использованием четырех базовых управляющих структур: следование (а), развилка (б), повторение (в) и выбор (г) (рисунок).
В этих схемах A, B, N - операторы, группы операторов или программные модули; T, F-TRUE (истина), FALSE (ложно); P-логическое выражение.
Приведенные элементарные структуры могут соединятся между собой, образуя более сложные структуры по тем же схемам. Любой алгоритм может быть реализован с помощью композиции этих четырех конструкций.
Приведенные выше примеры реализации основных операторов языка Паскаль, а также процедур и функций с их использованием, опирались на структурный подход к технологии программирования, поскольку декомпозиция программы на блоки выполнялась на основе иерархии функций и передаче информации между отдельными функциональными элементами.
Объектный подход при разработке программных средств использует декомпозицию системы на составляющие систему объекты и связи между ними. Поведение системы описывается в терминах обмена сообщениями между объектами. Каждый объект системы обладает своим собственным поведением, моделирующим поведение реального мира. Основными понятиями объектно-ориентированного подхода являются объект и класс.
Объект (object) – это часть реального мира. Каждый объект описывается следующими элементами:
- состояние, которое описывает свойства объекта в данный момент времени;
- поведение в виде изменения состояния под воздействием каких-либо причин;
- связи с окружающим миром в виде воздействий объекта на другие объекты окружающего мира и ответных воздействий на объект.
Объекты реального мира и живой природы обладают следующими фундаментальными свойствами: инкапсуляция, наследование, полиморфизм. Основной признак, по которому можно выделить объект из окружающего мира – его целостность, внутренние свойства, связывающие внутренние части объекта в единое целое. Эта скрытность сущности объекта внутри него называется инкапсуляция (Encapsulation). Объекты живой природы обладают свойством наследования (inheritance) – объект, порожденный другим объектом, наследует от него его свойства. Порожденный и порождающий объекты называются наследник и предок.
В живой природе, при наследовании свойств предка наследником, происходит изменение унаследованных свойств. Это приводит к разнообразию свойств живых объектов – от предка порождается несколько отличающихся по свойствам наследников, а не несколько экземпляров наследника с одними и теми же свойствами. Это свойство называется полиморфизмом (Polymorphism).
Возможность программного моделирования реальных объектов позволяет разрабатывать программу в понятиях реального мира, а не алгоритмов обработки данных, что существенно упрощает решение прикладных задач. Программная модель объекта является основой ООП. Терминология ООП еще не устоялась, в данной главе будет применяться терминология, используемая в языках Object Pascal и Turbo Pascal.
Элементы описания объектов реального мира программно моделируются следующим образом:
- состояние объекта моделируется полями - данными описываемыми внутри объекта и сохраняющими свои значения в течение всего времени существования объекта;
- поведение объекта моделируется методами – процедурами и функциями, изменяющими состояние объекта – значения полей в зависимости от причин;
- причины изменения состояния моделируются параметрами методов (процедур и функций);
- связи объекта с миром моделируются сообщениями, передаваемыми как вызовы методов объектов – приемников сообщений с передачей конкретных значений параметров процедур и результатов функций. Как и объекты реального мира, программные объекты обладают фундаментальными свойствами:
- инкапсуляция, сокрытие полей и методов внутри объекта от доступа из других частей программы;
- наследование, возможность построения объекта – наследника другого объекта, содержащего поля и методы предка и имеющего возможность добавить свои, индивидуальные поля и методы;
- полиморфизм, возможность наследника заменять унаследованные методы предка на свои, индивидуальные методы.
Над программными объектами, кроме операций, моделирующих поведение реальных объектов, выполняются следующие дополнительные операции:
- создание экземпляра объекта и размещение его в памяти программы;
- инициализация экземпляра объекта, присваивание его полям значений, моделирующих начальное состояние объекта;
- уничтожение экземпляра объекта и освобождение занимаемой им памяти.
Объектный подход можно реализовать на любом языке программирования, но специализированные объектно-ориентированные языки содержат удобные средства ООП. Объектные возможности и детали реализации ООП пока не стандартизированы, каждый язык ООП имеет свои особенности:
- язык Turbo Pascal, начиная с версии 5.5, содержит минимум средств ООП, достаточных для изучения методологии ООП и решения несложных задач;
- язык C++ содержит мощные средства ООП, сложные для начального изучения методам ООП. Эти средства предназначены для практического применения ООП при решении сложных задач;
- язык Smalltalk-80 содержит только объектные средства, реализующие возможности современного объектного подхода, отсутствующие в языке C++ и других объектно-ориентированных языках.
Особенности построения программ на языке Паскаль с использованием объектного подхода будут рассмотрены в главе 16.
Модульное программирование. В программировании общее признание получил принцип построения программ из отдельных программных модулей. Каждый модуль представляет собой завершенную программу, в которой решается часть общей задачи. Для установления связей между модулями в каждом из них определяют: какие данные поступают на вход и какие он формирует в процессе выполнения.
При таком программировании программа представляется в виде иерархии модулей. Модули верхнего уровня выполняют более общие функции и вызывают модули нижних уровней, в которых детализируется решение задачи.