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

Основные понятия объектно-ориентированного программирования (Основные понятия объектно-ориентированного программирования)

Содержание:

Введение

Одна из целей программирование – разработка алгоритма. В ходе развития программирования сформировалось два основных подхода – процедурный и объектно-ориентированный.

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

1) Объекты – базовые элементы программы. Но не алгоритмы, как в случае с процедурным программированием;

2) Объект является экземпляром класса;

3) Классы организованы иерархически.

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

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

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

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

1. Основные понятия объектно-ориентированного программирования

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

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

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

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

2. Объект - как базовое понятие в объектно-ориентированном программировании

Понятие объект представимо как ряд определений. Рассмотрим подробнее эти определения с целью понять основопологающее понятие парадигмы объектно-ориентированного программирования.

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

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

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

Выделим следующие типы операций:

- конструктор, создание и инициализация объекта;

- деструктор, разрушение объекта;

- модификатор, изменение состояние объекта;

- селектор для доступа к переменным объекта без их изменения;

- итератор для доступа к содержанию объекта по частям в определенной последовательности.

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

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

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

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

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

- активного или воздействующего объекта, когда он воздействует на другие объекты, но сам воздействию не подвергается;

- пассивного или исполняющего, когда объект подвергается воздействию, но сам на другие объекты не воздействует;

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

Отношение включения имеет место, когда составной объект содержит другие объекты.

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

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

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

2.1 Первый принцип объектно-ориентированного программирования - ИНКАПСУЛЯЦИЯ

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

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

В частности, типы: классы, интерфейсы, структуры, перечисления, делегаты.А также их члены: свойства, методы, конструкторы, поля, которые определяются с использованием определенного ключевого слова модификатора доступа, управляющего «видимостью» элемента другим частям приложения.

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

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

2.2 Второй принцип объектно-ориентированного программирования - НАСЛЕДОВАНИЕ

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

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

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

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

2.3 Третий принцип объектно-ориентированного программирования - ПОЛИМОРФИЗМ

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

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

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

2.4 Абстракция

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

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

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

2.5 Интерфейс

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

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

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

Интерфейса состоит из двух частей: имени и методов интерфейса. Имя интерфейса строится правилам, по которым строятся и другие идентификаторы используемого языка программирования. Языки и среды разработки имеют различные правила и синтаксис по написанию и формлению кода. В соответствии с этим имена интерфейсов могут формироваться по правилам, позволяющим отличать имя интерфейса от имён других элементов.

2.6 Методы

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

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

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

2.7 Понятие класса

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

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

Использование иерархии классов вводит необходимость абстракции. По мере продвижения вверх по иерархии классы становятся более абстрактными.

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

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

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

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

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

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

Между классами также могут быть установлены отношения:

- отношение разновидности (попугай - вид определенного биологического семейства или попугай - домашнее животное);

- включения или составной части (клюв - часть попугая);

- ассоциативности, когда между классами есть чисто смысловая связь (попугаи и хомячки - домашние животные).

3. Процесс объектно-ориентированного проектирования

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

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

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

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

Декомпозиция в объектно-ориентированное проектировании и отличает его от структурного. Логическая структура системы отражается абстракциями в виде классов и объектов в случае объектно-ориентированного проектирования. Алгоритмами же в случае структурного проектирования.

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

Декомпозиция осуществляет роль разделения сложной проектируемой системы на меньшие подсистемы. И каждую из подсистем можно совершенствовать независимо. В таком случае упрощается понимание и появляется возможность сконцентриваться работая над частями системы.

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

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

4. Объектно-ориентированные языки

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

С течением времени акцент в программировании смещался в сторону организации структур данных. При разработке более сложного программного обеспечения более ощущалась необходимость в способах контроля правильности использования данных. И на стадии компиляции и при тестировании необходим повышенный котроль, иначе осложняется создание крупных программных продуктов. Это закономерно привело к появлению новых языков программирования - Алгола-60, а позже Паскаля, Модулы-2, Си и множества других языков программирования. Все эти языки имели более или менее развитые структуры типов данных. Как следствие, возник модульный подход к разработке программ, при котором «прячутся» данные и процедуры внутри модуля.

Позже, с изобретения языка Симула-67, в программировании наметился новый подход, который получил название объектно-ориентированного программирования, где основной идеей является объединение данных и обрабатывающих их процедур в единое целое – объекты

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

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

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

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

Объектно-ориентированное программирование в настоящее время является абсолютным лидером в области прикладного программирования. Как пример, такие распространненные языки программирования, как Java, C#, C++, JavaScript и др. Однако, в области системного программирования до сих пор лидирует парадигма процедурного программирования. Основным языком программирования является язык C. Но, при взаимодействии системного и прикладного уровней операционных систем, существенное распространено влияние языков объектно-ориентированного программирования. Например, мультиплатформенным стандартом стала система Qt, написанная на языке C++.

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

Первым языком программирования, в котором были предложены принципы объектной ориентированности, была Симула. В момент своего появления (в 1967 году), этот язык программирования предложил поистине революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Тем не менее, большинство концепций были развиты Аланом Кэйем и Дэном Ингаллсом в языке Smalltalk. Именно он стал первым широко распространённым объектно-ориентированным языком программирования.

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

