Файл: История и развитие методологии объектно-ориентированного программирования..pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 16.05.2023

Просмотров: 337

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Концепции, заложенные в языке Simula, получили свое развитие в серии языков Smalltalk-72,-74,-76,-80, а также в языках C++ и Objective C. Новый, отличный от процедурного, взгляд на программирование предложили Алан Кэй и Дэн Ингаллс в языке Smalltalk, в котором «класс» стал ключевой идее для остальных конструкций языка. Именно этот язык и считается первым широко известным объектно-ориентированным языком программирования.

При внесении объектно-ориентированного подхода в язык Pascal появился язык Object Pascal. В 90-х годах компания Sun представила миру язык Java, как воплощение идеи платформенной независимости и наиболее полную реализацию концепций объектно-ориентированного программирования, положенных в основу языков Simula 67, Smalltalk, C++ [16, с. 145].

В наше время количество прикладных языков программирования, реализующих парадигму ООП превышает количество языков, реализующих иные парадигмы. Наиболее популярные языки программирования (С++, Delphi, C#, Java и др.) воплощают объектную модель Симулы. Примерами языков, базирующихся на модели Smalltalk, являются Python и Ruby [22].

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

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

Программа, написанная на объектном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу) и имеет интерфейс в виде набора методов для взаимодействия друг с другом (посылки сообщений) [7, с. 63].

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


К сожалению, поскольку объектная модель является наследником нескольких концепций, ее терминология довольно запутанна. Например, для обозначения одного и того же понятия в языке Smalltalk используется термин метод (method), в языке C++ - виртуальная функция-член (virtual function-member), а в языке CLOS - обобщенная функция (generic function). Программисты, работающие на языке Object Pascal, C# и Java говорят о приведении типов (type coersion, or cast), а на языке Ada - о преобразовании типов (type conversion). Для того чтобы прояснить ситуацию, необходимо уточнить, что считается объектно-ориентированным, а что - нет [2, с. 85].

Страуструп (Stroustrup) полагает: «Если термин «объектно-ориентированный язык» вообще имеет смысл, то он должен относиться к языку, хорошо поддерживающему объектно-ориентированный стиль программирования… Поддержка такого стиля программирования считается хорошей, если средства языка обеспечивают удобное использование этого стиля. Язык не поддерживает объектно-ориентированное программирование, если написание программ в этом стиле требует особых усилий или опыта; в этом случае говорят, что язык просто позволяет программистам использовать объектно-ориентированный подход» [17]. С теоретической точки зрения существует возможность имитации объектно-ориентированного программирования с помощью обычных языков, таких как Pascal и даже COBOL или ассемблер, но это чрезвычайно трудно.

Карделли (Cardelli) и Вегнер (Wegner) утверждают:

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

  1. Он поддерживает объекты, представляющие собой абстракции данных с интерфейсом в виде именованных операций и сокрытым локальным состоянием.
  2. Объекты имеют ассоциированный с ними тип (класс).
  3. Типы (классы) могут наследовать атрибуты супертипов (суперклассов)» [2, с.87].

Поддержка наследования в объектно-ориентированных языках означает возможность выражения отношения «is a» среди типов (например, красная роза - это цветок, а цветок - это растение). Если язык не поддерживает механизм наследования, то его нельзя считать объектно-ориентированным. Карделли и Вегнер предлагают называть такие языки объектными (object-based), а не объектно-ориентированными (object-oriented). Согласно этому определению языки Smalltalk, Object Pascal, C++, Eiffel, CLOS, C# и Java являются объектно-ориентированными, а Ada83 - объектным (позднее в язык Ada95 были добавлены объектно-ориентированные языки). Однако, поскольку объекты и классы являются элементами обеих групп языков, очень желательно и вполне возможно использовать объектно-ориентированные методы, работая на языках программирования как первой, так и второй группы [15, с. 21].


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

Программа, написанная на объектно-ориентированном языке, представляет собой совокупность объектов, каждый из которых принадлежит к определенному абстрактному типу данных (классу), а классы образуют иерархию наследования [14, с. 66].

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

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

Буч дает следующее определение объектно-ориентированного проектирования:

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

Именно объектно-ориентированная декомпозиция отличает объектно-ориентированное проектирование от структурного; в первом случае логическая структура системы отражается абстракциями в виде классов и объектов, во втором — алгоритмами.

По аналогии с проектированием можно выделить отличительные особенности объектно-ориентированного анализа (ООА) по сравнению со структурным анализом, основанным на потоках данных в системе [11, с. 36].

Буч определяет ООА следующим образом:

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

Можно дать современные пояснения роли и сути ООА в процессе разработке программного обеспечения основываясь на методологии RUP (Rational Unified Process). Основными объектами, с которыми оперирует объектно-ориентированный анализ являются прецеденты взаимодействия (Use-Cases) и актеры (Actors). Причем, прецеденты взаимодействий рассматриваются в сфере отношений, схожих с отношениями возникающими между классами (расширения (extention), включения (inclusion), генерализации (generalization)).


Подводя итог рассмотрению истории развития языков и методологий программирования, следует упомянуть парадигмы различных методов построения программных систем, сформулированные Страуструпом [17].

  1. Процедурное программирование: Реши, какие требуются процедуры; используй наилучшие доступные алгоритмы.
  2. Модульное программирование: Реши, какие требуются модули; разбей программу так, чтобы скрыть данные в модулях.(Принцип сокрытия данных)
  3. Объектное программирование: Реши, какие требуются типы; обеспечь полный набор операция для каждого типа.
  4. Объектно-ориентированное программирование: Реши, какие требуются классы; обеспечь полный набор операций для каждого класса; явно вырази общность через наследование.
  5. Обобщенное программирование: Реши, какие требуются алгоритмы; параметризуй их так, чтобы они могли работать со множеством подходящих типов и структур данных.

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

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

3. ОСОБЕННОСТИ ПРИМЕНЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВАНИЯ

3.1. Преимущества применения объектно-ориентированного программирования

Объектно-ориентированное программирование предполагает эффективную реализацию проектов в первую очередь на традиционных объектно-ориентированных языках программирования «с классами» типа C++, Object Pascal, C#, VB .NET и др. [20, с. 114].

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

Это открывает, по крайней мере, следующие возможности: Вместо того чтобы применять или искать новые подходящие аналитические или синтетические методы структурирования программной системы, достаточно использовать непосредственное соответствие частей (модулей) системы объектам предметной области той задачи, для решения которой предназначена программная система [25].


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

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

На практике, как правило, применяют оба подхода:

  • для проектирования сложной системы в целом до уровня классов и их методов используют ООАП, а
  • для реализации отдельных методов или решения несложной (разовой) задачи используют процедурно-ориентированное проектирование [3, с. 35].

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

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

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

2) это эволюционный шаг, естественным образом вытекающий из предшествующей истории развития средств абстракции данных [1, с. 4].

Можно выделить три основных причины популярности ООП:

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

2) желание перейти от существующих языков к новой технологии;

3) сходство с методами проектирования, применяющимися в других инженерных областях (сборка изделия из готовых блоков) [1, с. 5].

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