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

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

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

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

Добавлен: 31.03.2023

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

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

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

Чтобы решить эти проблемы, ряд исследователей пытались разработать новые языки программирования, которые использовали бы объектно-ориентированные концепции, но при этом сохранили многие функции, которые были необходимы программистам. Одним из примеров языка программирования, который в какой-то степени достиг этого, является Eiffel. Другим языком программирования, который пытался решить эту проблему, является Java. Она стала популярной, потому что она использует виртуальную машину, и она очень похожа на C++ и C. Виртуальная машина важна, потому что она позволяет запускать код на нескольких платформах без необходимости изменения. Другая похожая система — это Microsoft .NET. Многие разработчики теперь понимают важность ООП и активно используют его в своих программах. Многие исследователи продолжают делать успехи, используя объектно-ориентированный подход.

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

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

2.3 Эволюция методологии и сферы применения

Сегодня существует достаточное количество объектно-ориентированных языков программирования, наиболее популярными из которых в настоящее время являются C++, Delphi, Java, Visual Basic, Flash. Но, кроме того, многие языки, которые принято причислять к процедурной парадигме, тоже обладают свойствами ООП, имея возможность работать с объектами. Так, объектно-ориентированное программирование в C — это большой раздел программирования на данном языке, то же самое касается ООП в python и многих других структурных языках.

Язык программирования Smalltalk, разработанный Аланом Ки, принес популярность ООП. Главной особенностью Smalltalk является то, что все переменные являются объектами, которые взаимодействуют между собой при передаче сообщений. Связанные по наследованию классы хранятся в дереве классов. При этом любой класс является объектом более высокой степени, чем учебный класс. Написание программы на Smalltalk — это последовательное изменение состояния ее объектов. Использование компиляции, механизма переводящего в байт-код делает реализацию программы возможной на другой аппаратной форме, но только на тех платформах, где поддерживается виртуальная машина Smalltalk. В то же время, у Smalltalk есть и некоторые противоречия. Специалистам с большим опытом освоения программирования сложно освоить Smalltalk. В то же самое время людей, которые не имеют большого опыта программирования учат этот язык быстрее. Таким образом, сокращается время на изучение языка специалистами с небольшим опытом, в то же время для обучение специалистам с большим опытом программирования на других языках недопустимо увеличивается. Это касается в целом многих ООП языков.


Противоречие было разрешено в C++ с помощью принципа гомогенности. C + был создан на основе С. Таким образом осуществился следующий этап развития ООП. Этот язык был создан Б.Страуструпом в 1983 году. [14]

C++ предоставляет набор интегрированных классов и возможность объявлять новые типы разработчиками. Классы могут наследовать один или несколько классов, обеспечивая одинаковое и многократное наследование, соответственно. В C++ есть возможность описания параметризованных классов и функций (шаблонов) и возможность описания исключений. Но также есть ряд противоречий в C++. Использование множественного наследования порождает проблемы, связанные с неопределенностью выбора между методами, имея такие же имена, из чистых классов. Например, мы вызываем метод Show() для объекта, и такой же метод в классе, но есть такие методы в родительских классах. Таким образом, возникает противоречие, которое ранее было не так-то просто решить. Из-за отсутствия идентификации между конструкциями начала и конца читаемость программного кода снижается, т.е. с увеличением количества программного кода читабельность кода недопустимо уменьшается. Следствием того факта, что C++ на тот момент не имел собственных библиотека и развивался долгое время изолированно. Но после, его развитию, как-раз послужило именно наличие большого количества библиотек для выполнения одних и тех же операций. Однако иногда трудно найти хорошую библиотеку для какой-то цели, т.е. с увеличением количества внешних библиотек эффективность ее использование уменьшается. На эйфелевом языке с использованием принципа предварительного действия были введены специальные операторы. Они помогают объявлять правила выбора методов при использовании множественного наследования. [17]

Определенные противоречия C++ были разрешены в Python. Используя некоторые принципы и предварительные действия в язык добавлен алгоритм линеаризации суперкласса. Алгоритм устанавливает порядок методов и выбор, когда мы используем наследование. В то же время, есть возможность переопределить этот вариант путем переопределения. Использование принципов извлечения и однородность некоторых синтаксических конструкций были исключены, в частности конструкции, обозначенные начало и конец процедуры.

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

В Java, использующей принцип частичных или чрезмерных действий, была добавлена ​​возможность объявления интерфейса (интерфейс определяет методы и атрибуты, которые должны реализовывать реализующие классы). Это решение позволяет получение многих преимуществ множественного наследования без полной реализации. В Java использовался принцип выведения множества небезопасных и узконаправленных функций C++ в то же время, используя принцип однородности Java синтаксиса из C++, который сокращает время для освоения языка. В Delphi, используется принцип предварительного действия таблицы виртуальных методов (VMT), завершающейся перед конструктором. Это позволяет исключить проблемы, связанные с вызовом виртуальных методов, таких как в C ++. [19]


В Perl 6 с использованием принципа универсальности был добавлен новый механизм — роли (черты). Роль позволяет моделировать как поведение интерфейса, указывающее необходимые для роли методы и атрибуты (спецификация) как методы реализация внутри роли. Это помогает использовать один раз написанный код многократно.

В C# основаны принципы самообслуживания и частичных или чрезмерных действий. Этот язык пытается скрыть как можно больше технических подробностей от разработчика программы, включая все управление. Благодаря этому, программист, используя C#, может сосредоточиться на содержании проблемы лучше, чем на реализации. В то же время разработчик может управлять памятью в режиме «небезопасного» кода, если это необходимо. Также, используя этот принцип заранее добавлена ​​возможность смягчения указывания имени интерфейса для методов с похожими именами, и объявление различных реализаций для этих методов.

Язык программирования Scala, использующий принцип гомогенности, был основан на платформе Java, которая обеспечивает не только кроссплатформенность, но позволяет использовать в разработке программ модули, написанные на Java.

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

Таким образом, были следующие этапы в эволюции ООП:

Первый этап. Базовый язык Simula-67, наследник языка - Smalltalk и C++, который является основой для следующего этап. [20]

Второй этап Базовый язык C++, наследственные языки Eiffel (одновременно является наследником Simula-67), Python, Delphi, Java, который является основой для следующего этапа.

Третий этап. Базовый язык Java, наследственные языки - Perl 6, PHP, C#, Scala.

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

С 1990-х гг. ООП развивается как методологическое основание технологий программирования, ориентированных на значительное повышение производительности совместных разработок коллективами программистов. Непрерывно растёт область применения ООП, прирастает семейство языков, совершенствуются системы программирования, увеличивается число программных продуктов различного назначения, разработанных на языках ООП.


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

3. Основные принципы ООП

3.1 Абстракция

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

Рисунок 2 — Пример абстракции

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

Абстракция данных — популярная и в общем неверно определяемая техника программирования. Фундаментальная идея состоит в разделении несущественных деталей реализации подпрограммы и характеристик существенных для корректного ее использования. Такое разделение может быть выражено через специальный «интерфейс», сосредотачивающий описание всех возможных применений программы. [17]

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

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

Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.

Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.

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


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

  • предельная локализация изменений при необходимости таких изменений,
  • прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений. [17]

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

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

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

Простое наследование: класс, от которого произошло наследование, называется базовым или родительским (англ. base class). Классы, которые произошли от базового, называются потомками, наследниками или производными классами (англ. derived class). [16]

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

При множественном наследовании у класса может быть более одного предка. В этом случае класс наследует методы всех предков. Достоинства такого подхода в большей гибкости. Множественное наследование реализовано в C++. Из других языков, предоставляющих эту возможность, можно отметить Python и Эйфель. Множественное наследование поддерживается в языке UML.

Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов. Практически всегда можно обойтись без использования данного механизма. Однако, если такая необходимость все-таки возникла, то, для разрешения конфликтов использования наследованных методов с одинаковыми именами, возможно, например, применить операцию расширения видимости — «::» — для вызова конкретного метода конкретного родителя. [5]