Файл: Основные понятия объектно-ориентированного программирования (Анализ существующих объектно-ориентированных сред разработки программ).pdf
Добавлен: 03.04.2023
Просмотров: 353
Скачиваний: 3
СОДЕРЖАНИЕ
Глава 1. Теоретические аспекты объектно-ориентированного программирования
1.1 Понятие объектно-ориентированного программирования
1.2 Основные принципы объектно-ориентированного программирования
1.3 Преимущества и недостатки объектно-ориентированного подхода
Глава 2. Анализ современных подходов к объектно-ориентированному программированию
2.1 Анализ существующих объектно-ориентированных сред разработки программ
Глава 3. Сравнительный анализ современных объектно-ориентированных языков программирования
1.3 Преимущества и недостатки объектно-ориентированного подхода
Начало использования объектного подхода к созданию программ – это середины 80-х годов 20-го века. Объектно-ориентированное программирование (ООП) можно описать как технологию создания сложных программных продуктов, которая базируется на использовании в программе совокупности объектов, каждый из которых принадлежит определенному типу (классу). Классы, существующие в программе, образуют иерархию с возможностью наследования свойств от базового класса. Взаимодействие объектов в программе происходит за счет передачи между ними сообщений.
Основное достоинство объектно-ориентированного подхода по сравнению с модульным программированием – понятная декомпозиция программной системы на составляющие ее элементы, и, следовательно, облегчение ее разработки и тестирования. Главным преимуществом объектно-ориентированного подхода можно считать принципиально новые способы организации программ, которые базируются на наследовании и полиморфизме. Это дает возможность повторного использования кодов, а кроме того, позволяет создавать библиотеки классов для их дальнейшего применения.
Достоинства ООП:
-
- При решении сложных и объемных задач классы помогают структурировать проект и абстрагироваться от ненужных деталей.
- Инкапсуляция привносит модульность, что позволяет распределить задачу между несколькими исполнителями и облегчает обновление отдельных элементов.
- Объектно-ориентированное программирование делает возможным конструирование расширяемых систем. Компоненты могут быть добавлены на любом этапе разработки.
- При обработке разнотипных структур данных программа может работать, не разделяя объекты на виды, что значительно упрощает код.
Большинство приложений в мире написано в традициях ООП (объектно-ориентированного программирования) и использует императивный код. Несмотря на то, что объектно-ориентированный подход очень популярен и прост для понимания, он не лишён своих недостатков.
Во-первых, в большинстве языков высокого уровня обработка ошибок реализована с помощью механизма исключений. Идея о том, что выполнение кода нужно прерывать, как только достигнуто некорректное состояние, хороша, но её реализация в виде выброса исключения и перехвата его в другом месте требует от коллектива программистов железной дисциплины. Иначе простая линейная цепочка вычислений превратится в древообразную, а то и в запутанный граф. Функциональная парадигма предоставляет абстракции для простой и прозрачной обработки ошибок.
Во-вторых, императивный код подобен тому, как человек представляет себе порядок каких-то действий. Такой подход очень хорош для описания последовательных вычислений, однако в современном мире большинство приложений асинхронные и многопоточные, и здесь уследить за взаимодействием императивного кода, выполняющегося во многих потоках, очень сложно. Наверное, каждый программист сталкивался с ситуациями, когда два потока пытаются изменить одно и то же значение, или же когда один поток ждёт другой поток, а тот, в свою очередь, ждёт первый?
В-третьих, не существует математически строгой, аксиоматизированной и пригодной к повседневному применению теории, описывающей паттерны проектирования и систему типов. Паттерны проектирования — это, конечно, большой шаг в сторону стандартизации способов проектирования, но и они — скорее сборник советов и указаний, нежели строгая теория. Исходя из этого, комбинируя паттерны, вы никогда с полной уверенностью не будете знать, что получите в итоге, если вы не делали этого ранее, что, в свою очередь, ведёт к разного рода «неожиданностям» при разработке.
К недостаткам ООП также можно отнести следующее:
-
- В сложных иерархиях классов поля и методы в большинстве случаев наследуются с различных уровней. Порой сложно определить методы и поля, которые относятся к данному классу. Чтобы получить такую информацию нужны специальные инструменты, называемые навигаторами классов.
- Злоупотребление инкапсуляцией приводит к сложностям расширения класса из-за скрытой логики и данных. Основным моментом является не то, что клиенту не разрешается знать о каких-либо данных, а то, что клиенту для работы с классом нет необходимости знать данные.
- Также инкапсуляция влияет на время выполнения программы.
Рисунок 2 – Преимущества и недостатки объектно-ориентированного подхода
Рекомендуется выполнять операции над данными через методы, а не предоставлять прямой доступ к полям класса. Такая схема приводит к необходимости выполнения процедурного вызова каждый раз при доступе к данным.
Три краеугольных камня ООП — наследование, инкапсуляция и полиморфизм — мощные средства/концепции, но также со своими недостатками.
Наследование способствует повторному использованию кода, но зачастую приходится брать больше, чем нужно.
Проблема объектно-ориентированных языков заключается во всей их неявной среде, которую они всегда тянут за собой. Вы хотели банан, а получили гориллу, держащую банан, вместе со всеми джунглями.
Если нам нужны классы, которые зависят от других классов, а те, в свою очередь, зависят от третьих, то нам придётся иметь дело со всем этим каскадом зависимостей, что сильно замедляет процессы сборки и отладки. К тому же приложения с такими длинными цепочками зависимостей плохо портируются.
Здесь присутствует проблема хрупкого базового класса. Не стоит ожидать, что всё будет идти как по маслу, когда мы соотносим реальные объекты и их классы. Наследование не будет снисходительно, когда придётся рефакторить код, особенно базовый класс. Также оно ослабляет инкапсуляцию, ещё один краеугольный камень ООП:
Проблема в том, что если вы наследуете реализацию суперкласса, а затем меняете её, то эти изменения отзываются эхом во всей иерархии классов. В конечном итоге это может повлиять на все подклассы.
Инкапсуляция защищает от влияния извне внутренние переменные каждого объекта. В идеале программа должна состоять из «островов объектов»: каждый из них со своими состояниями, передающий сообщения туда и обратно. Звучит как хорошая идея в том случае, если вы создаёте идеально распределённую систему, но на практике разработка такой программы сложна и вгоняет в определённые рамки.
Много реальных приложений требуют решения проблем с множеством составных частей. Когда вы выбираете объектно-ориентированный подход для разработки программы, вы столкнётесь с разными головоломками вроде «как распределить функциональность приложения между разными объектами?» или «как управлять взаимодействием и обменом данными между разными объектами?».
Когда мы рассматриваем необходимую функциональность нашего кода, многие из поведений по своей сути являются общими проблемами и потому не относятся к какому-то конкретному типу данных. Тем не менее, эти установки нужно куда-то пристроить, поэтому в итоге мы создаём бессмысленные классы для их содержания. У всех этих бессмысленных сущностей есть привычка становиться ещё более бессмысленными: когда у меня есть много объектов Manager, мне приходится создавать ManagerManager. Такие ManagerManager классы можно зачастую увидеть в продакшне, который по задумке не должен был стать настолько сложным с течением времени.
Полиморфизм позволяет описывать поведение вне зависимости от типа данных. В ООП это означает создание класса или прототипа, который может быть адаптирован объектами, работающими с другими типами данных. Объекты, которые используют полиморфный класс/прототип, должны определить специфичное для типа данных поведение, чтобы всё заработало. Посмотрим на пример.
Предположим, что мы хотим создать общий (полиморфный) объект, который принимает какие-то данные и флаг состояния в качестве параметров. Если состояние говорит, что данные валидные (т.е. status === true), на данных можно применить функцию, результат которой будет возвращён вместе с флагом состояния. В противном случае мы не применим функцию и просто вернём данные и флаг.
Таким образом, программистам часто приходится искать компромисс между повторным использованием кода и его масштабируемостью. Вероятно, использование классового ООП имеет смысл для корпоративного ПО, так как оно не сильно меняется. Поведение в ООП чётко прописано в абстрактных классах, но его можно в какой-то степени настроить во время создания экземпляров класса. Это способствует лучшему повторному использованию кода, что экономит разработчикам много времени. Тем не менее, если ожидается, что в будущем много раз придётся дополнять код и даже пересматривать проект, тогда ООП в итоге будет мешать продуктивности разработчика и код станет нетестируемым и сильно связанным со средой.
Глава 2. Анализ современных подходов к объектно-ориентированному программированию
2.1 Анализ существующих объектно-ориентированных сред разработки программ
Развитие объектно-ориентированного подхода в технологии программирования подтолкнуло развитие сред визуального программирования.
Примеры объектно-ориентированных языков:
-
- Pascal. С выходом Delphi 7 на официальном уровне стал называться Delphi. Основная область использования Object Pascal - написание прикладного ПО.
- C++ широко используется для разработки программного обеспечения, является одним из самых популярных языков. Применяется для создания ОС, прикладных программ, драйверов устройств, приложений, серверов, игр.
- Java - транслируется в байт-код, обрабатывается виртуальной машиной Java. Преимуществом такого способа выполнения является независимость от операционной системой и оборудования. Существующие семейства: Standard Edition, Enterprise Edition, Micro Edition, Card.
- JavaScript применяется в качестве языка сценариев для web-страниц. Синтаксис во многом напоминает Си и Java. Является реализацией Ecmascript. Сам Ecmascript используется в качестве основы для построения других скриптовых языков, таких как JScript, ActionScript.
- Objective-C построен на основе языка Си, а сам код Си понятен компилятору Objective-C.
- Perl - высокоуровневый интерпретируемый динамический язык общего назначения. Имеет богатые возможности для работы с текстом, изначально разработан именно для манипуляций с текстом. Сейчас используется в системном администрировании, разработке, сетевом программировании, биоинформатике и т. д.
- PHP. Аббревиатура переводится как препроцессор гипертекста. Применяется для разработки веб-приложений, в частности серверной части. С его помощью можно создавать gui-приложения с помощью пакетов PHP-GTK, PHP-Qt, WinBinder.
- Python - язык общего назначения, ориентирован на повышение производительности разработчика и читаемость кода. Был разработан проект Cython, с помощью которого осуществляется трансляция программ, написанных на Python в код на языке Си.
Рисунок 3 – Наиболее распространенные среды разработки
ООЯ обязательно содержит набор следующих элементов: объявление классов с полями, методами; расширение за счет наследования функций; полиморфное поведение. Кроме вышеперечисленного списка, могут быть добавлены дополнительные средства: конструктор, деструктор, финализаторы; свойства; индексаторы; модификаторы доступа.
2.2 Анализ существующих способов сравнения объектно-ориентированных сред разработки
Проанализируем существующие способы сравнения объектно-ориентированных сред разработки:
-
- Статическая типизация
- Динамическая типизация
- Явная типизация
- Неявная типизация
- Неявное приведение типов в неоднозначных ситуациях
- Шаблоны
- Неуправляемые указатели
- Ручное управление памятью
- Сборка мусора
Выбирая язык программирования нужно опираться на такие его характеристики, как: область применения, трудность изучения, распространённость и будущие перспективы.
Глава 3. Сравнительный анализ современных объектно-ориентированных языков программирования
3.1 Обоснование выбора различных сред
Проведем сравнительный анализ языков программирования: Delphi, Python, C++, C#, Java.
Краткая характеристика каждого языка программирования представлена в таблице 3.1.
|
№ |
Название |
Назначение |
Основные особенности |
|---|---|---|---|
|
1 |
Python |
Высокоуровневый язык программирования общего назначения, ориентированный на повышение производительности разработчика и читаемости кода. Синтаксис ядра Python минималистичен. В то же время стандартная библиотека включает большой объём полезных функций. |
Python поддерживает несколько парадигм программирования, в том числе структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное. Основные архитектурные черты — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных. |
|
2 |
C++ |
Компилируемый, статически типизированный язык программирования общего назначения. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов. |
Широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. |
|
3 |
C# |
Разработка .NET приложений, кроссплатформенных программ. |
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML. |
|
4 |
Java |
Сильно типизированный объектно-ориентированный язык программирования. Удобен при разработке мобильных приложений, кроссплатформенных программ |
Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, с помощью виртуальной Java-машины |
|
5 |
Delphi |
Императивный структурированный объектно-ориентированный язык программирования со строгой статической типизацией переменных. Основная область использования — написание прикладного программного обеспечения. |
При создании языка (и здесь качественное отличие от языка C) не ставилась задача обеспечить максимальную производительность исполняемого кода или лаконичность исходного кода для экономии оперативной памяти. |