Файл: История и развитие методологии объектно-ориентированного программирования. Сферы применения (Исторические аспекты развития языков программирования).pdf
Добавлен: 29.02.2024
Просмотров: 83
Скачиваний: 0
СОДЕРЖАНИЕ
1. Исторические аспекты развития языков программирования
1.1. История развития представлений о программировании и формирования объектной модели
1.2. Краткая история методологий программирования
Методология машинного кодирования
Методология процедурного программирования
Методология логического программирования
Методология функционального программирования
Методология структурного программирования
Методология объектно-ориентированного программирования
2. Развитие объектно-ориентированной методологии программирования
2.1. Концептуальная база объектно-ориентированной методологии
2.2. Понятие объектно-ориентированного программирования
2.3. Виды объектно-ориентированных языков программирования
Достоинства методологии объектно-ориентированного программирования
Недостатки методологии объектно-ориентированного программирования
Без выполнения любого из четырех обозначенных основных принципов модель нельзя считать объектно-ориентированной. С момента возникновения объектно-ориентированной методологии ее концептуальная база постоянно развивалась и эволюционировала вместе с новыми объектно-ориентированными языками.
Каждый более поздний принцип дополняет и расширяет функциональные возможности языка в рамках реализации объектно-ориентированного программирования. Рассмотрим дополнительные принципы методологии объектно-ориентированного программирования:
- Модульность является свойством системы, разложенной на модули, внутренне связанные между собой. Правильный выбор модулей в процессе решения определенной задачи – это сложная подзадача, сопоставимая с выбором правильного набора абстракций. Разработан ряд эмпирических приемов и правил, которые позволяют обеспечить разумную модульность. Бриттон и Парнас считают, что конечная цель декомпозиции программы на модули – это снижение затрат на программирование за счет независимого проектирования и тестирования. В конечном итоге структура каждого модуля должна быть достаточно проста для понимания, предполагать независимую реализацию других модулей и не влиять на их поведение, позволять производить достаточно легкое изменение проектных решений. [9, 13]
- Типизация определяет правила использования объектов, которые не допускают и не ограничивают взаимную замену объектов разных классов. Типизация заставляет проектировщиков выражать свои абстракции таким образом, чтобы используемый для реализации программной системы язык поддерживал принятые проектные решения.
- Параллелизм заключается в предоставлении возможности различным объектам одновременного действия.
- Устойчивость предполагает способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. [9, 13]
Обозначенные дополнительные принципы объектно-ориентированного подхода важны в объектной модели, но не являются обязательными.
Алан Кей [1], создатель объектно-ориентированного языка Smalltalk, выделяет следующие ключевые положения объектно-ориентированной парадигмы:
- все является объектом;
- вычисления реализуются через обмен данными между объектами, при котором один объект требует выполнение некоторого действия от другого объекта. Взаимодействие объектов осуществляется по средствам обмена сообщениями, которые представляют собой запрос на выполнение некоторого действия, дополненного набором необходимых аргументов;
- каждый из объектов обладает независимой памятью, состоящей из других объектов;
- каждый объект является экземпляром (представителем) класса, выражающим общие свойства объектов;
- функциональность (поведение) объекта задается в классе, поэтому все объекты, являющиеся экземплярами одного класса, могут выполнять один и тот же набор действий;
- все классы организованы в единую иерархию наследования, поэтому память и поведение, определяемое экземплярами определённого класса, автоматически доступны любому классу, который расположен ниже в иерархии. [1]
В целом, согласно объектно-ориентированной методологии программирования, декомпозиция программы должна непосредственно отображать структуру прикладной предметной области, в которой выделяются вполне различимые сущности – объекты, обладающие индивидуальностью, проявляемой как их состояние и поведение.
Наряду с методологией разработки программных средств, важны и конкретные особенности языка программирования, поскольку по итогу конструкции должны быть выражены на определенном языке программирования.
Применение объектно-ориентированной методологии не ограничено каким-либо одним языком программирования – она применима к широкому спектру объектных и объектно-ориентированных языков. Объектно-ориентированная подход – основа объектно-ориентированной методологии программирования, и в настоящее время количество прикладных языков программирования, которые реализуют данную методологию, является наибольшим по сравнению с другими методологиями. [2, 13]
2.2. Понятие объектно-ориентированного программирования
Ренч однажды предсказал: «В 1980-х годах объектно-ориентированное программирование будет занимать такое же место, какое занимало структурное программирование в 1970-х. Оно всем будет нравиться. Каждая фирма будет рекламировать свой продукт как созданный по этой технологии. Все программисты будут писать в этом стиле, причем все по-разному. Все менеджеры будут рассуждать о нем. И никто не будет знать, что же это такое». [3]
На текущий момент нет точного определения объектно-ориентированного языка программирования. Разные авторы дают различное толкование основным терминам объектно-ориентированной методологии.
Г. Буч, главный исследователь корпорации Rational Software, дает следующее определение: «Объектно-ориентированное программирование – это метод реализации, в котором программы организуются в виде взаимодействующих наборов объектов, каждый из которых представляет собой экземпляр класса, а классы являются членами иерархии, связанной отношением наследования». [3]
Согласно этому определению не все языки программирования относятся к объектно-ориентированным. Б. Страуструп, создатель языка С++, утверждает: «Если написание программ в стиле объектно-ориентированного программирования требует специальных усилий или оно невозможно совсем, то этот язык не отвечает требованиям объектно-ориентированного программирования». [17]
Л. Карделли и П. Вегнер считают, что: «язык программирования является объектно-ориентированным тогда и только тогда, когда выполняются следующие условия:
- поддерживаются объекты, т.е. абстракции данных, которые имеют интерфейс в виде именованных операций и собственные данные, с ограничением доступа к ним;
- объекты относятся к соответствующим классам (типам);
- классы (типы) могут наследовать атрибуты суперклассов (супертипов)». [3]
Таким образом, объектно-ориентированный язык программирования можно определить, как язык программирования, в качестве базовых элементов которого выступают объекты, имеющие собственные параметры и именованные операции и образующие иерархически организованные классы объектов.
2.3. Виды объектно-ориентированных языков программирования
Язык Simula (1967 г.) считается общим предком большинства современных объектных и объектно-ориентированных языков. Язык Simula дополнил идеи языка ALGOL концепциями наследования и инкапсуляции. Simula привнес такие идеи, как: объекты, классы, виртуальные методы.
Новый взгляд на программирование, отличный от процедурного, предложили А. Кэй и Д. Ингаллс в языке Smalltalk (198 г.), в котором «класс» и «объект» стали основой для остальных конструкций языка. Именно Smalltalk считается первым широко известным объектно-ориентированным языком программирования, используемым для проектирования сложных графических интерфейсов. [2, 8]
Со временем объектно-ориентированное программирование стало доминирующей методологией программирования, в 1990-х гг. стали широко доступны поддерживающие ее языки программирования, такие как C++ и Delphi. Господство этой парадигмы базировалось на возрастании популярности графических интерфейсов пользователя, основанных на принципах объектно-ориентированного программирования.
Наиболее известными объектно-ориентированными языками программирования являются: Simula-67 (1967 г.); Smalltalk (1980 г.); C++ (1983 г.); Eiffel (1986 г.); Python (1990 г.); Java (1995 г.); Delphi (1995 г.); Perl 6 (2000 г.); C# (2001 г.); Scala (2003 г.). На рис. 15 изображена генеалогия наиболее популярных объектно-ориентированных языков программирования, в которой стрелками показано влияние одних языков на другие. [2, 13]
Рассмотрим некоторые виды объектно-ориентированных языков программирования.
Классификация по используемым моделям программирования:
- «Чистые» языки, использующие только одну модель программирования – объектно-ориентированную (например, Eiffel, Smalltalk).
- «Гибридные» языки, использующие при необходимости возможности нескольких парадигм программирования (например, C++, Delphi).
- «Урезанные» языки, появившиеся в результате удаления из гибридных языков наиболее опасных и ненужных с объектно-ориентированной точки зрения конструкций (например, Java, C#). [2, 9]
Рис. 15. Генеалогическая зависимость языков объектно-ориентированной
методологии
В работе Саундерса приводится обзор более 80 объектно-ориентированных языков, сгруппированных в 7 категорий (рис. 16). [3]
Рис. 16. Категории объектно-ориентированных языков по Саундерсу.
Классификация по основным механизмам исполнения языков программирования:
1) по принципу преобразования кода в программу:
- интерпретируемые языки;
- компилируемые языки;
2) по характеру типизации:
- языки со слабой типизацией;
- языки со строгой типизацией.
Из-за обилия языков программирования и их диалектов, которых в общей сложности насчитывается более 2500, и критериев классификации разработчику программных систем сложно объективно оценивать эффективность использования какого-либо языка программирования для решения поставленных задач, поэтому чаще всего выбор языка обоснован субъективными причинами, и как следствие – к нерациональному использованию одних языков и игнорированию других. В итоге программисты пишут менее эффективные и менее изящные программы, чем могли бы. [2, 8, 9]
Вывод по главе 2
Концептуальной базой объектно-ориентированной методологии является объектная модель, опирающаяся на четыре основных принципах: абстрагирование, инкапсуляция, полиморфизм и наследование. В ходе развития методологии объектно-ориентированного программирования возникли дополнительные принципы, не являющиеся обязательными: модульность, типизация, параллелизм, устойчивость.
Под объектно-ориентированном языком будем понимать язык программирования базовыми элементами, которого являются объекты, имеющие собственные параметры и именованные операции, а также образующие иерархически организованные классы объектов.
В настоящее время известно более 2500 объектно-ориентированных языков программирования, наиболее известные из них: Simula, Smalltalk, C++, Python, Java, Delphi, Perl, C и т.д.
3. Сферы применения объектно-ориентированного программирования
Прежде чем обозначить сферы применения методологии объектно-ориентированного программирования, рассмотрим основные достоинства и недостатки данной методологии.
Достоинства методологии объектно-ориентированного программирования
- Возможность абстрагирования от деталей реализации за счет использования классов, позволяющих осуществлять конструирование из полезных компонентов, имеющих простые инструменты.
- Повышение наглядности и удобства сопровождения программного обеспечения за счет локализация программного кода и данных, образующих определенную сущность.
- Модульность (за счет использования инкапсуляции), позволяющая реализовывать распараллеливание выполнения задачи между исполнителями и обновление версий отдельных компонентов.
- Расширяемость программной системы за счет использования новых компонентов без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе исполнения программы.
- Возможность обработки разнородных структур данных. Программный код упрощается за счет того, что программы могут работать, не различая вида объектов, причем новые виды объектов могут добавляться в любой момент.
- Возможность изменения поведения объекта на этапе исполнения: один объект может быть заменен на другой, поэтому можно адаптировать алгоритм даже без изменения кода.
- Возможность обобщения алгоритмов (за счет наследования) на несколько видов объектов. [2, 13]
- Возможность создания набора универсальных классов, независимых от предметной области, и расширяемых под специфику конкретного приложения.
- Многократное использование компонентов, позволяющее сократить время разработки программы и число допускаемых ошибок, а также упрощающее структуру и пользовательский интерфейс программной системы. [2, 8]