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

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

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

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

Добавлен: 14.03.2024

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

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

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

Первые программисты писали программы посредством использования машинных кодов.[17] В связи со сложностью подобного подхода возникла необходимость создать программу, которая преобразовывала бы написанный человеком и понятный ему текст в машинные коды. Такая программа получила название «компилятор», а используемый для написания исходного текста программы язык — «языком программирования». Первым компилятором был «Assembler». Впоследствии было создано множество различных языков программирования, например: C, ADA, FoxPro, Fortran, Basic, Pascal и другие. Следующей же ступенью развития стало объектно-ориентированное программирование. Появились соответствующие данной парадигме языки, например: C++, Object Pascal. Наблюдалась борьба между скоростью разработки программного обеспечения и скоростью выполнения программного кода.

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

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

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

Язык «Симула» предлагал революционные идеи, такие как: объекты, классы, виртуальные методы, но которые не были тогда восприняты таковыми. Новый, отличный от процедурного, взгляд на программирование предложили Алан Кэй и Дэн Ингаллс в языке Smalltalk, в котором «класс» стал ключевой идее для остальных конструкций языка. Именно этот язык и считается первым широко известным объектно-ориентированным языком программирования.


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

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

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

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

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

Парадигма объектно-ориентированного программирования [1] предполагает, что любая программная система проектируется как совокупность объектов. При этом объекты должны быть организованы таким образом, чтобы программист мог легко изменять их по мере того, как изменяются требования к программе. Как правило, использование изолированных объектов не позволяет достичь поставленной цели. Интерес представляет взаимодействие объектов, т.е. обмен информацией между объектами. Обычно говорят, что один объект взаимодействует с другим посредством сообщений, т.е. в процессе взаимодействия объекты обмениваются сообщениями. Сообщение – это вызов метода. Совместное использование методов различных объектов – показатель взаимодействия объектов. Таким образом, методы одного объекта должны вызывать методы других объектов. В этом случае ни один метод, участвующий во взаимодействии, не может достигнуть цели самостоятельно. Именно поэтому так важно правильно организовать обмен информацией между методами различных объектов. Такой обмен предполагает, что результаты работы метода одного объекта являются исходными данными для метода другого объекта. Если объект Object2 посылает сообщение объекту Object1, то это означает, что объект Object2 вызывает метод объекта Object1.


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

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

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

Рассмотрим основные понятия ООП.

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

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

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


Класс это «Совокупность свойств, методов и событий». При этом «совокупность» означает, что функционирование класса обеспечивается в совокупности методами, свойствами и событиями.[21]

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

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

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

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

Наследование (или наследственность) — определение объекта и его дальнейшее использование для построения иерархии порожденных объектов с возможностью для каждого порожденного объекта, относящегося к иерархии, доступа к коду и данным всех порождающих объектов.[22] Существует и иное определение данного термина: «Наследование — механизм получения нового класса из существующего путем его дополнения или изменения».[23]

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

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

Наследственность в ООП — это его основа.[25] Следует понимать, что потомок — класс, от которого происходят другие классы, наследует свойства предка — класса, который происходит либо порожден из другого класса. Следовательно, потомок всегда «знает», какими он обладает свойствами, а предок не может «знать» свойства своего потомка, поскольку не может «знать» те свойства, которые будут добавлены в новый класс. Данный метод наследования и принят в объектно-ориентированных языках.


Именно наследование дает возможность повторно использовать уже существующий код.[26] С целью применения существующего кода, программист создает новый класс на базе уже существующих классов. В итоге, наследование выполняет две функции: предотвращение дублирования кода, развитие работы в нужном направлении. Отношения между родительскими классами и его потомками именуется термином «Иерархия наследования».

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

Под полиморфизмом подразумевается свойство родственных объектов решать схожие по смыслу проблемы разными способами.[27] Например, действие «бежать» свойственно большинству животных. Но каждое из них действует различным образом.

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

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

Касательно средств, которые связаны с возможностью реализации полиморфизма, то следует упомянуть следующие виды методов в ООП:

  1. Статические методы класса включаются в код программы в процессе ее компиляции. Таким образом, до запуска программы уже известно, какая процедура будет вызвана в определенной точке.
  2. Виртуальные методы, которые подключаются к основному коду на этапе выполнения программы и дают возможность определить тип и конкретизировать экземпляр объекта в процессе исполнения, а затем вызвать методы этого объекта. Данный механизм обеспечивает полиморфизм и именуется также поздним связыванием.[30]

Фленов М. Е. объясняет возможность полиморфизма на примере гаража, потомком которого выступает дом: «Представим, что у гаража дверь открывается вверх, а у дома должна открываться в сторону. Дом происходит от гаража, поэтому у него дверь будет открываться тоже вверх. Как тогда быть? Вы просто должны изменить (переписать) у дома процедуру, отвечающую за открытие двери. Тогда дом получит все свойства гаража, но при открывании двери подставит свою процедуру».[31] Иначе говоря, полиморфизм — различная реакция объектов разных иерархий на одно и то же событие.