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

Обновлено: 25.06.2024

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

Методики, применяемые для проектирования программ и их систем, естественно, были сформированы не за один день, а становление их проходило на протяжении достаточно продолжительного промежутка времени. Необходимость создания все новых и новых методик обнаруживалась при разработке сложных программных систем в условиях дефицита времени на разработку. Такие инциденты были свойственны крупным промышленным организациям, в частности, оборонного ведомства. По этой причине некоторые сегодняшние методики изначально были, например, внутренними стандартами Министерства Обороны Соединенных Штатов Америки.

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

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

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

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

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

Исходя из вышесказанного, определяется цель исследования: рассмотреть основные понятия объектно-ориентированного программирования.

Для достижения поставленной цели необходимо выполнить следующие задачи:

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

Глава 1. Объектно-ориентированное программирование. Сущность, характеристики

1.1 Сущность объектно-ориентированного программирования

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

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

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

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

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

Класс – это некоторое множество объектов, которые связаны общностью структуры и поведения. Класс инкапсулирует (объединяет) в себе данные (атрибуты) и поведение (операции). Любой объект представляет собой экземпляр класса.

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

    • унифицированный процесс;
    • унифицированный язык моделирования;
    • шаблоны проектирования [4] .

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

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

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

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

    Таким образом, объектно-ориентированный подход обеспечивает адекватные подходы к решению следующих проблем:

    • снижение сложности программного обеспечения;
    • увеличение надежности программного обеспечения;
    • обеспечение возможности модификации отдельных составляющих ПО без изменения остальных его компонентов;
    • обеспечение возможности повторного использования отдельных компонентов программного обеспечения [6] .

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

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

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

      • абстрагирование (abstraction);
      • инкапсуляция (encapsulation);
      • наследование (inheritance);
      • полиморфизм (polymorphism);
      • модульность (modularity);
      • иерархия (hierarchy) [7] .

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

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

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

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

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

      Иерархия представляет собой ранжированную или упорядоченную систему абстракций, их некоторое распределение по уровням. Основными видами иерархических структур применительно к сложным системам являются структура классов и структура объектов. Как пример иерархии классов можно привести: простое и множественное наследование (один класс применяет структурную или функциональную часть соответственно одного или нескольких других классов), а иерархии объектов – агрегация [8] .

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

      Ниже рассматриваются некоторые второстепенные понятия объектно-ориентированного подхода.

      Примерами фактических сущностей могут выступать такие предметы и явления, как автомобиль, регулирование движения или сам регулировщик. А примерами воображаемых сущностей могут служить такие процессы как методические рекомендации к сборке автомобиля или оптимальная конструкция светофора [10] .

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

      Глава 2. Основные понятия объектно-ориентированного программирования

      2.1 Классы

      Класс – это абстрактное понятие, сравнимое с понятием категория в его обычном смысле.

      По определенным свойствам этого элемента можно установить, что он принадлежит к какой-то категории. Сама категория определяется общими свойствами, которые имеют все экземпляры этой категории [12] .

      Это можно пояснить на примере музыкальных инструментов. Музыкальные инструменты делятся на следующие категории: духовые, ударные и струнные. Все эти категории принадлежат к категории музыкальных инструментов. В свою очередь, категория музыкальных инструментов входит в категорию инструментов.

      На рисунке 1 эта структура категорий представлена графически в виде дерева.

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

      Класс в ООП – это абстрактный тип данных, который включает в себя не только данные, но и функции и процедуры.

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

      Существует 2 способа включения метода в класс:

      1. Определение метода при описании класса.
      2. Объявление метода при описании, а его описание - при вызове.

      Методы, определенные внутри класса, являются неявно встроенными.

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

      Также как и структуры, классы можно задавать либо статически, либо динамически.

      • статически - Toplist foo;
      • динамически - Toplist *bar ; bar=new Toplist;

      Для статических и динамических классов применимы те же правила и принципы, что и для статических и динамических переменных [13] .

      2.2 Наследование

      Наследование – один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с инкапсуляцией, полиморфизмом и абстракцией), позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса [14] .

      Простое наследование: Класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). В некоторых языках используются абстрактные классы.

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

      Наследование классов — очень мощная возможность в объектно-ориентированном программировании. Оно позволяет создавать производные классы (классы наследники), взяв за основу все методы и элементы базового класса (класса родителя). Таким образом, экономится масса времени на написание и отладку кода новой программы. Объекты производного класса свободно могут использовать всё, что создано и отлажено в базовом классе. При этом, мы можем в производный класс, дописать необходимый код для усовершенствования программы: добавить новые элементы, методы и т.д.. Базовый класс останется нетронутым [15] .

      При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

      Основные характеристики и важные особенности наследования:

      1. Наследование – это определение производного класса, который может обращаться ко всем элементам и методам базового класса за исключением тех, которые находятся в поле private;
      2. Синтаксис определения производного класса: class Имя_Производного_Класса: спецификатор доступаИмя_Базового_Класса < /*код*/ >;
      3. Производный класс имеет доступ ко всем элементам и методам базового класса, а базовый класс может использовать только свои собственные элементы и методы.
      4. В производном классе необходимо явно определять свои конструкторы, деструкторы и перегруженные операторы присваивания из-за того, что они не наследуются от базового класса. Но их можно вызвать явным образом при определении конструктора, деструктора или перегрузки оператора присваивания производного класса, например таким образом (для конструктора): Конструктор_Производного_Класса (/*параметры*/) : Конструктор_Базового_Класса ( /*параметры*/) < >.
      5. Еще один важный момент при наследовании – перегруженные функции-методы класса потомка. В данном примере мы его не рассматривали. Но чтобы вы знали, если в классе родителе и в его классах потомках встречаются методы с одинаковым именем, то для объектов класса потомка компилятор будет использовать методы именно класса потомка. Перегруженные методы класса потомка, могут вызывать методы класса родителя. В таком случае важно помнить, что необходимо правильно определить область действия с помощью оператора :: .Иначе компилятор воспримет это, как вызов функцией самой себя [16] .

      2.3 Инкапсуляция

      Внутри объекта коды и данные могут быть закрытыми (private). Закрытые коды или данные доступны только для других частей этого объекта. Таким образом, закрытые коды и данные недоступны для тех частей программы, которые существуют вне объекта. Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того, чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.

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

      Примеры реализации инкапсуляции на различных языках программирования приведены ниже.

      public double ValueDouble;

      public string ValueString;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      Procedure Init(InitX, InitY: Integer);

      Function GetX: Integer;

      Function GetY: Integer;

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

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

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

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

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

      Procedure Int(IntX, IntY: Integer);

      Function IsVisible: Boolean;

      Procedure MoveTo(NewX, NewY: Integer);

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

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

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

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

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

      Circle = object (point)

      Procedure Expand(ExpandBy: Integer);

      Procedure Contact(ContactBy: Integer);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      [1] Выполняется на языке Turbo Pascal, начиная с версии 5.0. Далее все примеры даны для выполнения на этом языке программирования.

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

      Содержание

      ВВЕДЕНИЕ………………………………………. ………………. …….3
      Глава 1. История объектно-ориентированного программирования……4
      Глава 2. Объекты в объектно-ориентированном программировании….9
      Глава 3. Инкапсуляция в объектно-ориентированном программировании………………………………………………………………11
      Глава 4. Наследование и виртуальные методы………………………. 12
      Глава 5. Динамическое создание объектов и полиморфизм………………………………………………………….…………16
      ЗАКЛЮЧЕНИЕ ………………………………………………………..…18
      СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ ………………….……. 20

      Прикрепленные файлы: 1 файл

      РЕФЕРАТ объектно-ориентированное программирование.doc

      Министерство образования Российской Федерации

      Министерство сельского хозяйства Российской Федерации

      Иркутская государственная сельскохозяйственная академия

      Кафедра информатики и математического моделирования

      по дисциплине: Парадигмы программирования

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

      Глава 1. История объектно-ориентированного программирования……4

      Глава 2. Объекты в объектно-ориентированном программировании….9

      Глава 3. Инкапсуляция в объектно-ориентированном программировании…………………………………… …………………………11

      Глава 4. Наследование и виртуальные методы………………………. 12

      Глава 5. Динамическое создание объектов и полиморфизм………………………………………………… ……….…………16

      СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ ………………….……. 20

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

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

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

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

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

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

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

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

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

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

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

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

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

      Глава 1. История объектно-ориентированного программирования

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

      Начало развитию объектно-ориентированного подхода положил язык Simula 67, который был разработан в конце 60-х гг. в Норвегии. Несмотря на то, что язык намного опередил свое время, современники (программисты 60-х гг.) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran).

      Но достоинства языка Simula 67 были замечены некоторыми программистами, и в 70-е гг. было разработано большое число экспериментальных объектно-ориентированных языков программирования. В результате исследования этих языков были разработаны современные объектно-ориентированные языки программирования: C++, Ada, Smalltalk и др.

      Наиболее распространенным объектно-ориентированным языком программирования является язык C++. Он возник на базе соединения языков С и Simula. С++ был разработан в начале 80-х Бьерном Страуструпом, сотрудником компании AT&T. Все эти годы язык интенсивно развивался, и, наконец, в августе 1998 г. был принят международный стандарт языка С++.

      Разработка новых объектно-ориентированных языков программирования продолжается и в настоящее время. Например, с 1995 г. стал широко распространяться объектно-ориентированный язык программирования Java, ориентированный на сети компьютеров и, прежде всего, на Internet.

      Вместе с развитием объектно-ориентированного программирования стали развиваться и объектно-ориентированные методы разработки программного обеспечения, охватывающие стадии анализа и проектирования. Среди общепризнанных объектно-ориентированных подходов к анализу и проектированию следует выделить методы Г. Буча, Д. Рамбо, А. Джекобсона, Шлеера-Меллора и Коуда-Йордона. В результате объединения усилий первых трех авторов появился на свет унифицированный язык моделирования UML, который в 1997 г. был принят в качестве стандарта консорциумом Object Management Group и получил широкое распространение в сфере производства программного обеспечения.

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

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

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

      – объект описывается набором атрибутов (свойств), значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект;

      – объекты, описанные одним и тем же набором атрибутов и способные выполнять один и тот же набор операций, представляют собой класс однотипных объектов.

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

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

      – уменьшение сложности программного обеспечения;

      – повышение его надежности;

      – обеспечение возможности модификации отдельных компонент программ без изменения остальных компонент;

      – обеспечение возможности повторного использования отдельных компонент программного обеспечения.

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

      • Для учеников 1-11 классов и дошкольников
      • Бесплатные сертификаты учителям и участникам

      ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

      ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

      Факультет физико – математический

      Кафедра информатики и вычислительной техники

      Особенности объектно-ориентированных языков

      Автор работы________________________________________ А. А. Кирсанова

      Направления подготовки 44.03.05 Педагогическое образование

      Профиль Математика. Информатика

      Руководитель работы: канд. физико – матем. наук, доцент___________________________________________ Т. В. Кормилицына

      Введение

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

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

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

      1.1 Технологии программирования

      Технология программирования – это совокупность методов и средств разработки (написания) программ и порядок применения этих методов и средств.

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

      В 1958 году были разработаны первые языки программирования, Фортран и Алгол-58. Программа на Фортране состояла из главной программы и некоторого количества процедур - подпрограмм и функций. Программа на Алголе-58 и его последующей версии Алголе-60 представляла собой единое целое, но имела блочную структуру, включающую главный блок и вложенные блоки подпрограмм и функций.

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

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

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

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

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

      – построением языка программирования, содержащего как можно больше типов данных, и выбором для каждого класса задач некоторого подмножества этого языка. Такой язык иногда называют языком-оболочкой. На роль языка-оболочки претендовал язык ПЛ/1, оказавшийся настолько сложным, что так и не удалось построить его формализованное описание. Отсутствие формализованного описания, однако, не помешало широкому применению ПЛ/1 как в Западной Европе, так и в СССР;

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

      Дальнейшим развитием второго пути явился объектно-ориентированный подход к программированию.

      1.2 Сущность объектно-ориентированного подхода к программированию

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

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

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

      1.3 Принципы объектно-ориентированного программирования

      В основу ООП положены следующие принципы:

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

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

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

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

      Необходимость ограничения доступа предполагает разграничение двух частей в описании абстракции:

      1) интерфейс – совокупность доступных извне элементов реализации абстракции (основные характеристики состояния и поведения);

      2) реализация – совокупность недоступных извне элементов реализации абстракции (внутренняя организация абстракции и механизмы реализации ее поведения).

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

      – выполнять конструирование системы поэтапно, не отвлекаясь на особенности реализации используемых абстракций;

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

      Сочетание объединения всех свойств предмета (составляющих его состояния и поведения) в единую абстракцию и ограничения доступа к реализации этих свойств получило название инкапсуляции.

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

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

      В ООП используются два вида иерархии:

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

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

      Использование принципа типизации обеспечивает:

      – раннее обнаружение ошибок, связанных с недопустимыми операциями над программными объектами (ошибки обнаруживаются на этапе компиляции программы при проверке допустимости выполнения данной операции над программным объектом);

      – возможность генерации более эффективного кода.

      Тип может связываться с программным объектом статически (тип объекта определен на этапе компиляции – раннее связывание) и динамически (тип объекта определяется только во время выполнения программы – позднее связывание). Реализация позднего связывания в языке программирования позволяет создавать переменные-указатели на объекты, принадлежащие различным классам (полиморфные объекты), что существенно расширяет возможности языка.

      Параллелизм – свойство нескольких абстракций одновременно находиться в активном состоянии, т.е. выполнять некоторые операции.

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

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

      Устойчивость – свойство абстракции существовать во времени независимо от процесса, породившего данный программный объект, и/или в пространстве, перемещаясь из адресного пространства, в котором он был создан.

      – временные объекты, хранящие промежуточные результаты некоторых действий, например, вычислений;

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

      – глобальные объекты, существующие пока программа загружена в память;

      – сохраняемые объекты, данные которых хранятся в файлах внешней памяти между сеансами работы программы.

      Все указанные выше принципы в той или иной степени реализованы в различных версиях объектно-ориентированных языков.

      Язык считается объектно-ориентированным, если в нем реализованы первые четыре из рассмотренных семи принципов.

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

      Объектно-ориентированный язык программирования (ОО-язык) – язык, построенный на принципах объектно-ориентированного программирования.

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

      Первый объектно-ориентированный язык программирования Simula 67 был разработан в конце 60-х годов в Норвегии. Авторы этого языка очень точно угадали перспективы развития программирования: их язык намного опередил свое время.

      Однако современники (программисты 60-х годов) оказались не готовы воспринять ценности языка Simula 67, и он не выдержал конкуренции с другими языками программирования (прежде всего, с языком Fortran).

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

      Но достоинства языка Simula 67 были замечены некоторыми программистами, и в 70-е годы было разработано большое число экспериментальных объектно-ориентированных языков программирования: например, языки CLU, Alphard, Pascal и др. Эти языки так и остались экспериментальными, но в результате их исследования были разработаны современные объектно-ориентированные языки программирования: C++, Smalltalk, Eiffel и др.

      Наиболее распространенным объектно-ориентированным языком программирования безусловно является C++. Свободно распространяемые коммерческие системы программирования C++ существуют практически на любой платформе. Широко известна свободно распространяемая система программирования G++, которая дает возможность всем желающим разобрать достаточно хорошо и подробно прокомментированный исходный текст одного из образцовых компиляторов языка C++. Завершается работа по стандартизации языка C++: последний Draft стандарта C++ выпущен в июне 1995 г. (он доступен по Internet).

      Разработка новых объектно-ориентированных языков программирования продолжается. С 1995 года стал широко распространяться новый объектно-ориентированный язык программирования Java, ориентированный на сети компьютеров и, прежде всего, на Internet. Синтаксис этого языка напоминает синтаксис языка C++, однако эти языки имеют мало общего. Java интерпретируемый язык: для него определены внутреннее представление (bytecode) и интерпретатор этого представления, которые уже сейчас реализованы на большинстве платформ. Интерпретатор упрощает отладку программ, написанных на языке Java, обеспечивает их переносимость на новые платформы и адаптируемость к новым окружениям. Он позволяет исключить влияние программ, написанных на языке Java, на другие программы и файлы, имеющиеся на новой платформе, и тем самым обеспечить безопасность при выполнении этих программ. Эти свойства языка Java позволяют использовать его как основной язык программирования для программ, распространяемых по сетям (в частности, по сети Internet).

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

      Язык Smalltalk был разработан командой Xerox Palo Alto Research Center Learning Research Group как программная часть Dynabook – фантастического проекта Алана Кея. В основу были положены идеи Simula. Smalltalk является одновременно и языком программирования, и средой разработки программ. Это чисто объектно-ориентированный язык, в котором абсолютно все рассматривается как объекты; даже целые числа - это классы. Вслед за Simula, Smalltalk является важнейшим объектно-ориентированным языком, поскольку он не только оказал влияние на последующие поколения языков программирования, но и заложил основы современного графического интерфейса пользователя, на которых непосредственно базируются интерфейсы Macintosh, Windows и Motif.

      В основу языка положены две простые идеи:

      – все является объектами;

      В таблице 1 приведены характеристики языка Smalltalk с точки зрения семи основных элементов объектного подхода.

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

      Читайте также: