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

1.    Введение

 

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

Объектно-ориентированный язык программирования долженобладать следующими свойствами:

1.  абстракции – формальное о качествах или свойствах предмета путеммысленного удаления некоторых частностей или материальных объектов;

2.  инкапсуляции – механизма, связывающего вмести код и данные,которыми он манипулирует, и защищающего их от внешних помех и некорректногоиспользования;

3.  наследования – процесса, с помощью которого один объектприобретает свойства другого, т.е. поддерживается иерархической классификации;

4.  полиморфизма – свойства, позволяющего использовать один и тот жеинтерфейс для общего класса действий.

Разработка объектно-ориентированных программ состоитиз следующих последовательных работ:

-    определение основных объектов,необходимых для решения данной задачи;

-    определение закрытых данных(данных состояния) для выбранных объектов;

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

-    определение иерархической системыклассов, представляющих выбранные объекты;

-    определение ключевых сообщений,которые должны обрабатывать объекты каждого класса;

-    разработка последовательностивыражений, которые позволяют решить поставленную задачу;

-    разработка методов, обрабатывающихкаждое сообщение;

-    очистка проекта, то естьустранение всех вспомогательных промежуточных материалов, использовавшихся припроектировании;

-    кодирование, отладка, компоновка итестирование.

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


2.Что такое объектно-ориентированное программирование

 

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

         Основнаяцель ООП, как и большинства других подходов к программированию – повышениеэффективности разработки программ. Идеи ООП оказались плодотворными и нашлиприменение не только в языках программирования, но и в других областях Computer Science, например, в области разработки операционных систем.

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

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

 

3. Объекты

 

         Базовымв объектно-ориентированном программировании является понятие объекта.Объект имеет определённые свойства. Состояние объекта задаётся значениями егопризнаков. Объект «знает», как решать определённые задачи, то есть располагаетметодами решения. Программа, написанная с использованием ООП, состоит изобъектов, которые могут взаимодействовать между собой.

         Ранееотмечалось, что программная реализация объекта представляет собой объединениеданных и процедур их обработки. Переменные объектного типа называют экземплярамиобъекта. Здесь требуется уточнение – экземпляр можно лишь формально назватьпеременной. Его описание даётся в предложение описания переменных, но вдействительности экземпляр – нечто большее, чем обычная переменная.

         Вотличие от типа «запись», объектный тип содержит не только поля, описывающиеданные, но также процедуры и функции, описания которых содержится в описанииобъекта. Эти процедуры и функции называют методами. Методам объектадоступны его поля. Следует отметить, что методы и их параметры определяются вописании объекта, а их реализация даётся вне этого описания, в том мест программы,которое предшествует вызову данного метода. В описании объекта фактическисодержаться лишь шаблоны обращения к методам, которые необходимыкомпилятору для проверки соответствия количества параметров и их типов при обращениик методам. Вот пример описания объекта[1]:

Type

    Location= object

             X,Y:Integer;

             ProcedureInit(InitX, InitY: Integer);

             FunctionGetX: Integer;

             FunctionGetY: Integer;

End;

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

object…end, между которыми находиться описание полей и методов. Внашем примере объект содержит два поля для хранения значений графическихкоординат, а так же для описания процедуры и двух функций  — это методыданного объекта. Процедура предназначена для задания первоначального положенияобъекта, а функция – для считывания его координат.

4. Инкапсуляция

 

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

         Внашем примере описание объекта процедура инициализации Init и функции GetX и GetY ужене существуют как отдельные самостоятельные объекты. Это неотъемлемые частиобъектного типа Location. Если впрограмме имеется описание нескольких переменных указанного типа, то для каждойпеременной резервируется своя собственная область памяти для хранения данных, ауказатели на точки входа в процедуру и функции – общие. Вызов каждого методавозможен только с помощью составного имени, явно указывающего, для обработкикаких данных предназначен данный метод.


