extracted_text:
Основы
объектно-ориентированного языка программирования
 Парадигма программирования.
Модульное программирование. Нисходящее программирование. Структурное
программирование. Понятия объекта, класса объектов. Основные понятия
объектно-ориентированного программирования: инкапсуляция, наследование и
полиморфизм.
Введение. При изучении
объектно-ориентированного программирования (ООП) наибольшей проблемой является
использование новой терминологии и понимание нового подхода к решению старых
задач - новой технологии программирования. Определения новых терминов
и характеристики методов программирования составляют содержание
данной темы.
Как в любом виде деятельности в
программировании имеется своя технология: - это знания, правила, навыки и
инструменты, позволяющие получать гарантированный качественный результат. Но
само по себе соблюдение ряда правил не дает гарантию качества результата. Это
объясняется спецификой программирования. Во-первых, это не наука, где знание
какой-либо формулы позволяет однозначно решить задачу, подставив в нее исходные
данные и получив результат. Во-вторых, эти правила необходимо соблюдать не
столько на бумаге, сколько в голове. То есть технология программирования - это
скорее способ организации процесса обдумывания программы, нежели ее записи. Из
сказанного следует, что если пишущий программу - мыслит, то он уже
придерживается какой-то технологии программирования, даже не подозревая об
этом. Простейший метод заключается в написании программы сразу от начала до
конца, без использования каких-либо общих принципов, то есть "как бог на
душу положит".
Рассмотрим наиболее известные из
технологий:
·
метод
"северо-западного" угла (имеется в виду лист бумаги или экран
дисплея). Программа пишется сразу от начала до конца, без использования
каких-либо общих принципов;
·
технология
структурного программирования, в ней предполагается придерживаться принципов
модульности, нисходящего и пошагового проектирования программ, одновременного
проектирования программ и структур данных.
·
технология
объектного программирования: связана с использованием при проектировании
программы понятий объектов и их классов.
Парадигма
программирования. Проблема "Что первично - курица или яйцо?"
применительно к программированию звучит как парадигма: "Что первично:
алгоритм (процедура, функция) или обрабатываемые им данные". В
традиционной технологии программирования взаимоотношения процедуры - данные
имеют более-менее свободный характер, причем процедуры (функции) являются
ведущими в этой связке: как правило, функция вызывает функцию, передавая данные
друг - другу по цепочке. Соответственно, технология структурного проектирования
программ, прежде всего, уделяет внимание разработке алгоритма.
В технологии ООП взаимоотношения
данных и алгоритма имеют более регулярный характер: во-первых, класс (базовое
понятие этой технологии) объединяет в себе данные (структурированная
переменная) и методы (функции). Во-вторых, схема взаимодействия функций и
данных принципиально иная. Метод (функция), вызываемый для одного объекта, как
правило, не вызывает другую функцию непосредственно. Для начала он должен иметь
доступ к другому объекту (создать, получить указатель, использовать внутренний
объект в текущем и т.д.), после чего он уже может вызвать для него один из
известных методов. Таким образом, структура программы определяется
взаимодействием объектов различных классов между собой. Как правило, имеет
место иерархия классов, а технология ООП иначе может быть названа как
программирование "от класса к классу".
Модульное
программирование. Принцип модульности формулируется как требование
разработки программы в виде совокупности модулей (функций). При этом разделение
на модули должно носить не механический характер, а исходить из логики
программы:
·
размер
модуля должен быть ограничен;
·
модуль
должен выполнять логически целостное и завершенное действие;
·
модуль
должен быть универсальным, то есть по возможности параметризованным: все
изменяемые характеристики выполняемого действия должны передаваться через
параметры;
·
входные
параметры и результат модуля желательно передавать не через глобальные
переменные, а через формальные параметры и результат функции.
Еще одной, но уже физической единицей
программы является текстовый файл, содержащий некоторое количество функций и
определений типов данных и переменных. Модульное программирование на уровне
файлов - это возможность разделить полный текст программы на несколько файлов,
транслировать их независимо друг от друга.
Принцип модульности распространяется
не только на программы, но и на данные: любой набор параметров, характеризующих
логический или физический объект, должен быть представлен в программе в виде
единой структуры данных (структурированной переменной).
Олицетворением принципа модульности
является библиотека стандартных функций. Она, как правило, обеспечивает полный
набор параметризованных действий, используя общие структуры данных. Библиотеки
представляют собой аналогичные Си-программы, независимо оттранслированные и
помещенные в каталог библиотек.
Нисходящее
программирование. Нисходящее проектирование программы заключается в том,
что разработка идет от общей неформальной формулировки некоторого действия
программы на естественном языке, "от общего к частному": к замене ее
одной из трех формальных конструкций языка программирования:
·
простой
последовательности действий;
·
конструкции
выбора или оператора if;
·
конструкции
повторения или цикла.
В записи алгоритма это соответствует
движению от внешней (объемлющей) конструкции ко внутренней (вложенной). Эти
конструкции также могут содержать в своих частях неформальное описание
действий, то есть нисходящее проектирование по своей природе является
пошаговым. Отметим основные свойства такого подхода:
·
первоначально
программа формулируется в виде некоторого неформального действия на
естественном языке;
·
первоначально
определяются входные параметры и результат действия;
·
очередной
шаг детализации не меняет структуру программы, полученную на предыдущих шагах;
·
если
в процессе проектирования получаются идентичные действия в различных ветвях, то
это означает необходимость оформления этого действия отдельной функцией;
·
необходимые
структуры данных проектируются одновременно с детализацией программы.
В результате проектирования
получается программа, в которой принципиально отсутствует оператор перехода
goto, поэтому такая технология называется "программирование без
goto".
Пошаговое
программирование. Нисходящее проектирование по своей природе является
пошаговым, ибо предполагает каждый раз замену одной словесной формулировки на
единственную конструкцию языка. Но в процессе разработки программы могут быть и
другие шаги, связанные с детализацией самой словесной формулировки в более
подробную.
То, что этот принцип выделен
отдельно, говорит о необходимости предотвратить соблазн детализации программы
сразу от начала до конца и развивать умение выделять и сосредоточивать внимание
на главных, а не второстепенных деталях алгоритма.
Вообще нисходящее пошаговое
проектирование программы не дает гарантии получения "правильной"
программы, но позволяет возвратиться при обнаружении тупиковой ситуации к одному
из верхних шагов детализации.
Структурное
программирование. При нисходящей пошаговой детализации программы
необходимые для работы структуры данных и переменные появляются по мере
перехода от неформальных определений к конструкциям языка, то есть процессы
детализации алгоритма и данных идут параллельно. Однако это касается, прежде
всего, отдельных локальных переменных и внутренних параметров. С самой же общей
точки зрения предмет (в нашем случае - данные) всегда первичен по отношению к
выполняемым с ним действиям (в нашем случае - алгоритм). Поэтому на самом деле
способ организации данных в программе более существенно влияет на ее структуру
алгоритма, чем что-либо другое, и процесс проектирования структур данных должен
опережать процесс проектирования алгоритма их обработки.
Структурное программирование -
модульное нисходящее пошаговое проектирование алгоритма и структур данных.
Объектно-ориентированный подход к
программированию включает в себя 3 основные компоненты:
·
объектно-ориентированный
анализ (ООА),
·
объектно-ориентированное
проектирование (ООД),
·
объектно-ориентированное
программирование (ООП).
В любой инженерной дисциплине под
проектированием обычно понимается некий унифицированный подход, с помощью
которого мы ищем пути решения определенной проблемы, обеспечивая выполнение
поставленной задачи. В контексте инженерного проектирования цель проектирования
определяется как создание системы, которая
·
удовлетворяет
заданным (возможно, неформальным) функциональным спецификациям;
·
согласована
с ограничениями, накладываемыми оборудованием;
·
удовлетворяет
явным и неявным требованиям по эксплуатационным качествам и потреблению
ресурсов;
·
удовлетворяет
явным и неявным критериям дизайна продукта;
·
удовлетворяет
требованиям к самому процессу разработки, таким, например, как
продолжительность и стоимость, а также привлечение дополнительных
инструментальных средств.
Проектирование подразумевает учет
противоречивых требований. Его продуктами являются модели, позволяющие нам
понять структуру будущей системы, сбалансировать требования и наметить схему
реализации.

