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

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

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

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

Добавлен: 29.03.2023

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

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

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

Ведение

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

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

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

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

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

  1. Развитие вычислительной техники, в частности аппаратная поддержка основных концепций операционных систем и построение функционально-ориентированных систем. При проектировании вычислительных машин использование понятия объекта началось с исследований по не-фонНеймановской архитектуре. Попытки сократить семантический разрыв между низкоуровневой архитектурой традиционных процессоров и высокоуровневыми понятиями ОС предпринимались при построении таких систем, как Барроус, Intel i432, IBM/38 и др. Тесно связанные с ними разработки объектно-ориентированных операционных систем начались, пожалуй, с проекта THE под руководством Дейкстры, были продолжены в системах Hydra для ЭВМ CMU C.mmp, Medusa (Cm*), iMAX для Intel i432 и др. Сравнительно недавние проекты Cairo Microsoft и Taligent Pink (хотя и остановившиеся на исследовательском этапе) – это также проекты объектно-ориентированных операционных систем. 
  2. Достижения в методологии программирования, в частности модульное построение систем и инкапсуляция информации.
  3. Теория построения и моделирования СУБД внесла в объектное программирование идеи построения отношений между объектами. Моделирование данных с помощью отношений между объектами было впервые предложено Ченом в методе ER-моделирования. В этом методе модель данных строится в виде объектов (сущностей), их атрибутов и отношений между ними.
  4. Исследования в области искусственного интеллекта позволили лучше осознать механизмы абстракции. Теория фреймов, предложенная Минским для представления реальных объектов в системах распознавания образов, дала мощный импульс не только системам искусственного интеллекта, но и механизмам абстракции в языках программирования.
  5. Развитие философии и теории познания. Во многом объектно-ориентированное построение систем – это определенный взгляд на моделируемый реальный мир. Именно в этом аспекте философия и теория познания оказали сильное влияние на объектную модель. Еще древние греки рассматривали мир в виде объектов или процессов. Декарт выдвинул предположение, что для человека естественным представляется объектно-ориентированное рассмотрение окружающего мира. Минский предположил, что разум проявляется как взаимодействие агентов, не умеющих по отдельности мыслить.

Теория архитектуры и строительства, выдвинувшая концепцию образцов или шаблонов, активно используется в последние годы в области объектно-ориентированного анализа и проектирования. [6, с17-18]

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

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

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

Исходя из этих проблем, лучшими программистами 70-х годов (Дейкстра, Вирт, Дал, Хоар, Йордан, Константин, Майерс и другие) были разработаны строгие правила ведения проектов, которые получили название структурной методологии.

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


Основные принципы структурной методологии

  • Принцип абстракции. Абстракция позволяет разработчику вообразить требуемое решение проблемы без сиюминутного учета множества деталей. Используя принцип абстракции, разработчик может рассматривать программу по уровням. Верхний уровень показывает нам большую абстракцию, упрощает взгляд на проект, в то время как нижний уровень показывает мелкие детали. На принципе абстракции основываются многие структурные методы, например, восходящая и нисходящая стратегии программирования.
  • Принцип формальности. Слово «формальность» предполагает строгий методический подход.
  • Принцип «разделяй и властвуй». Этот принцип известен со времен Юлия Цезаря и является методом решения трудных проблем путем разделения проблемы на множество мелких независимых, которые легче понимать и решать.
  • Принцип иерархического упорядочения. Этот принцип тесно связан с принципом «разделяй и властвуй». Структура разбиения на части не менее важна, чем сам факт самого разбиения. Принцип иерархической упорядоченности с успехом используется во всех областях человеческой деятельности и помогает решать сложные проблемы в системах, включающих множество частей. В применении к программированию этот принцип выдвигает требование иерархического структурирования связей между модулями программного комплекса, что облегчает достижение рассмотренных выше целей структурного программирования.

Языки программирования, которые поддерживают эту модель, называются структурно-ориенированными или процедурными. Глав­ное внимание в них уделяется построению процедур (подпрог­рамм) и, как следствие, решению следующих вопросов: пере­дача аргументов в процедуры; получение вычисленных зна­чений из процедур; внутренняя организация процедур и т. п. Типичным примером процедурно-ориентированного языка является Фортран – первый и все еще один из наиболее популярных языков программирования. Далее поя­вилось целое поколение языков указанного типа: Алгол-60, Алгол-68, Паскаль, Си и другие. Последовательное использование идеи процедурного структурирования программ привело к созданию обширных библиотек программирования, содержащих множество сравнительно небольших процедур, из которых, как из кирпичиков, можно строить «здание» программы.


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

Следующим этапом можно считать появление модульного программирования.

В модульном программирования основные акценты переносятся на построение модулей. При этом необходимо определить модули, которые будут использоваться, и разделить программу на модули так, чтобы ее данные были скрыты в этих модулях.  В действительности указанная модель перено­сит основные акценты на организацию данных (а не на алгоритм, по которому обрабатываются эти данные). Модулем (в модульном программировании) называется множество взаимосвязанных процедур (подпрограмм) вместе с данными, которые эти процедуры обрабатывают. Основной целью данного направления является скрытие данных в модулях. Зачем это делается? Предположим, надо разработать очень большую программу. Такой разработкой будет заниматься коллектив программистов, в котором каждый программист отвечает за определенную часть общей программы. Если коллектив использует процедурное направление в программировании, то надо решить некоторые проблемы, например:

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

- договориться об организации общих данных и способах доступа к этим данным и т. п.

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

Непосредственная поддержка модульного программирования воплощена в языке Модула-2.

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


Развитие объектно-ориентированного программирования началось в 60-х годах. Simula-67 был первым языком объектно-ориентированного программирования, созданный в компьютерном центре Норвегии и являлся модернизированной версией Simula I. Язык предназначался для моделирования ситуаций реального мира. Simula-67 включала в себя понятие классов и объектов, а также подклассов, виртуальных методов, сопрограмм и дискретно-событийное моделирование как часть собственной парадигмы программирования. Концепции, заложенные в языке Simula получили свое развитие в серии языков Smalltalk-72,-74,-76,-80, а также в языках C++ и Objective C.

Язык Smalltalk, который был изобретен в компании Xerox PARC Аланом Кэем (Alan Kay) и некоторыми другими учеными, фактически навязывал использование «объектов» и «сообщений» как базиса для вычислений. Создатели Smalltalk заимствовали некоторые идеи из Simula, но Smalltalk разрабатывался как полностью динамическая система, в которой классы могут создаваться и изменяться динамически, а не только статически как в Simula. Smalltalk и ООП с его помощью были представлены широкой аудитории в журнале Byte magazine в августе 1981.

В 1970-х Smalltalk Кэя сподвиг сообщество Lisp внедрить в язык объектно-ориентированные техники, которые были представлены разработчикам с помощью Lisp машины. Эксперименты с различными расширениями Lisp в конечном итоге привели к созданию Common Lisp Object System (CLOS, части первого стандартизованного объектно-ориентированного языка, ANSI Common Lisp), который органично включал в себя как функциональное, так и объектно-ориентированное программирование и позволял расширять себя с помощью протокола Meta-object protocol. В 1980 было несколько попыток дизайна архитектур процессоров, которые включали бы в себя аппаратную поддержку работы с объектами в памяти, но все они были безуспешны. В качестве примеров можно привести Intel iAPX 432 и Linn Smart Rekursiv.

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

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

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