Классы и объектно-ориентированное программирование



Занятие 5. Объектно-ориентированное программирование. Введение

 

Объекты из мира реальных и мира нереальных объектов

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

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

В мире программирования долгое время дела обстояли абсолютно другим образом. По причине крайне ограниченных ресурсов первых компьютеров – в основном быстродействия процессора и объема памяти – программирование начиналось с обработки весьма незначительного набора характеристик каких-то объектов в абсолютном отрыве от их поведения. Ранние расчеты на компьютерах это a + b, интегралы и дифференциальные уравнения. Возможно, это реальные a и b каких-то реальных объектов реального мира, но это всего лишь характеристики без поведения. А объекты без поведения – это объекты, которые сами ничего сделать не могут. Мы должны взять каждый из этих объектов за руку – имя (указатель, ссылку) – и куда-то отвести. Какие-то совсем беспомощные объекты нереального мира.

Другой причиной, обусловившей работу с характеристиками объектов без их поведения на начальных этапах развития дисциплины программирования, явились предметные области для которых разрабатывались первые языки программирования: ассемблер – облегчение работы с машинным кодом, FORTRAN – расчет формул, COBOL – экономические расчеты, С (си) – проектирование операционных систем. Вышеперечисленные языки достаточно хорошо справлялись с задачами своей предметной области и часто очень плохо с задачами других предметных областей.

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

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

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

Классы и объектно-ориентированное программирование

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

Необходимо обратить внимание на следующие важные части этого определения:

1) объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;

2) каждый объект является экземпляром определенного класса;

3) классы образуют иерархии.

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

Основные понятия

Абстракция данных

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

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

Инкапсуляция — свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе. Некоторые языки (например, С++) отождествляют инкапсуляцию с сокрытием, но большинство (Smalltalk, Eiffel, OCaml) различают эти понятия.

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

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

Полиморфизм

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

Класс

Можно сказать, что класс – это своего рода чертеж объекта. Фактически, класс описывает устройство объекта. Так же для определения класса мы можем подобрать такие слова как схема или тз (техзадание) объекта. Здесь подходит такое сравнение: как при выполнении проекта разработчик руководствуется техзаданием на проект, так и при создании объекта класс используется как схема, по которой этот объект будет строится транслятором.

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

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

Объект

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

Объект первого класса

Объектами первого класса (англ. first-class object, first-class entity, first-class citizen) в контексте конкретного языка программирования называются элементы, которые могут быть переданы как параметр, возвращены из функции, присвоены переменной.

Объект называют «объектом первого класса», если он:

· может быть сохранен в переменной или структурах данных;

· может быть передан в функцию как аргумент;

· может быть возвращен из функции как результат;

· может быть создан во время выполнения программы;

· внутренне самоопознаваем (независим от именования).

Термин «объект» используется здесь в общем смысле, и не ограничивается объектами языка программирования. Так значения простейших типов данных, например, integer и float, во многих языках являются «объектами первого класса».

Интроспекция

Интроспекция (англ. type introspection) в программировании — возможность в некоторых объектно-ориентированных языках определить тип и структуру объекта во время выполнения программы. Эта возможность имеется во всех языках, позволяющих манипулировать типами объектов как объектами первого класса.

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

Применение интроспекции является важной частью того, что называют pythonic style, и широко применяется в библиотеках и фреймворках Python, таких как PyRO, PLY, Cherry, Django и др., значительно экономя время использующего их программиста.

История

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

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

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

Первым языком программирования, в котором были предложены основные понятия, впоследствии сложившиеся в парадигму, была Симула, но термин «объектная ориентированность» не использовался в контексте использования этого языка. В момент его появления в 1967 году в нём были предложены революционные идеи: объекты, классы, виртуальные методы и др., однако это всё не было воспринято современниками как нечто грандиозное. Фактически, Симула была «Алголом с классами», упрощающим выражение в процедурном программировании многих сложных концепций. Понятие класса в Симуле может быть полностью определено через композицию конструкций Алгола (то есть класс в Симуле — это нечто сложное, описываемое посредством примитивов).

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

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

Определение ООП

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

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

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

 


Дата добавления: 2020-01-07; просмотров: 259; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!