Java (и его клон C#) является чистым объектно-ориентированным языком (как Eiffel и Smalltalk). На первый взгляд это кажется положительной идеей. Однако она ведет к тому, что используется множество статических методов и статических данных, что не так уж отличается от использования глобальных функций и данных, за исключением более сложного синтаксиса. Чистые объектно-ориентированные языки дают преимущество новичкам в объектно-ориентированном программировании, потому что программист вынужден использовать (и учить) модель объектно-ориентированного программирования. C++ и Object Pascal, наоборот, - типичные примеры гибридных языков, которые позволяют программистам использовать при необходимости традиционный подход C или Pascal.

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

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

Переняв многое от своих предшественников – языков C++, Pascal, 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# [2].

C# – объектно-ориентированный язык программирования. Разработан 1998-2001 годах группой инженеров под руководством Андерса Хейлсберга в компании «Microsoft» как язык разработки приложений для платформы Microsoft.NET Framework.

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

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

Java – объектно-ориентированный язык программирования, разработанный компанией «Sun Microsystems» (в последующем приобретённой компанией «Oracle»). Приложения Java обычно транслируется в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине вне зависимости от компьютерной архитектуры. Дата официального выпуска – 23 мая 1995 года.

Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

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

Часто к недостаткам концепции виртуальной машины относят снижение производительности. Ряд усовершенствований несколько увеличил скорость выполнения программ на Java:

− применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде;

− широкое использование платформенно-ориентированного кода (native-код) в стандартных библиотеках;

− аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).

Идеи, заложенные в концепцию и различные реализации среды виртуальной машины Java, вдохновили множество энтузиастов на расширение перечня языков, которые могли бы быть использованы для создания программ, исполняемых на виртуальной машине. Эти идеи нашли также выражение в спецификации общеязыковой инфраструктуры CLI, заложенной в основу платформы.NET компанией «Microsoft»

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

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

Эталонной реализацией Python является интерпретатор CPython, поддерживающий большинство активно используемых платформ. Он распространяется под свободной лицензией Python Software Foundation License, позволяющей использовать его без ограничений в любых приложениях, включая проприетарные. Есть реализации интерпретаторов для JVM (с возможностью компиляции), MSIL (с возможностью компиляции), LLVM и других. Проект PyPy предлагает реализацию Python с использованием JIT-компиляции, которая значительно увеличивает скорость выполнения Python-программ.

Python — активно развивающийся язык программирования, новые версии (с добавлением/изменением языковых свойств) выходят примерно раз в два с половиной года. Вследствие этого и некоторых других причин на Python отсутствуют стандарт ANSI, ISO или другие официальные стандарты, их роль выполняет CPython.

В свете вышесказанного, можно сделать вывод, что язык программирования имеет в том числе и парадигму объектно-ориентированного, если :

- он поддерживает абстрактные типы данных (объекты с определенным интерфейсом и скрытым внутренним состоянием);

- объекты имеют связанные с ними типы (классы);

- поддерживается механизм наследования.

5. Простая объектная модель и ссылочно-объектная модель

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

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

6. Языки программирования и программное окружение

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

Преимущество C++ - мощность и контроль за счет сложности. Преимущество Delphi является легкое, визуальное и прочная связь с Windows. Преимущество Java - мобильность, даже за счет некоторого отказа от скорости, и распределённые приложения или исполняемое содержание.

Заключение

На данный момент сложилось множество парадигм программирования. В свое время процедурное программирование сменилось структурным программированием, а затем и модульным. Объектно-ориентированное программирование возникло в результате развития идеологии процедурного программирования. В настоящее время количество прикладных языков программирования, реализующих объектно-ориентированную парадигму, является наибольшим по отношению к другим парадигмам. Наиболее распространённые в промышленности языки (С++, Delphi, C#, Java и др.) воплощают объектную модель Симулы. Примерами языков, опирающихся на модель Смолтока, являются Objective-C, Python, Ruby

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

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

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

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

Список литературы

  1. Бадд, Т. Объектно-ориентированное программирование в действии / Т. Бадд. - СПб.: Питер, 2011. - 464 с.
  2. Богатырев Р. Природа и эволюция сценарных языков // МИР ПК - ДИСК. - 2011. - № 10.
  3. Лутц, М. Изучаем Python / М. Лутц; пер. с англ. А. Киселев. - 4-е изд. - СПб.: Символ-Плюс, 2011. - 1280 с.
  4. Себеста, Р.У. Основные концепции языков программирования / Р.У. Себеста. - 5-е изд. - М.: Издательский дом «Вильямс», 2011. - 672 с.
  5. Страуструп, Б. Дизайн и эволюция С++ / Б. Страуструп. - СПб.: ДМК Пресс, 2010. - 445 с.
  6. Биллиг В.А. Основы программирования на C# . Интернет-университет информационных технологий - ИНТУИТ.ру, 2006
  7. Объектно-ориентированное программирование на языке С++: учеб. по-собие / Ю.А. Луцик., В.Н. Комличенко . - Минск: БГУИР, 2007. - 264 с.: ил. ISBN 978-985-488-242-0
  8. Иан Грэхем Объектно-ориентированные методы. Принципы и практика = Object-Oriented Methods: Principles & Practice. — 3-е изд. — М.: «Вильямс», 2004. — С. 880.
  9. Бертран Мейер Объектно-ориентированное конструирование программных систем + CD . Интернет-университет информационных технологий - ИНТУИТ.ру, Русская Редакция, 2005