5. Наследование

 

         Наследование– это ещё одно базовое понятие объектно-ориентированного программирования.Наследование позволяет определять новые объекты, используя свойства прежних,дополняя или изменяя их. Объект-наследник получает все поля и методы «родителя»,к которым он может добавить свои собственные поля и методы или заменить(«перекрыть») их своими методами. Пример описания объекта-наследника даётсяниже:

Tipe

      Point= object(Location)

                Visible:Boolean;

                ProcedureInt(IntX, IntY: Integer);

                            Procedure Show;

                            ProcedureHide;

                            FunctionIsVisible: Boolean;

                            ProcedureMoveTo(NewX, NewY: Integer);

                   End;

Наследником здесь является объект Point, описывающий графическую точку, а родителем – объект Location. Наследник не содержит описание полей и методовродителя. Имя последнего указывается в круглых скобках после слова object. Из методов наследника можно вызывать методы родителя.Для создания наследника не требуется иметь исходный текст объекта родителя.Объект-родитель может быть уже в составе оттранслированного модуля.

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

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

6. Виртуальные методы

 

         Наследованиепозволяет создавать иерархические, связанные отношениями подчинения, структурыданных. Следует, однако, заметить, что при использовании этой возможности могутвозникнуть проблемы. Предположим, что в нашей графической программе необходимоопределить объект Circle, которыйявляется потомком другого объекта Point:

         Type

                   Circle = object (point)

                            Radius:Integer;

                            ProcedureShow;

                            ProcedureHide;

                            ProcedureExpand(ExpandBy: Integer);

                            ProcedureContact(ContactBy: Integer);

                   End;

Новый объект Circle соответствует окружности. Поскольку свойства окружности отличаются отсвойств точки, в объекте-наследнике придется изменять процедуры Show и Hide, которыеотображают окружность и удаляют её изображение с экрана. Может оказаться, чтометод Init (см. предыдущий пример) объекта Circle, унаследованный от объекта Point, также использует методы Show и Hide, впредьво время трансляции объекта Point использует ссылки на старые методы. Очевидно вобъекте Circle они работать не будут. Можно, конечно, попытаться«перекрыть» метод Init. Чтобы этосделать, нам придётся полностью воспроизвести текст метода. Это усложни работу,да и не всегда возможно, поскольку исходного текста программы может неоказаться под рукой (если объект-родитель уже находиться в оттранслированноммодуле).

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

Чтобы использовать виртуальный метод, необходимо в описанииобъекта после заголовка метода добавить ключевое слово virtual. Заголовки виртуальных методов родителя и наследникадолжны в точности совпадать. Инициализация экземпляра объекта, имеющеговиртуальные методы, должна выполняться с помощью специального метода – конструктора.Конструктор обычно присваивает полям объекта начальные значения и выполняетдругие действия по  инициализации объекта. В заголовке метода-конструктораслово procedure заменяется словом constructor.Действия обратные действиям конструктора, выполняет ещё один специальный метод– деструктор. Он описывается словом destructor.

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

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

Заметим, что конструктор или деструктор, могут быть«пустыми», то есть не содержать операторов. Весь необходимый код в этом случаесоздается при трансляции ключевых слов construct и destruct.


7. Динамическое создание объектов

 

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

         New(P,Construct)

или

         Dispose(P,Destruct)

Где P –указатель на переменную объектного типа, а Construct или Destruct– конструктор и деструктор этого типа.

         Действиепроцедуры New в случае расширенного синтаксиса равносильно действиюследующей пары операторов:

New(P);

         P^.Construct;

ЭквивалентомDispose является следующее:

         P^Dispose;

         Dispose(P)

         Применениерасширенного синтаксиса не только улучшает читаемость исходного кода, но игенерирует более короткий и эффективный исполняемый код.

8. Полиморфизм

 

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

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

Var

    Alocation: Location;

     Apoin:Point;

     Acircle: Circle;

Alocation:=Apoint

Apoint :=Acrcle;

Alocation :=Acircle;

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

 

еще рефераты
Еще работы по информатике, программированию