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

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

Содержание:

Ведение

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

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

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

Глава 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 «Определения и основные понятия объектно-ориентированное программирование»

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

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

· абстрагирование (отбрасывание несущественных деталей);

· обобщение (выделение общих существенных признаков у разных явлений или предметов);

· классификация (осознание связи между явлениями и степени их схожести).

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

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

Классы — это объектные типы данных. Подобно тому, как целые числа принадлежат какому-нибудь целочисленному типу (например, integer или byte), объекты также принадлежат какому-либо объектному типу — классу. Все объекты одного класса имеют одинаковый набор полей и одинаковый набор методов.

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

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

Объекты же этих классов, напротив, динамичны. Набор маршрутов полетов сменяется не очень часто. Существенно быстрее изменяется множество самолетов, находящихся в полете. Частота, с которой самолеты занимают и покидают воздушные коридоры, еще выше. [2, с 111-112]

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

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

С позиций “борьбы со сложностью” инкапсуляция позволяет переложить часть контроля за правильностью работы с объектами на компилятор (компьютер).

Различные объектно-ориентированные языки предлагают разные возможности по инкапсуляции полей и методов (от полного отсутствия и до автоматического сокрытия всех полей). В промышленных объектно-ориентированных языках, таких, как C++, Java, Delphi, Eiffel и т.д., предусмотрены три уровня инкапсуляции полей и методов:

· public — на обращение к публичным полям и методам объектов нет никаких ограничений;

· protected — прямое обращение к защищенным полям и методам возможно только из методов данного класса и методов дочерних классов;

· private — прямое обращение к приватным полям и методам возможно исключительно из методов данного класса.

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

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

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

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

Совокупность всех классов-предков и классов-потомков называется иерархией классов.

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

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

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

В объектно-ориентированном программирование есть два вида полиморфных методов — перегруженные и виртуальные.

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

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

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

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

· В классе-предке иерархии объявляется полиморфный метод, который описывает некое полезное действие. При этом либо он использует виртуальный метод, либо сам является виртуальным.

· В классах-потомках соответствующий виртуальный метод переопределяется — для каждого класса-потомка это полезное действие выполняется по-своему.

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

Яркий пример подобного использования виртуальных методов — система графического оконного интерфейса Delphi или Visual Basic: каждый видимый элемент графического интерфейса — кнопка, ползунок, окно и т.п. — должен быть потомком класса TControl. В классе TControl вводятся общие полиморфные методы отрисовки элементов графического интерфейса, а любой его потомок может нарисовать себя на экране своим собственным способом. [4 ]

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

 В данном определении можно выделить три части:

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

Программа будет объектно-ориентированной только при соблюдении всех трех указанных требований. В частности, программирование, не основанное на иерархических отношениях, не относиться к объектно-ориентированному программированию, а называется программированием на основе абстрактных типов данных. [2, с. 39]

По мнению Алана Кэя, создателя языка Smalltalk, объектно-ориентированный подход заключается в следующем наборе основных принципов:

1. Всё является объектом.

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

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

4. Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).

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

6. Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве. [1 с. 20-21].

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

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

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

– возможность создания и использования библиотек классов (библиотека компонент DELPHI);

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

 Вместе с тем следует отметить, что все эти преимущества и эффективность ООП проявляются в полной мере только при разработке больших программ или классов программ. [6 , с 21]

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

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

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

Как правило, объектно-ориентированный язык (ООЯ) содержит следующий набор элементов:

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

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

  • Конструкторы, деструкторы, финализаторы;
  • Свойства (аксессоры);
  • Индексаторы;
  • Средства управления видимостью компонентов классов (интерфейсы или модификаторы доступа, такие как public, private, protected, feature и др.).

Одни языки отвечают принципам объектно-ориентированного программирования в полной мере — в них все основные элементы являются объектами, имеющими состояние и связанные методы. Примеры подобных языков — Smalltalk, Eiffel. Существуют гибридные языки, совмещающие объектную подсистему в целостном виде с подсистемами других парадигм как «два и более языка в одном», позволяющие совмещать в одной программе объектные модели с иными, и размывающие грань между объектно-ориентированной и другими парадигмами за счёт нестандартных возможностей, балансирующих между объектно-ориентированным программированием и другими парадигмами (таких как множественная диспетчеризация, параметрические классы, возможность манипулировать методами классов как самостоятельными объектами, и др.). Примеры таких языков: CLOS, Dylan, OCaml, Python, Ruby, Objective-C. Однако, наиболее распространены языки, включающие средства эмуляции объектной модели поверх более традиционной императивной семантики. Алан Кэй назвал такие языки «склеиванием возможностей» (англ. agglutination of features) в противовес «чистоте стиля» (англ. crystalization of style) языков, воплощающих некую парадигму непосредственно. Примеры таких языков —Simula, C++, Visual Basic, Delphi, Modula, Modula-2, Java, C#, PHP.

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

Smalltalk

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

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

Smalltalk-72, -74. -76, -78, -80. Реализации 1972 и 1974 годов заложили основу языка, в частности идею передачи сообщений и полиморфизм, хотя механизм наследования еще не появился. В последующих версиях полноправное гражданство получили классы; этим достигла завершения точка зрения, что все состоит из объектов. Smalltalk-80 был перенесен на многие компьютерные платформы.

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

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

- объекты взаимодействуют, обмениваясь сообщениями.

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

