Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

История и развитие методологии объектно-ориентированного программирования. Сферы применения

Содержание:

Введение

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

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

1. История развития технологии программирования

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

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

Технология программирования занята уточнением и детализацией требований к ПО; их проектированием, в том числе разделением программы на две части; собственно программированием, в том числе написанием текстов программ на языках программирования; отладкой и тестированием.

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

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

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

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

Таким образом, ранние языки программирования существенно зависели от того, что принято называть «средой вычислений», и приблизительно соответствовали современным машинным кодам или языкам ассемблера.

1.2 Организация самых первых программ

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

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

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

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

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

1.3 Структурное программирование

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

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

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

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

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

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

ALGOL был популярен не только в странах Европы (именно там его и создали), но и в СССР. Он внес большое влияние на все последующие языки, в том числе – на язык программирования Pascal.

Тем не менее, наибольшую популярность завоевал язык Pascal, созданный в 1970 г. Швейцарским ученым Н.Виртом. Pascal получил широчайшее распространение и может считаться образцовым языком программирования, наиболее популярным и сейчас (например, в версии Delphi фирмы Imprise).

1.4 Модульное программирование

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

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

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

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

2. Методология объектно-ориентированного программирования

Объектно-ориентированное программирование (ООП), разработанное в середине 1970-х гг. Б. Керниганом и Д. Риччи и реализованное в объектно-ориентированных версиях языков C и Pascal, представляет собой отображение объектов реального мира, их свойств (атрибутов) и связей между ними при помощи специальных структурных данных. Если структурное программирование подразумевает наличие ряда встроенных структур данных (целых, вещественных и строковых переменных, массивов, записей), при помощи которых производится отображение свойств объектов реального мира, то при объектно-ориентированном подходе для объекта создается своя структура данных (класс), содержащая как свойства объекта (поля), так и процедуры для управления объектом (методы). Примеры объектно-ориентированных языков: Object Pascal, C++, Java.

Методология ООП существенно отличается от всех других тем, что в ней используется новая модель-модель «активных» данных.

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

При этом методология ООП не отличается от двух предыдущих методов к созданию программ, а основывается на них:

А) программа состоит из модулей, которые содержат описания классов и объектов («активных» данных);

Б) методы (алгоритмы) «активных» данных строятся на основе структурного подхода.

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

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

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

2.1 Класс

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

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

написание, отладку и последующую модификацию программы. Чем выше

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

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

выделять главное и отбрасывать несущественное. Этот процесс называется

повышением степени абстракции программы.

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

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

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

Следующий шаг – описание собственных типов данных, позволяющих

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

Для работы с собственными типами данных требуются специальные

функции. Естественно сгруппировать их с описанием этих типов данных в

одном месте программы, а также по возможности отделить от ее остальных

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

интерфейсов. Объединение в модули описаний типов данных и функций,

предназначенных для работы с ними, со скрытием от пользователя модуля

несущественных деталей является дальнейшим развитием структуризации

программы.

Все три описанных выше метода повышения абстракции преследуют

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

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

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

для пользователя класса не существенны.

Идея классов отражает строение объектов реального мира – ведь каждый

предмет или процесс обладает набором характеристик или отличительных

черт, иными словами, свойствами и поведением. Программы в основном

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

инструмент для представления моделей.

Класс является типом данных, определяемым пользователем. В классе

задаются свойства и поведение какого-либо предмета или процесса в виде

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

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

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

скрыты от пользователей класса за интерфейсом. Интерфейсом класса являются заголовки его открытых методов. Таким образом, класс как модель

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

Идея классов является основой объектно-ориентированного программирования (ООП). Основные принципы ООП были разработаны еще в языках

Simula-67 и Smalltalk, но в то время не получили широкого применения из-за трудностей освоения и низкой эффективности реализации. В С++ эти концепции реализованы эффективно и непротиворечиво, что и явилось основой

успешного распространения этого языка и внедрения подобных средств в

другие языки программирования.

Идеи ООП не очень просты для практического использования (их неграмотное применение приносит гораздо больше вреда, чем пользы), а освоение существующих стандартных библиотек требует времени и высокого

уровня первоначальной подготовки.

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

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

модель», когда данные активны и управляют вызовом того или иного фрагмента программного кода.

Примером реализации событийно-управляемой модели может служить

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

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

программа после старта предлагает пользователю выполнить некоторые

действия (ввести данные, выбрать режим) в соответствии с жестко заданным алгоритмом.

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

вычитать, вычислять квадратный корень и т. д. В С++ множество значений

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

Данные класса называются полями (по аналогии с полями структуры), а

функции класса – методами. Поля и методы называются элементами класса.

2.2 Объект

Понятию «объект» сопоставляют ряд дополняющих друг друга определений. Ниже приведены некоторые из них.

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

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

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

Можно выделить пять типов операций:

- конструктор, создание и инициализация объекта;

- деструктор, разрушающий объект;

- модификатор, изменяющий состояние объекта;

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

- итератор для доступа к содержанию объекта по частям в определенной последовательности.

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

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

Объекты могут находиться в определенных отношениях друг к другу. Эти отношения могут быть иерархическими. Основные иерархические отношения — это отношения использования и включения. Отношение использования реализуется посылкой сообщений от объекта A к объекту B. При этом объект A может выступать в роли:

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

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

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

Отношение включения имеет место, когда составной объект содержит другие объекты.

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

Инкапсуляция — это механизм, который объединяет данные и код, манипулирующий этими данными, а также защищает и то, и другое от внешнего вмешательства или неправильного использования. В объектно-ориентированном программировании код и данные могут быть объединены вместе; в этом случае говорят, что создаётся так называемый "чёрный ящик". Когда коды и данные объединяются таким способом, создаётся объект. Другими словами, объект — это то, что поддерживает инкапсуляцию.

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

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