Программа – это числовая модель
проектируемой системы.

Важность построения модели.Моделирование
широко распространено во всех инженерных дисциплинах, в значительной степени
из-за того, что оно реализует принципы декомпозиции, абстракции и иерархии.
Каждая модель описывает определенную часть рассматриваемой системы, а мы в свою
очередь строим новые модели на базе старых, в которых более или менее уверены.
Модели позволяют нам контролировать наши неудачи. Мы оцениваем поведение каждой
модели в обычных и необычных ситуациях, а затем проводим соответствующие
доработки, если нас что-то не удовлетворяет.
Элементы программного проектирования.Ясно,
что не существует такого универсального метода, который бы провел инженера-программиста
по пути от требований к сложной программной системе до их выполнения.
Проектирование сложной программной системы не сводится к слепому следованию
некоему набору рецептов. Скорее это постепенный и итеративный процесс. И тем не
менее использование методологии проектирования вносит в процесс разработки
определенную организованность. Инженеры-программисты разработали десятки
различных методов, которые мы можем классифицировать по трем категориям.
Несмотря на различия, эти методы имеют что-то общее. Их, в частности,
объединяет следующее:
·
условные
обозначения - язык для описания каждой модели;
·
процесс
- правила проектирования модели;
·
инструменты
- средства, которые ускоряют процесс создания моделей, и в которых уже
воплощены законы функционирования моделей. Инструменты помогают выявлять ошибки
в процессе разработки.
Хороший метод проектирования
базируется на прочной теоретической основе и при этом дает программисту
известную степень свободы самовыражения.
Объектно-ориентированные модели.Существует
ли наилучший метод проектирования? На этот вопрос нет однозначного ответа. По
сути дела это завуалированный предыдущий вопрос: "Существует ли лучший
способ декомпозиции сложной системы?" Если и существует, то пока он никому
не известен. Этот вопрос можно поставить следующим образом: "Как наилучшим
способом разделить сложную систему на подсистемы?" Еще раз напомним, что
полезнее всего создавать такие модели, которые фокусируют внимание на объектах,
найденных в самой предметной области, и образуют то, что называетсяобъектно-ориентированной
декомпозицией.
Объектно-ориентированный анализ и
проектирование - это метод, логически приводящий к объектно-ориентированной
декомпозиции. Применяя объектно-ориентированное проектирование, создаются
гибкие программы, написанные экономными средствами. При разумном разделении
пространства состояний мы добиваемся большей уверенности в правильности нашей
программы. В итоге, мы уменьшаем риск при разработке сложных программных
систем.
Так как построение моделей крайне
важно при проектировании сложных систем, объектно-ориентированное
проектирование предлагает богатый выбор моделей, которые представлены на рис.
1. Объектно-ориентированные модели проектирования отражают иерархию и классов,
и объектов системы. Эти модели покрывают весь спектр важнейших конструкторских
решений, которые необходимо рассматривать при разработке сложной системы, и
таким образом вдохновляют нас на создание проектов, обладающих всеми пятью
атрибутами хорошо организованных сложных систем.

Рис. 1. Объектно-ориентированные
модели.
Выводы
·
Программам
присуща сложность, которая нередко превосходит возможности человеческого
разума.
·
Задача
разработчиков программных систем - создать у пользователя разрабатываемой
системы иллюзию простоты.
·
Сложные
структуры часто принимают форму иерархий; полезны обе иерархии: и классов, и
объектов.
·
Сложные
системы обычно создаются на основе устойчивых промежуточных форм.
·
Познавательные
способности человека ограничены; мы можем раздвинуть их рамки, используя
декомпозицию, выделение абстракций и создание иерархий.
·
Сложные
системы можно исследовать, концентрируя основное внимание либо на объектах,
либо на процессах; имеются веские основания использовать
объектно-ориентированную декомпозицию, при которой мир рассматривается как
упорядоченная совокупность объектов, которые в процессе взаимодействия друг с
другом определяют поведение системы.
·
Объектно-ориентированный
анализ и проектирование - метод, использующий объектную декомпозицию;
объектно-ориентированный подход имеет свою систему условных обозначений и
предлагает богатый набор логических и физических моделей, с помощью которых мы
можем получить представление о различных аспектах рассматриваемой системы.

alt: Выводы ·