yandex rtb 1
ГоловнаЗворотній зв'язок
yande share

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

Лекция 1.

Парадигмы программирования. Объектно-ориентированное программирование. Объекты и классы. Абстракция и иерархия.

 

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

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

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

Рис. 1. Процедурная программа.

 

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

Усложнение задач привело к тому, что программы стали содержать сотни процедур и опять стали необозримыми. «Строительные блоки» стали слишком маленькими. Потребовался новый стиль программирования. В это же время обнаружилось, что удачная или неудачная структура данных может сильно облегчить или усложнить их обработку. Одни данные удобнее объединять в массив, для других больше подходит список, стек или дерево. Возникла идея объединить исходные данные и все процедуры их обработки в один модуль. Эта идея модульного программирования на некоторое время стала парадигмой.

Рис.2. Модульная программа.

 

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

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

Что же такое объектно-ориентированное программирование (object-oriented programming, OOP)? Можно определить его следующим образом:

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

В данном определении можно выделить три части: 1) ООП использует в качестве базовых элементов объекты, а не алгоритмы; 2) каждый объект является экземпляром какого-либо определенного класса; 3) классы организованы иерархически.

Рис. 3. Иерархическая структура классов

 

Что же такое объект? С точки зрения восприятия человеком объектом может быть:

  • осязаемый и (или) видимый предмет;
  • нечто, воспринимаемое мышлением;
  • нечто, на что направлена мысль или действие.

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

Итак, объект моделирует часть окружающей действительности и таким образом существует во времени и пространстве.

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

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

Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности поведения от несущественных.

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

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

Большинство людей видит мир состоящим из объектов, которые связаны друг с другом иерархическим (т.е. организованным «сверху вниз») способом. Хорошо это видно на примере биологии. Например, сиамские кошки являются породой кошек, которые в свою очередь являются представителем семейства кошачьих. Это семейство есть часть класса млекопитающих и т.д. Естественно, на каждом уровне иерархии объекты имеют свой набор свойств. Но одновременно объекты, расположенные в иерархии ниже. Обладают всеми свойствами объектов, расположенных выше по иерархической лестнице. Кошка любой породы обладает чертами, свойственными всем кошкам – шерсть, усы. Любой представитель семейства кошачьих обладает чертами класса млекопитающих – скелет, молочные железы и т.п. Таким образом, имея описание объекта, стоящего на более высокой ступени иерархии, нет необходимости описывать полностью объект, стоящий в иерархии ниже. Достаточно указать лишь его специфические черты.

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

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

 

3