Таблица 1.

Абстракции

Переменные экземпляра

Методы экземпляра

Переменные класса

Методы класса

Да

Да

Да

Да

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

Переменных

Методов

Закрытые

Открытые

Модульность

Разновидности модулей

Нет

Иерархии

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

Шаблоны

Метаклассы

Одиночное

Нет

Да

Типизация

Сильная типизация

Полиморфизм

Нет

Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

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

C++

Язык программирования C++ был разработан Бьерном Страустрапом, сотрудником AT&T Bell Laboratories. Непосредственным предшественником C++ является С with Classes, созданный тем же автором в 1980 году. Язык С with Classes, в свою очередь, был создан под сильным влиянием С и Simula. C++ — это в значительной степени надстройка над С. В определенном смысле можно назвать C++ улучшенным С, тем С, который обеспечивает контроль типов, перегрузку функций и ряд других удобств. Но главное в том, что C++ добавляет к С объектную ориентированность.

Известны несколько версий C++. В версии 1.0 реализованы основные механизмы объектно-ориентированного программирования, такие как одиночное наследование и полиморфизм, проверка типов и перегрузка функций. В созданной в 1989 году версии 2.0 нашли отражение многие дополнительные свойства, возникшие на базе широкого опыта применения языка многочисленным сообществом пользователей. В версии 3.0 (1990) появились шаблоны и обработка исключений. C++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов.

Характеристики C++ приведены в табл. 2.

Таблица 2

Абстракции

Переменные экземпляра

Методы экземпляра

Переменные класса

Методы класса

Да

Да

Да

Да

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

Переменных

Методов

Открытые, защищенные, закрытые

Открытые, защищенные, закрытые

Модульность

Разновидности модулей

Файл

Иерархии

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

Шаблоны

Метаклассы

Множественное

Да

Нет

Типизация

Сильная типизация

Полиморфизм

Да

Да (одиночный)

Параллельность

Многозадачность

Непрямая (посредством классов)

Сохраняемость

Долгоживущие объекты

Нет

C#

C# (произносится «си шарп») — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

Переняв многое от своих предшественников — языков C++, Pascal, Модула, Smalltalk и в особенности Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественное наследование интерфейсов).

C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.

Java

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

Object Pascal

Object Pascal создавался сотрудниками компании Apple Computer (некоторые из которых были участниками проекта Smalltalk) совместно с Никлаусом Виртом (Niklaus Wirth), создателем языка Pascal. Object Pascal известен с 1986 года и является первым объектно-ориентированным языком программирования, который был включен в Macintosh Programmer's Workshop (MPW), среду разработки для компьютеров Macintosh фирмы Apple. В ранних версиях этого языка не было методов класса, переменных класса, множественного наследования и метаклассов. Эти механизмы исключены специально, чтобы сделать язык простым для изучения начинающими "объектными" программистами. В табл. 2 приведены общие характеристики Object Pascal.

Таблица 3

Абстракции

Переменные экземпляра

Методы экземпляра

Переменные класса

Методы класса

Да

Да

Нет

Нет

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

Переменных

Методов

Открытые

Открытые

Модульность

Разновидности модулей

Модуль (unit)

Иерархии

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

Шаблоны

Метаклассы

Одиночное

Нет

Нет

Типизация

Сильная типизация

Полиморфизм

Да

Да (одиночный)

Параллельность

Многозадачность

Нет

Сохраняемость

Долгоживущие объекты

Нет

В последние годы этот язык стал очень популярен благодаря системе Delphi фирмы Borland.

Система визуального ООП Delphi

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

Система Delphi позволяет решать множество задач, в частности:

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

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

- Создавать мощные системы работы с локальными и удаленными базами данных

- Создавать справочные системы (файлы .hlp) для своих приложений и мн. др.

Delphi – чрезвычайно быстро развивающаяся система. Первая версия – Delphi 1.0 была выпущена в феврале 1995 г. А затем новые версии выпускались ежегодно. Каждая последующая версия Delphi дополняла предыдущую. Большинство версий Delphi выпускается в нескольких вариантах: Standart – стандартном, Professional – профессиональном, Client/Server – клиент/сервер, Enterprise – разработка баз данных предметных областей. Различаются варианты в основном разным уровнем доступа к системам управления базами данных. Последние варианты - Client/Server и Enterprise, в этом отношении наиболее мощные.

Delphi - это комбинация нескольких важнейших технологий:

- Высокопроизводительный компилятор в машинный код

- Объектно-ориентированная модель компонент

- Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов

Заключение

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

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

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

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

Библиография

    1. Бадд Т. Объектно-ориентированное проектирование в действии /Питер, 1997
    2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер. с англ. — СПб.; М.: «Невский Диалект» — «Издательство БИНОМ», 1999 г.
    3. Мухортов В. В., Рылов В.Ю. Объектно-ориентированное программирование, анализ и дизайн. Методическое пособие. Новосибирск, 2002.
    4. Новиков А.М. Объектно-ориентированное программирование // https://xn----7sbbfb7a7aej.xn--p1ai/informatika_kabinet/programm/programm_09.html
    5. Пышкин Е.В. Основные концепции и механизмы объектно-ориентированного программирования. - СПб.: БХВ-Петербург, 2005г.
    6. Сорокин А.А. Объектно-ориентированное программирование: учебное пособие (курс лекций)- Саврополь: Издательство СКФУ, 2014.