3. Наследование как важнейшее свойство объекта

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

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

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

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

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

3.1 Экземпляры объектных типов

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

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

Поля объектов

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

3.2 Методы

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

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

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

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

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

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

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

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

Итак, подведем некоторый итог. Что такое объект?

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

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

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

3.4 Полиморфизм

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

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

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

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

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

Объявление классов с полями (данными - членами класса) и методами (функциями - членами класса).

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

Средства защиты внутренней структуры классов от несанкционированного использования извне. Обычно это модификаторы доступа к полям и методам, типа public, private, обычно также protected, иногда некоторые другие.

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

Полиморфное поведение экземпляров классов за счёт использования виртуальных методов. В некоторых ООП-языках все методы классов являются виртуальными.

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

- Конструкторы, деструкторы, финализаторы.

- Свойства (аксессоры).

- Индексаторы.

- Интерфейсы (например, в Java используются также как альтернатива множественному наследованию - любой класс может реализовать сколько угодно интерфейсов).

- Переопределение операторов для классов.

Часть языков (иногда называемых «чисто объектными») целиком построена вокруг объектных средств - в них любые данные (возможно, за небольшим числом исключений в виде встроенных скалярных типов данных) являются объектами, любой код - методом какого-либо класса, и невозможно написать программу, в которой не использовались бы объекты. Примеры подобных языков - C#, Smalltalk, Java, Ruby. Другие языки (иногда используется термин «гибридные») включают ООП-подсистему в исходно процедурный язык. В них существует возможность программировать, не обращаясь к объектным средствам. Классические примеры - C++ и Delphi.

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

Обычно сравнивают объектное и процедурное программирование:

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

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

4. Критические высказывания в адрес ООП

1. Исследование Thomas E. Potok, Mladen Vouk и Andy Rindos показало отсутствие значимой разницы в продуктивности разработки программного обеспечения между ООП и процедурным подходом.

2. Кристофер Дэйт указывает на невозможность сравнения ООП и других технологий во многом из-за отсутствия строгого и общепризнанного определения ООП.

3. Александр Степанов, в одном из своих интервью, указывал на то, что ООП «методологически неправильно» и что «… ООП практически такая же мистификация как и искусственный интеллект…».

4. Фредерик Брукс (Frederick P. Brooks, Jr.) в своей статье «No Silver Bullet. Essence and Accidents of Software Engineering» (Computer Magazine; April 1987) указывает на то, что наиболее сложной частью создания программного обеспечения является « … спецификация, дизайн и тестирование концептуальных конструкций, а отнюдь не работа по выражению этих концептуальных конструкций…». ООП (наряду с такими технологиями как искусственный интеллект, верификация программ, автоматическое программирование, графическое программирование, экспертные системы и др.), по его мнению, не является «серебряной пулей», которая могла бы на порядок величины (то есть примерно в 10 раз, как говорится в статье) снизить сложность разработки программных систем. Согласно Бруксу, «…ООП позволяет сократить только привнесённую сложность в выражение дизайна. Дизайн остаётся сложным по своей природе…».

5. Эдсгер Дейкстра указывал: «… то о чём общество в большинстве случаев просит - это змеиное масло. Естественно, «змеиное масло» имеет очень впечатляющие имена, иначе будет очень трудно что-то продать: «Структурный анализ и Дизайн», «Программная инженерия», «Модели зрелости», «Управляющие информационные системы» (Management Information Systems), «Интегрированные среды поддержки проектов», «Объектная ориентированность», «Реинжиниринг бизнес-процессов»…».

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

7. Патрик Киллелиа в своей книге «Тюнинг веб-сервера» писал: «… ООП предоставляет вам множество способов замедлить работу ваших программ …»

8. Известная обзорная статья проблем современного ООП-программирования перечисляет некоторые типичные проблемы ООП - Почему объектно-ориентированное программирование провалилось.

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

Областями применения ООП в программной инженерии являются создание различных приложений как WEB, так и для работы в различных операционных системах (семейств Windows, Linux и др.) :

1. Приложений для работы с различными системами управления базами данных. Например СУБД Microsoft Access использует встроенный объектно-ориентированный язык программирования Visual Basic for Applications, родоначальником которого является структурный язык Basic.


2. Создание развлекательных приложений игрового характера с элементами 3D графики. Примером может служить язык OpenGL который включает 250 функций для рисования сложных трёхмерных сцен из простых примитивов и используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct 3D.


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

Заключение

При выполнении курсовой работы были решены следующие задачи:

1. Рассмотрена история развития объектно-ориентированного программирования;

2. Изучены теоретические основы объектно-ориентированного программирования;

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

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

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

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

Список используемой литературы

  1. Бертран Мейер Объектно-ориентированное конструирование программных систем + CD . Интернет-университет информационных технологий - ИНТУИТ.ру, «Русская Редакция», 2005. – 1232 с
  2. Иан Грэхем Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. — 3-е изд. — М.: «Вильямс», 2004. — С. 880.
  3. Объектно-ориентированное программирование: Учеб. пособие. / Бутырин О. В. Иркутск: ФГБОУ ВО ИрГУПС, 2005. – 98 с
  4. Объектно-ориентированное программирование /Г.И. Радченко, Е.А. Захаров. - Челябинск: Издательский центр ЮУрГУ, 2013. - 167 с.
  5. Основы алгоритмизации и программирования: Учеб. пособие. / Г. Р. Кадырова. – Ульяновск : УлГТУ, 2014. – 95 с
  6. Фридман А.Л. Основы объектно-ориентированной разработки программных систем. — М.: ФиС, 2000.